게임엔진/윈도우API

윈도우API)7. 삼각함수

PJNull 2022. 12. 18.
728x90
반응형

삼각함수

 

삼각함수는 게임에서 굉장히 중요한 이론이다. 삼각함수에 대해서는 예전에 포스팅한것이 있으니 그것을 참고하면 도움이 될것이라 생각된다.

 

게임수학) Chapter1. 삼각함수

삼각형은 꽤나 오래전부터 연구되어온것중 하나이다. 게임에서도 이러한 삼각형의 성질을 이용해서 콘텐츠를 제작하는데, 그중에서 삼각함수에 대해 알아보려고 한다. 삼각함수 모든 삼각함수

pjnull.tistory.com

 

그렇다면 이러한 이론을 바탕으로 현재 진행하고있는 윈도우API에 어떻게 적용할수 있을까?

 

구현할 목표

 

Fps와 같은 게임에서는 총이 캐릭터에서 나오는것이 아니라 총구에서 발사된다. 현재 구현해놓은 발사체는 y방향으로만 이동하고 있지만 삼각함수를 이용한다면 원하는 방향으로 이동이 가능하게 된다.

삼각함수를 알면 이런식으로 발사대를 회전시킬수있다.

또한 앞서 말했듯이 y축으로만 이동하는 발사체를 발사대의 각도와 동일하게 발사하는 것도 가능해진다.

 

발사대 생성

 

발사대의 위치는 삼각함수에 의해 좌표가 결정된다.처음 좌표는 플레이어의 좌표이고 끝 좌표는 삼각함수에 의해 결정된다. 각도는 Q와E키에 의해 정해지므로 Q와E를 누르면 발사대가 회전하는 식으로 구현이 된다.

//Player.h

class Player :public Object
{

public:
    Pos GetFirePos();
	
private:
	float _delay= 0.f;
	float _barrelAngle=0.f;
	float _barrelLength=100.f;
	
}

 

 

//Player.cpp

void Player::Update()
{
	if (GET_SINGLE(InputManager)->GetButton(KeyType::Q))
	{
		_barrelAngle -= 10 * deltaTime;
	}

	if (GET_SINGLE(InputManager)->GetButton(KeyType::E))
	{
		_barrelAngle += 10 * deltaTime;
	}
}

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

void Player::Render(HDC hdc)
{
	Utils::DrawLine(hdc,_pos,GetFirePos());
}

 

구현하면 이런식으로 작동하게 된다.

 

 

발사대의 각도에 따른 발사체 이동

 

앞서 말햇듯이 발사체는 현재Y축으로만 이동을 하고있다. 발사대의 끝부분에서 시작하여 발사대의 각도와 발사체의 이동 각도가 같아지게 하려면 어떻게 해야될까?

 

//Projectile.h

class Projectile :public Object
{
public:
	float SetAngle(float Angle) { return _angle = Angle; }

private:
	float _angle = 0.f;
}

 

 

 

//Projectile.cpp

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

}

 

 

//Player.cpp

void Player::Update()
{
	if (GET_SINGLE(InputManager)->GetButton(KeyType::SpaceBar))
	{
		Projectile* projectile = GET_SINGLE(ObjectManager)->CreateObject<Projectile>();
		projectile->Setpos(GetFirePos());//발사체의 시작위치

		projectile->SetAngle(_barrelAngle);//발사체의 각도
     	}
}

 

위의 코드를 적용하면 다음과 같이 실행된다.

728x90
반응형

'게임엔진 > 윈도우API' 카테고리의 다른 글

윈도우API)9. 벡터의 내적  (0) 2022.12.22
윈도우API)8. 벡터  (0) 2022.12.18
윈도우API)5. 오브젝트 설계  (0) 2022.12.17
윈도우API)3. Scene과 SceneManager  (0) 2022.12.16
윈도우API)2. 프레임워크 제작  (0) 2022.12.15

댓글