서울게임아카데미 교육과정 6개월 C++ ~ DirectX2D

50일차. XY좌표 내의 케릭터 움직임

WDmil 2023. 6. 29. 02:39
728x90

SonicShooter 의 public 함수중 하나인 Move 함수의 매개변수를 Vector<2>로 변환하여 2개의 값을 받아온다.

그 후, SonicShooter.h에 MoveSpeed를 정의해준다.

#pragma once

#include "Engine/Rendering.h"

class Sonic; // 전방선언 해준다.

// 손가락모양 총 모양을 구현한다.
class SonicShooter
{
public:
	SonicShooter(void (* const way)(Sonic* const)); // 함수의 주소를 받는 함수 포인터. 주소를 저장하거나 매개변수. way

	bool Update();

	void Move(Vector<2> const direction);

	//void Shoot();
	Sonic* Shoot();

protected:
	Engine::Rendering::Image::Component Skin;

	float const MoveSpeed = 750;

	void(* const Way)(Sonic* const); // 그때그때 다른 함수를 할당해주려고 사용 동적 바인딩 한다.
	// 내가 사용할 함수를 갱신하면서 저장하는 함수 포인터 배열을 계속 참조하여 오버라이딩된 자식클래스를 가리키는 것 처럼 계속해서 다음으로 넘어가면서
	// 런타임 중에 결정이 되는 함수포인터배열 이 동적 바인딩으로 일정하게 참조하게 된다.

};

TempGame에서의 Vector<2> 를 추가하여 작업한다.

direction을 생성한 후, 배열 형태로 X와 Y형을 받아와 작업을 한 뒤,

Shooter->Move 를 통해 위치좌표값을 반영해준다.

 

void TempGame::Update()
{
	std::string time = "World Time : " + std::to_string(Engine::Time::Get::Elapsed()); // 경과된 시간
	std::string time2 = "Delta Time : " + std::to_string(Engine::Time::Get::Delta()); // 델타 시간

	WorldTime.Text = time.data();
	SomeTime.Text = time2.data();

	WorldTime.Render();
	SomeTime.Render();

	Camera.Sight[0] += 16 * 4 * - Engine::Input::Get::Wheel::V(); // 적당히 상수값을 준다.
	Camera.Sight[1] += 9 * 4 * - Engine::Input::Get::Wheel::V(); // 적당히 상수값을 준다. 휠드레그 해주었을 때 양수 음수 체크하는것.
	Camera.Set(); // 시야 변경에 대한 내용을 적용 시켜준다.

	std::vector<Sonic*>::iterator i = Sonics.begin();
	
	while (i != Sonics.end())
	{
		if ((**i).Update() == true)
		{
		// 다음 원소가 존재할 경우,
			 i = i+1;
		}
		else
		{
			delete(*i);
			i = Sonics.erase(i);
		}
	}

	Shooter->Update();

	Vector<2> direction{};

	if (Engine::Input::Get::Key::Press(VK_LEFT))	direction[0] -= 1;
	if (Engine::Input::Get::Key::Press(VK_RIGHT))	direction[0] += 1;
	if (Engine::Input::Get::Key::Press(VK_UP))		direction[1] += 1;
	if (Engine::Input::Get::Key::Press(VK_DOWN))	direction[1] -= 1;

	if(direction[0] != 0 and direction[1] != 0)
		direction = Normalize(direction);

	Shooter->Move(direction);

	//if (Engine::Input::Get::Key::Down(VK_SPACE)) // Space가 눌렸을때 한번만
	//	Shooter->Shoot(); // 발사체 발사 함수구조 순서 = SonicShooter(Add) -> Add -> Shoot() -> Sonics

	if (Engine::Input::Get::Key::Press(VK_SPACE)) // Space가 눌렸을때 한번만
		Sonics.push_back(Shooter->Shoot());


}

SonicShooter::Move에 매개변수를 변호나해준 다음, Vector<2>형 boundary 를 생성한다음에 초기 위치값을 보정해준다.

 

그 후, Skin.Location[i] 번째에 받아온 boundary값을 대입하여 기입해준다.

 

std::clamp를 사용하는데,

이 함수는 받아온 값이 설정해놓은 값보다 크거나 작은 경우, 설정해놓은 값으로 반환해준다.

std::clamp(입력수, 최소수, 최대수)

 

void SonicShooter::Move(Vector<2> const direction)
{
    Vector<2> const boundary{ (1280 - Skin.Length[0]) * 0.5f, (720 - Skin.Length[1]) * 0.5f };

    for(int i = 0 ; i < 2; i ++)
        Skin.Location[i] = std::clamp(Skin.Location[i] + direction[i] * 
        MoveSpeed * Engine::Time::Get::Delta(), -boundary[i], boundary[i]);
}

728x90