응애맘마조

쿠키런 1탄 : 달리기, 점프, 2단 점프, 슬라이드 본문

공부/2D과제

쿠키런 1탄 : 달리기, 점프, 2단 점프, 슬라이드

TH.Wert 2023. 1. 20. 23:55

이전 강의 게시글에 이어서 코드 내용 게시글입니다.

https://keisukeaso.tistory.com/89

//main.h
#pragma once
#define FMAX 15
class Main : public Scene
{
private:
	ObImage*	floor[FMAX];
	Cookie*		cookie;
	float		test;

public:
	virtual void Init() override;
	virtual void Release() override; //해제
	virtual void Update() override;
	virtual void LateUpdate() override;//갱신
	virtual void Render() override;
	virtual void ResizeScreen() override;
};
//main.cpp
#include "stdafx.h"
#include "Main.h"

void Main::Init()
{
	test = 1.0f;

	for (int i = 0; i < FMAX; i++)
	{
		floor[i] = new ObImage(L"C_floor.png");
		floor[i]->scale = Vector2(floor[0]->imageSize.x, floor[0]->imageSize.y);
		floor[i]->pivot = OFFSET_LT;
		floor[i]->SetWorldPosX(-app.GetHalfWidth() + floor[0]->imageSize.x * i);
		floor[i]->SetWorldPosY(-app.GetHalfHeight() + floor[0]->imageSize.y);
		floor[i]->collision = COLLIDER::RECT;
	}

	cookie = new Cookie;
}

void Main::Release()
{	
	for (int i = 0; i < FMAX; i++)
	{
		SafeDelete(floor[i]);
	}
	SafeDelete(cookie);
}

void Main::Update()
{
	CAM->position += RIGHT * 100.0f * DELTA;
	
	for (int i = 0; i < FMAX; i++)
	{
		floor[i]->Update();
	}
	cookie->Update();
}

void Main::LateUpdate()
{
	for (int i = 0; i < FMAX; i++)
	{
		if (floor[i]->Intersect(cookie->col->GetWorldPos()))
		{
			cookie->col->SetWorldPosY(-app.GetHalfHeight() + 140.0f);

			//jump -> run
			if (cookie->state == C_State::JUMP)
			{
				cookie->state = C_State::RUN;
				cookie->run->isVisible = true;
				cookie->jump->isVisible = false;
				cookie->doubleJump = false;
			}
		}
	}



	for (int i = 0; i < FMAX; i++)
	{
		if (cookie->col->GetWorldPos().x - floor[i]->GetWorldPos().x > 650.0f)
		{
			floor[i]->MoveLocalPos(Vector2(FMAX * floor[i]->scale.x, 0.0f));
		}
	}
}

void Main::Render()
{
	
	for (int i = 0; i < FMAX; i++)
	{
		floor[i]->Render();
	}
	cookie->Render();
}

void Main::ResizeScreen()
{
}

int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prevInstance, LPWSTR param, int command)
{
    app.SetAppName(L"Game1");
    app.SetInstance(instance);
	app.InitWidthHeight(1600, 800.0f);
	WIN->Create();
	Main* main = new Main();
	int wParam = (int)WIN->Run(main);
	SafeDelete(main);
	WIN->Destroy();
	WIN->DeleteSingleton();
	
	return wParam;
}
//cookie.h
#pragma once
enum class C_State
{
	RUN,
	JUMP,
	SLIDE
};

class Cookie
{
public:
	ObRect*		col;
	ObImage*	run;
	ObImage*	jump;
	ObImage*	slide;

	C_State		state;

	float		gravity;
	bool		doubleJump;

public:
	Cookie();
	~Cookie();
	void Update();
	void Render();
};
//cookie.cpp
#include "stdafx.h"

Cookie::Cookie()
{
	col = new ObRect();
	run = new ObImage(L"C_run.png");
	jump = new ObImage(L"C_jump.png");
	slide = new ObImage(L"C_slide.png");

	col->scale = Vector2(run->imageSize.x / 4.0f, run->imageSize.y) * 0.3f;
	col->isFilled = false;
	col->pivot = OFFSET_B;
	col->SetWorldPos(Vector2(-300.0f, -app.GetHalfHeight() + 140.0f));

	run->scale = Vector2(run->imageSize.x / 4.0f, run->imageSize.y);
	run->maxFrame.x = 4;
	run->pivot = OFFSET_B;
	run->ChangeAnim(ANIMSTATE::LOOP, 0.1f);
	run->SetParentRT(*col);

	jump->scale = Vector2(jump->imageSize.x / 8.0f, jump->imageSize.y);
	jump->maxFrame.x = 8;
	jump->pivot = OFFSET_B;
	jump->SetParentRT(*col);
	jump->isVisible = false;

	slide->scale = Vector2(slide->imageSize.x / 5.0f, slide->imageSize.y);
	slide->maxFrame.x = 5;
	slide->pivot = OFFSET_B;
	slide->SetParentRT(*col);
	slide->isVisible = false;
	doubleJump = false;

	state = C_State::RUN;
	gravity = 0.0f;
}

Cookie::~Cookie()
{
	SafeDelete(run);	
	SafeDelete(col);
	SafeDelete(jump);
	SafeDelete(slide);
}

void Cookie::Update()
{
	if (state == C_State::RUN)
	{
		gravity = 0.0f;
		col->scale.y = run->imageSize.y * 0.3f;

		//run -> slide
		if (INPUT->KeyPress(VK_DOWN))
		{
			state = C_State::SLIDE;
			slide->ChangeAnim(ANIMSTATE::ONCE, 0.1f);
			run->isVisible = false;
			slide->isVisible = true;
		}

		//run -> jump
		if (INPUT->KeyDown(VK_SPACE))
		{
			gravity = -200.0f;
			state = C_State::JUMP;
			jump->ChangeAnim(ANIMSTATE::ONCE, 0.1f);
			run->isVisible = false;
			jump->isVisible = true;
		}

	}
	else if (state == C_State::SLIDE)
	{
		gravity = 0.0f;
		col->scale.y = run->imageSize.y * 0.2f;

		//slide -> run
		if (INPUT->KeyUp(VK_DOWN))
		{
			state = C_State::RUN;
			run->isVisible = true;
			slide->isVisible = false;
		}
	}
	else //jump
	{
		if (INPUT->KeyDown(VK_SPACE) && !doubleJump)
		{
			gravity = -200.0f;
			jump->ChangeAnim(ANIMSTATE::ONCE, 0.1f);
			doubleJump = true;
		}
	}

	col->MoveWorldPos(RIGHT * 100.0f * DELTA + DOWN * gravity * DELTA);
	gravity += 200.0f * DELTA;

	run->Update();
	col->Update();
	jump->Update();
	slide->Update();
	
}

void Cookie::Render()
{
	col->Render();
	run->Render();
	jump->Render();
	slide->Render();
}

코드입니다.

 

읽어주셔서 감사합니다.

'공부 > 2D과제' 카테고리의 다른 글

8방향 캐릭터  (0) 2023.01.27
쿠키런 2탄 : 착지, 젤리 먹기, 타격  (0) 2023.01.25
슬라이드 퍼즐  (2) 2023.01.18
이동 제한  (0) 2023.01.17
deque, map  (0) 2023.01.17