서울게임아카데미 교육과정 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