1. 삼각함수 기초

a. 삼각함수를 알아야 하는 이유

삼각함수는 삼각형의 제한된 정보를 바탕으로 다른 정보를 구하는 수학적 도구입니다. 삼각함수는 직각삼각형의 변의 비율과 관련 있으며, 이를 통해 길이나 각도를 구하는 데 유용합니다.


b. 삼각함수의 기초: 피타고라스 정리

  • 피타고라스 정리: ( c2=a2+b2c^2 = a^2 + b^2 ) (직각삼각형에서 빗변의 제곱은 나머지 두 변의 제곱의 합과 같습니다.)
  • 삼각함수는 결국 변의 비율을 다루는 것으로, 피타고라스 정리는 이러한 비율 계산의 기초입니다.

c. 단위 원 (Unit Circle)

  1. 단위 원은 반지름이 1인 원으로 삼각함수의 변화를 시각적으로 이해하는 데 유용합니다.

  2. 각도는 두 가지 방법으로 측정됩니다:

    • 각도법: ( 360^\circ ) 단위
    • 호도법: 라디안(단위 원에서 호의 길이에 따른 각도)
  3. cossin의 성질:

    • ( cos(θ)=cos(θ)\cos(-\theta) = \cos(\theta) ): 코사인은 우함수.
    • ( sin(θ)=sin(θ)\sin(-\theta) = -\sin(\theta) ): 사인은 기함수.
    • 주요 항등식: ( cos2θ+sin2θ=1\cos^2\theta + \sin^2\theta = 1 )

2. 게임에서 삼각함수 사용

a. 슈팅 게임에서 적용

삼각함수를 활용하여 슈팅 게임의 발사 각도를 계산:

  • x축 변화량: ( cos(θ)\cos(\theta) )
  • y축 변화량: ( sin(θ)\sin(\theta) )
  • 포신의 방향에 따라 미사일이 정확히 발사됩니다.

b. 포신의 정보 생성

  1. 포신은 플레이어가 관리하며, 각도와 길이를 정의.
  2. 포신은 키 입력(Q, E)에 따라 회전:
    • Q: 각도를 증가.
    • E: 각도를 감소.

c. 포신 출력 및 색상 변경

  • 포신을 시각적으로 출력하고 색상만 변경하여 시각적 구분을 제공합니다.

d. 각도에 따라 미사일 발사

  • 미사일은 포신의 위치와 각도를 기반으로 생성.
  • 미사일의 이동은 삼각함수를 활용하여 업데이트:
    • ( x ): ( x += cos(θ)\cos(\theta) )
    • ( y ): ( y -= sin(θ)\sin(\theta) )

코드 분석


Player.h

class Player : public Object {
public:
    Player(); // 플레이어 객체 생성자
    virtual ~Player(); // 소멸자

    virtual void Init() override; // 초기화 함수
    virtual void Update() override; // 매 프레임 업데이트 함수
    virtual void Render(HDC hdc) override; // 화면에 출력

    Pos GetFirePos(); // 포신 끝 위치를 반환하는 함수

public:
    float _barrelAngle = 0.f; // 포신 각도 (라디안 단위)
    float _barrelLength = 100.f; // 포신 길이
};

설명:

  • _barrelAngle: 포신의 각도.
  • _barrelLength: 포신의 길이.
  • GetFirePos: 삼각함수 기반으로 포신 끝 위치 계산.

Player.cpp

  1. 생성자와 소멸자

    • 생성자: 플레이어 객체를 생성.
    • 소멸자: 자원 해제.
  2. Init 함수

    void Player::Init() {
        _stat.hp = 100; // 체력
        _stat.maxHp = 100; // 최대 체력
        _stat.speed = 500.0f; // 이동 속도
        _pos.x = 400; // 초기 x 좌표
        _pos.y = 500; // 초기 y 좌표
    }
  3. Update 함수

    void Player::Update() {
        float deltaTime = GET_SINGLE(TimeManager)->GetDeltaTime();
        if (GET_SINGLE(InputManager)->GetButton(KeyType::A)) {
            _pos.x -= _stat.speed * deltaTime; // 왼쪽 이동
        }
        if (GET_SINGLE(InputManager)->GetButton(KeyType::D)) {
            _pos.x += _stat.speed * deltaTime; // 오른쪽 이동
        }
        if (GET_SINGLE(InputManager)->GetButton(KeyType::Q)) {
            _barrelAngle += 10 * deltaTime; // 포신 각도 증가
        }
    }

    포인트:

    • deltaTime: 시간에 따라 이동 거리 조정.
    • Q, E: 포신 각도 회전.
  4. GetFirePos 함수

    Pos Player::GetFirePos() {
        Pos firePos = _pos;
        firePos.x += _barrelLength * ::cos(_barrelAngle);
        firePos.y -= _barrelLength * ::sin(_barrelAngle);
        return firePos;
    }

    포인트:

    • 포신 끝 위치를 삼각함수로 계산:
      • ( x = x + \text{길이} \times \cos(\theta) )
      • ( y = y - \text{길이} \times \sin(\theta) )

Missile.h

class Missile : public Object {
public:
    Missile();
    virtual ~Missile();

    virtual void Init() override;
    virtual void Update() override;
    virtual void Render(HDC hdc) override;

    void SetAngle(float angle) { _angle = angle; } // 미사일 각도 설정
protected:
    float _angle = 0.f; // 미사일 각도
};

Missile.cpp

  1. Update 함수

    void Missile::Update() {
        float deltaTime = GET_SINGLE(TimeManager)->GetDeltaTime();
        _pos.x += _stat.speed * deltaTime * ::cos(_angle);
        _pos.y -= _stat.speed * deltaTime * ::sin(_angle);
    }

    포인트:

    • 미사일의 위치를 삼각함수를 이용하여 갱신.
    • ( x=x+속도×cos(θ)×시간x = x + \text{속도} \times \cos(\theta) \times \text{시간} )
    • ( y=y속도×sin(θ)×시간y = y - \text{속도} \times \sin(\theta) \times \text{시간} )
  2. 충돌 처리

    if (dist < 25) {
        GET_SINGLE(ObjectManager)->Remove(object);
        GET_SINGLE(ObjectManager)->Remove(this);
    }

    포인트:

    • 두 객체의 거리(dist)를 계산하여 충돌 여부를 판단.
  3. 범위 초과 삭제

    if (_pos.y < -100) {
        GET_SINGLE(ObjectManager)->Remove(this);
    }

    포인트:

    • 화면 밖으로 나간 미사일은 삭제.

profile
李家네_공부방

0개의 댓글