응애맘마조
8방향 몬스터 본문
주의 : 해당 게시글의 코드는 캐릭터의 움직임을 구현하기 위해 사용한 것으로 특정 게임의 모션을 사용하였습니다. 기타 표절 목적이나 수익 창출을 위해 사용한 것이 아님을 밝힙니다.
이전 게시글대로 보스가 플레이어를 바라보고 원 사이즈 안에 들어올 때 마다 모션이 변하도록 만드는 것이 과제였습니다.
https://keisukeaso.tistory.com/97
//TitanBoss.h
#pragma once
enum class TB_State
{
IDLE,
LOOK = 500,
MOVE = 300,
ATTACK = 100
};
class TitanBoss : public Character
{
public:
ObImage* img;
ObCircle* range[3];
TB_State tbState;
float length;
Vector2 distance;
bool isSwitching;
public:
TitanBoss();
~TitanBoss();
void Update();
void Render();
void Idle();
void Look();
void Move();
void Attack();
};
//TitanBoss.cpp
#include "stdafx.h"
TitanBoss::TitanBoss()
{
col = new ObRect();
img = new ObImage(L"boss.bmp");
col->scale = Vector2(img->imageSize.x, img->imageSize.y / 8.0f);
col->isFilled = false;
img->scale = Vector2(img->imageSize.x, img->imageSize.y / 8.0f);
img->maxFrame.y = 8;
img->SetParentRT(*col);
range[0] = new ObCircle; //look
float scale = (float)TB_State::LOOK * 2.0f;
range[0]->scale = Vector2(scale, scale);
range[0]->SetParentRT(*col);
range[0]->isFilled = false;
range[1] = new ObCircle;
scale = (float)TB_State::MOVE * 2.0f;
range[1]->scale = Vector2(scale, scale);
range[1]->SetParentRT(*col);
range[1]->isFilled = false;
range[2] = new ObCircle;
scale = (float)TB_State::ATTACK * 2.0f;
range[2]->scale = Vector2(scale, scale);
range[2]->SetParentRT(*col);
range[2]->isFilled = false;
frameY[L] = 1;
frameY[R] = 0;
frameY[T] = 4;
frameY[B] = 5;
frameY[LT] = 3;
frameY[RT] = 7;
frameY[LB] = 6;
frameY[RB] = 2;
tbState = TB_State::IDLE;
isSwitching = false;
}
TitanBoss::~TitanBoss()
{
SafeDelete(col);
SafeDelete(img);
for (int i = 0; i < 3; i++)
{
SafeDelete(range[i]);
}
}
void TitanBoss::Update()
{
distance = targetPos - col->GetWorldPos();
length = distance.Length();
switch (tbState)
{
case TB_State::IDLE:
Idle();
break;
case TB_State::LOOK:
Look();
break;
case TB_State::MOVE:
Move();
break;
case TB_State::ATTACK:
Attack();
break;
}
col->Update();
img->Update();
for (int i = 0; i < 3; i++)
{
range[i]->Update();
}
}
void TitanBoss::Render()
{
for (int i = 0; i < 3; i++)
{
range[i]->Render();
}
col->Render();
img->Render();
}
void TitanBoss::Idle()
{
//look
if (length < (float)TB_State::LOOK)
{
tbState = TB_State::LOOK;
}
}
void TitanBoss::Look()
{
LookAtTarget(targetPos, img);
//idle
if (length > (float)TB_State::LOOK)
{
tbState = TB_State::IDLE;
}
//move
else if (length < (float)TB_State::MOVE)
{
tbState = TB_State::MOVE;
}
}
void TitanBoss::Move()
{
LookAtTarget(targetPos, img);
distance.Normalize();
col->MoveWorldPos(distance * 100.0f * DELTA);
//look
if (length > (float)TB_State::MOVE)
{
tbState = TB_State::LOOK;
}
//attack
else if (length < (float)TB_State::ATTACK)
{
tbState = TB_State::ATTACK;
}
}
void TitanBoss::Attack()
{
LookAtTarget(targetPos, img);
float temp = 1.0f;
if (isSwitching) temp = 1.0f;
else temp *= -1.0f;
img->scale.x -= temp * 100.0f * DELTA;
img->scale.y += temp * 100.0f * DELTA;
if (img->scale.x > 150.0f || img->scale.y > 150.0f)
{
isSwitching = !isSwitching;
//temp *= -1.0f;
}
//move
if (length > (float)TB_State::ATTACK)
{
tbState = TB_State::MOVE;
img->scale = Vector2(img->imageSize.x, img->imageSize.y / 8.0f);
}
}
코드입니다.
읽어주셔서 감사합니다.
'공부 > 2D과제' 카테고리의 다른 글
길 막기 (0) | 2023.02.06 |
---|---|
맵 만들기 (0) | 2023.02.01 |
8방향 캐릭터 (0) | 2023.01.27 |
쿠키런 2탄 : 착지, 젤리 먹기, 타격 (0) | 2023.01.25 |
쿠키런 1탄 : 달리기, 점프, 2단 점프, 슬라이드 (0) | 2023.01.20 |
Comments