응애맘마조
쿠키런 1탄 : 달리기, 점프, 2단 점프, 슬라이드 본문
이전 강의 게시글에 이어서 코드 내용 게시글입니다.
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 |