서울게임아카데미 교육과정 6개월 C++ ~ DirectX2D
48일차. 윈도우 API 활용 코딩
WDmil
2023. 6. 22. 19:58
728x90
윈도우 API를 활용하여 2D게임의 코딩을 기초적으로 진행한다.
발사하는 손가락과 발사되는 투사체를 구현하는 코드를 진행.
발사되는 투사체
#include "Sonic.h"
#include "Engine/Time.h"
Sonic::Sonic(Vector<2> const location)
{
Skin.Name = "Animation/Sonic_Run";
Skin.Length = { 144, 144 };
Skin.Location = location;
Skin.Duration = 0.125f; // 0.125마다 반복되게
Skin.Repeatable = true;
}
bool Sonic::Update()
{
// 업데이트 할 떄마다 이미지를 업데이트 해줌
Skin.Render();
// 케릭터가 화면 범위를 벗어났을 때 몸을 없애주는것
//if ((640 + Skin.Length[0] * 0.5) <= (Skin.Location[0] += 0.125f)) // 화면을 중간이상 벗어났을 때, flase 아니면 true를 반환한다.
// return false;
//else
// return true;
return (Skin.Location[0] += 1280 * Engine::Time::Get::Delta() <= (640 + Skin.Length[0] * 0.5f));
// Delta = 시간에 대한 함수. 이전에 지나간 시간을 찍는다.
// 화면의 크기 * 경과한 시간. 이, S
}
#pragma once
#include "Engine/Rendering.h"
class Sonic
{
public:
Sonic(Vector<2> const location); // 수학적 의미의 벡터. 알던 벡터의 위치값이 아니라 2개의 xy좌표만을 가지는 벡터위치값을 이야기한다.
bool Update(); // 업데이트 되면서 동작한다.
private:
Engine::Rendering::Animation::Component Skin; // 케릭터의 외관을 받아오는 컴포넌트를 받아온것. 구성 요소에서 사용이 가능한 독립적인 부분을 나타냄
};
발사하는 주체
#pragma once
#include "Engine/Rendering.h"
class Sonic; // 전방선언 해준다.
// 손가락모양 총 모양을 구현한다.
class SonicShooter
{
public:
SonicShooter(void (* const way)(Sonic* const)); // 함수의 주소를 받는 함수 포인터. 주소를 저장하거나 매개변수. way
bool Update();
void Move(float const distance);
void Shoot();
private:
Engine::Rendering::Image::Component Skin;
void(* const Way)(Sonic* const); // 그때그때 다른 함수를 할당해주려고 사용 동적 바인딩 한다.
// 내가 사용할 함수를 갱신하면서 저장하는 함수 포인터 배열을 계속 참조하여 오버라이딩된 자식클래스를 가리키는 것 처럼 계속해서 다음으로 넘어가면서
// 런타임 중에 결정이 되는 함수포인터배열 이 동적 바인딩으로 일정하게 참조하게 된다.
};
#include "Sonic.h"
#include "SonicShooter.h"
SonicShooter::SonicShooter(void(* const way)(Sonic* const))
:Way{ way }
{
Skin.Name = "Image/Direction";
Skin.Length = { 128, 128 };
Skin.Location = { -575, 250 };
}
bool SonicShooter::Update()
{
Skin.Render();
return true;
}
void SonicShooter::Move(float const distance)
{
Skin.Location[1] += distance;
}
void SonicShooter::Shoot()
{
Way(new Sonic(Skin.Location));
}
이 경우, 발사된 이후의 투사체를 관리하는 배열이 필요하다.
발사된 이후의 투사체를 전부 관리해야. 충돌판정을 확인할 수 있기 때문.
발사된 이후의 투사체를 관리하는 코드
#pragma once
#include "Engine/Game.h"
#include "Engine/Rendering.h"
#include <vector>
class Sonic;
class SonicShooter;
class TempGame : public Engine::Game
{
public:
void Start() override;
void Update() override;
void End() override;
private:
static void Add(Sonic* const sonic);
private:
Engine::Rendering::Camera Camera;
SonicShooter* Shooter;
static std::vector<Sonic*> Sonics;
};
#include "TempGame.h"
void TempGame::Start()
{
}
void TempGame::Update()
{
}
void TempGame::End()
{
}
void TempGame::Add(Sonic* const sonic)
{
}
728x90