응애맘마조

8방향 몬스터 본문

공부/2D과제

8방향 몬스터

TH.Wert 2023. 1. 30. 23:29

주의 : 해당 게시글의 코드는 캐릭터의 움직임을 구현하기 위해 사용한 것으로 특정 게임의 모션을 사용하였습니다. 기타 표절 목적이나 수익 창출을 위해 사용한 것이 아님을 밝힙니다.

이전 게시글대로 보스가 플레이어를 바라보고 원 사이즈 안에 들어올 때 마다 모션이 변하도록 만드는 것이 과제였습니다.

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