서울게임아카데미 교육과정 6개월 C++ ~ DirectX2D
49일차. API활용 간단한 실습예제
WDmil
2023. 6. 27. 21:27
728x90
#pragma comment(linker, "/Subsystem:Windows")
// 윈도우 운영체제에서 실행될 것 을 알려주는 것
#pragma comment(lib, "D3D11.lib")// 라이브러리 의 다이렉트3 11 의 라이브러리를 사용할 것 이다.
#pragma comment(lib, "FreeImage.lib") // 우리가 넣은 에셋 파일들 사용할 것 임을 암시
#pragma comment(lib, "Engine.lib") // 우리가 넣은 엔진의 라이브러리 를 사용한다.
#include "Engine/Initialize.h"
#include "TempGame.h"
namespace Engine
{
Game* Initialize()
{
return new TempGame;
}
}
Game* Initialize() 를 선언한 뒤 리턴으로 TmepGame을 반환한다.
#pragma once
namespace Engine
{
class Game abstract
{
public:
virtual void Start() abstract;
virtual void Update() abstract;
virtual void End() abstract;
};
}
Game* Initialize() 는 실행 시 인터페이스로 Game을 사용하게된다.
#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;
};
인터페이스를 상속받는 자식함수로 TempGame을 사용하여, Start와 Update, End를 상속받아 활용하게 된다.
#include "TempGame.h"
#include "Engine/Input.h"
#include "Sonic.h"
#include "SonicShooter.h"
std::vector<Sonic*> TempGame::Sonics;
void TempGame::Start()
{
Camera.Sight = { 1280, 720 }; // 화면에 소닉이 어떻게 보여질 것 인지
Shooter = new SonicShooter(Add); // 시작 시 배열에 박아준다.
}
void TempGame::Update()
{
Camera.Sight[0] += 16 * 4 * - Engine::Input::Get::Wheel::V(); // 적당히 상수값을 준다.
Camera.Sight[1] += 9 * 4 * - Engine::Input::Get::Wheel::V(); // 적당히 상수값을 준다. 휠드레그 해주었을 때 양수 음수 체크하는것.
Camera.Set(); // 시야 변경에 대한 내용을 적용 시켜준다.
for (Sonic* const sonic : Sonics)
sonic->Update();
Shooter->Update();
if (Engine::Input::Get::Key::Press('W')) // W키가 눌렸을 때
Shooter->Move(+0.0625f); // 속도를 조정해주는것
if (Engine::Input::Get::Key::Press('S')) // S키가 눌렸을 때
Shooter->Move(-0.0625f); // 속도를 조정해주는것
if (Engine::Input::Get::Key::Down(VK_SPACE)) // Space가 눌렸을때 한번만
Shooter->Shoot(); // 발사체 발사 함수구조 순서 = SonicShooter(Add) -> Add -> Shoot() -> Sonics
}
void TempGame::End()
{
delete(Shooter);
for (Sonic* const sonic : Sonics)
delete(sonic);
}
void TempGame::Add(Sonic* const sonic)
{
Sonics.push_back(sonic);
}
각 함수는 Engine에 있는 설정을 사용하게된다.
#pragma once
#include "Vector.h"
namespace Engine::Rendering
{
class Camera final
{
public:
void Set() const;
public:
Vector<2> Location = { 0.0f, 0.0f };
Vector<2> Sight = { 0.0f, 0.0f };
float Angle = { 0.0f };
};
namespace Text
{
class Component final
{
public:
void Render();
public:
char const * Text = nullptr;
struct
{
char const * Name = nullptr;
int Size = 0;
bool Bold = false;
bool Italic = false;
bool Underlined = false;
bool StructOut = false;
}
Font;
struct
{
unsigned char Red = 0;
unsigned char Green = 0;
unsigned char Blue = 0;
}
Color;
public:
Vector<2> Location = { 0.0f, 0.0f };
Vector<2> Length = { 0.0f, 0.0f };
float Angle = { 0.0f };
};
}
namespace Image
{
class Component final
{
public:
void Render();
public:
char const * Name = nullptr;
public:
Vector<2> Location = { 0.0f, 0.0f };
Vector<2> Length = { 0.0f, 0.0f };
float Angle = { 0.0f };
};
}
namespace Animation
{
class Component final
{
public:
void Render();
public:
char const * Name = nullptr;
float Playback = 0.0f; //애니메이션 컴포넌트의 재생 위치 => 특정 프레임 표시
float Duration = 0.0f; //일정한 시간 간격 나타냄 => 애니메이션이 얼마나 실행되는 지
bool Repeatable = false; //반복 가능한지 여부
bool Flipped = false; //뒤집혀 있는지 여부
public:
Vector<2> Location = { 0.0f, 0.0f };
Vector<2> Length = { 0.0f, 0.0f };
float Angle = { 0.0f };
};
}
}
Rendering.h 에 대한 내용속 의 Camera를 사용하게 된다.
즉, 인터페이스 에 대한 상속을 활용하여, 각 함수마다 공통적으로 사용하게 될 변수들은 Engine에 작성하여 호출 사용하게 되고. 각 실행작업은 lib을 활용하여 참조역활을 수행할 수 있게된다.
실행예시
스페이스바 를 누르면 발사체가 손에서 발사된다.
728x90