ThreeBullets #7

1 minute read


적 생성

총알이 생성되는 것과 비슷한 구조이다. 적의 경우 게임이 시작되는 순간부터 끝날 때 까지 생성되며 위치와 종류를 무작위로 해준다.

  • 이미지 생성
// EnemySprite.cpp
bool EnemySprite::init(EType _type, float _speed, Vec2 _dir)
{
	if (!Sprite::initWithFile(fileName[_type]))
	{
		return false;
	}

	moveSpeed = _speed;
	moveDir = _dir;
	enemyType = _type;
	this->setScale(0.4f);

	this->scheduleUpdate();

	return true;
}

void EnemySprite::update(float _dt)
{
	enemyDeadline(_dt);
}

void EnemySprite::enemyDeadline(float _dt)
{
	if (isEnemyDead)
	{
		return;
	}

	Vec2 enemyPos = this->getPosition();
	Vec2 newPos = enemyPos;
	
	newPos += moveSpeed * moveDir * _dt;
	this->setPosition(newPos);

	if (this->getPosition().y < 0)
	{
		isEnemyDead = true;
	}
}

외부에서 init함수를 호출하면서 매개변수를 받아서 그 정보로 적이 설정되고 생성되는 동시에 업데이트를 통해서 위에서 아래로 이동하게 된다.


적이 생성될 때 위치와 타입에 대한 정보가 필요하다.

  • 적의 타입을 랜덤하게 설정
    적의 종류는 3가지이다.
// EnemyLayer.cpp
void EnemyLayer::setEnemyType()
{
	int randType = rand() % 3 + 1;

	if (randType == 1)
	{
		enemyType = EnemySprite::EType::kXEnemy;
	}
	.
	.
	.
}
  • 적이 생성되는 위치 랜덤
    화면을 5등분해서 각 라인의 중간이 적이 생성될 위치이다.
// EnemyLayer.cpp
void EnemyLayer::enemySpawn(float _dt)
{
	setEnemyType();
	initEnemy();

	int randLane = rand() % 5;
	
	switch(randLane)
	{
		case 0:
			pEnemySprite->setPosition(refLane + (laneInterval * randLane));
			enemyList.pushBack(pEnemySprite);
			this->addChild(pEnemySprite);
			break;
	.
	.
	.
	}
}
  • 생성된 적 관리
    적 또한 Vector에 저장해서 일괄적으로 관리할 수 있도록 만든다.
void EnemyLayer::removeEnemy()
{
	for (int i = 0; i < enemyList.size(); i++)
	{
		if (enemyList.at(i)->isDead())
		{
			this->removeChild(enemyList.at(i));
			enemyList.erase(i);
		}
	}
}

play

  • 일정 간격으로 적을 생성하는 방법
    특정 동작을 간격을 두고 반복하기 위해서 CC_SCHEDULE_SELECTOR를 활용한다.
this->schedule(CC_SCHEDULE_SELECTOR(EnemyLayer::enemySpawn), 0.8f, CC_REPEAT_FOREVER, 0);

CC_SCHEDULE_SELECTOR(반복하려는 함수, 동작 간격, 언제까지 반복할건지, 딜레이)


이제 총알과 적의 충돌 판정만 해주면 게임의 전반적 기능은 끝이난다.