#include "GameLayer.h"
USING_NS_CC;
Scene* GameLayer::createScene()
{
auto scene = Scene::create();
auto layer = GameLayer::create();
scene->addChild(layer);
return scene;
}
bool GameLayer::init()
{
//primero la superclase
if (!Layer::init())
{
return false;
}
_numEnemies = 20;
_enemyIndex = 0;
_visibleSize = Director::getInstance()->getVisibleSize();
//creamos el backgorund
_bg = Background::create();
addChild(_bg);
//create player
_player = Player::create();
_player->setPosition(_visibleSize.width*0.5, _visibleSize.height*0.3);
addChild(_player);
for (int i = 0; i < _numEnemies; i++){
auto enemy = BasicEnemy::create();
//damos informacion a los enemigos acerca del jugador
enemy->setTarget(_player);
enemy->setVisible(false);
_enemyPool.pushBack(enemy);
addChild(enemy);
}
//damos informacion al jugador acerca de los enemigos
_player->setTargets(_enemyPool);
//se generera un enemigo cada segundo
DelayTime *delayAction = DelayTime::create(1.0f);
// creamos la acción que despertara a los enemigos
CallFunc *callSelectorAction = CallFunc::create(CC_CALLBACK_0(GameLayer::awakeEnemy, this));
auto awakeEnemySequence = Sequence::create(delayAction, callSelectorAction, NULL);
// repetimos esto hasta el final del juego
runAction(RepeatForever::create(awakeEnemySequence));
//comenzamos el ciclo de juego
this->schedule(schedule_selector(GameLayer::update));
return true;
}
void GameLayer::update(float dt){
if (_player->isVisible()){
_bg->update(dt);
}
_player->update(dt);
//miramos si hay colisiones entre los enemigos y el jugador
checkCollisions();
}
void GameLayer::awakeEnemy(){
_enemyIndex = _enemyIndex % _numEnemies;
auto enemy = _enemyPool.at(_enemyIndex);
//posicionamos de forma aleatoria en el eje x un enemigo, teniendo en cuenta
//que cada enemigo mide 50*50
enemy->setPositionX(RandomHelper::random_int(static_cast(0 + 50 * 0.5),
static_cast(_visibleSize.width - 50 * 0.5)));
enemy->setPositionY(_visibleSize.height + 50 * 0.5);
//reseteamos el estado del enemigo
enemy->setCurrentAnimation(BasicEnemy::Animations::IDLE);
if (!enemy->isVisible()){
enemy->setVisible(true);
}
_enemyIndex++;
}
void GameLayer::checkCollisions(){
for (int i = 0; i < _numEnemies; i++){
auto enemy = _enemyPool.at(i);
if (_player->getBoundingBox().intersectsRect(enemy->getBoundingBox())
&& enemy->isVisible() && _player->isVisible()){
enemy->setCurrentAnimation(BasicEnemy::Animations::EXPLOSION);
_player->setCurrentAnimation(Player::Animations::EXPLOSION);
}
}
}