#include "GameLayer.h"
USING_NS_CC;
GameLayer::~GameLayer(){
//importante elimnar los objetos que o heredan de node
delete _bg;
}
Scene* GameLayer::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::create();
// 'layer' is an autorelease object
auto layer = GameLayer::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool GameLayer::init()
{
//primero la superclase
if (!Layer::init())
{
return false;
}
_numEnemies = 20;
_enemyIndex = 0;
_visibleSize = Director::getInstance()->getVisibleSize();
//inicializamos el SpriteFrameCache con el descriptor del sprite sheet
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Hunter.plist");
//creamos el SpriteBatchNode con las imagenes del sprite sheet
SpriteBatchNode* gameBatchNode = SpriteBatchNode::create("Hunter.png");
//inserta el SpriteBatchNode a la escena,
//el resto de componetes seran hijos del SpriteBatchNode
addChild(gameBatchNode);
//creamos el backgorund que ahora no hereda de node
_bg = new Background();
_bg->setParent(gameBatchNode);
//creamos el jugador
_player = Player::create();
_player->setPosition(_visibleSize.width*0.5, _visibleSize.height*0.3);
gameBatchNode->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);
gameBatchNode->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 accion 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);
}
}
}