#include "Level1.h"
#include "AudioEngine.h"
#include "GameManager.h"
#include "MainMenuLayer.h"
USING_NS_CC;
Scene* Level1::createScene()
{
auto scene = Scene::create();
auto layer = Level1::create();
scene->addChild(layer);
return scene;
}
bool Level1::init()
{
if (!BaseGameLayer::init())
{
return false;
}
_numEnemies = 20;
_enemyIndex = 0;
setTag(1);//level1
_scoreToCompleTheLevel = 1000;
initActors();
awakeEnemyScheduler();
//bucle del juego
this->schedule(schedule_selector(Level1::update));
//bucle de sonido
experimental::AudioEngine::play2d("music/Cetus.mp3", true, GameManager::getInstance()->getBgVolume()*0.01);
//scheduleUpdate();
schedule(schedule_selector(Level1::update));
return true;
}
void Level1::initActors()
{
for (int i = 0; i < _numEnemies; i++){
auto enemy = BasicEnemy::create();
//da informacion a los enemigos acerca del player
enemy->setTarget(_player);
_enemyPool.pushBack(enemy);
_gameBatchNode->addChild(enemy, ForegroundPos);
}
//da información al player acerca de los enemigos
_player->setTargets(_enemyPool);
}
void Level1::update(float dt)
{
BaseGameLayer::update(dt);
_player->update(dt);
//mira colisiones entre enemigos y player
checkCollisions();
}
void Level1::respawnButtonAction()
{
BaseGameLayer::respawnButtonAction();
for (int i = 0; i < _numEnemies; i++){
_enemyPool.at(i)->reset();
}
}
void Level1::pauseButtonAction()
{
BaseGameLayer::pauseButtonAction();
experimental::AudioEngine::pauseAll();
_player->pause();
for (Sprite* enemy : _enemyPool){
enemy->pause();
}
}
void Level1::playButtonAction()
{
BaseGameLayer::playButtonAction();
experimental::AudioEngine::resumeAll();
_player->resume();
for (Sprite* enemy : _enemyPool){
enemy->resume();
}
}
void Level1::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 Level1::awakeEnemyScheduler()
{
//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));
}
void Level1::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->setHealth(0);
}
}
}