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