프로그래밍 공부
작성일
2023. 6. 22. 19:58
작성자
WDmil
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