삼각함수는 삼각형의 제한된 정보를 바탕으로 다른 정보를 구하는 수학적 도구입니다. 삼각함수는 직각삼각형의 변의 비율과 관련 있으며, 이를 통해 길이나 각도를 구하는 데 유용합니다.
단위 원은 반지름이 1인 원으로 삼각함수의 변화를 시각적으로 이해하는 데 유용합니다.
각도는 두 가지 방법으로 측정됩니다:
cos와 sin의 성질:
삼각함수를 활용하여 슈팅 게임의 발사 각도를 계산:
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: 삼각함수 기반으로 포신 끝 위치 계산.생성자와 소멸자
Init 함수
void Player::Init() {
_stat.hp = 100; // 체력
_stat.maxHp = 100; // 최대 체력
_stat.speed = 500.0f; // 이동 속도
_pos.x = 400; // 초기 x 좌표
_pos.y = 500; // 초기 y 좌표
}
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: 포신 각도 회전.GetFirePos 함수
Pos Player::GetFirePos() {
Pos firePos = _pos;
firePos.x += _barrelLength * ::cos(_barrelAngle);
firePos.y -= _barrelLength * ::sin(_barrelAngle);
return firePos;
}
포인트:
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; // 미사일 각도
};
Update 함수
void Missile::Update() {
float deltaTime = GET_SINGLE(TimeManager)->GetDeltaTime();
_pos.x += _stat.speed * deltaTime * ::cos(_angle);
_pos.y -= _stat.speed * deltaTime * ::sin(_angle);
}
포인트:
충돌 처리
if (dist < 25) {
GET_SINGLE(ObjectManager)->Remove(object);
GET_SINGLE(ObjectManager)->Remove(this);
}
포인트:
dist)를 계산하여 충돌 여부를 판단.범위 초과 삭제
if (_pos.y < -100) {
GET_SINGLE(ObjectManager)->Remove(this);
}
포인트: