#include "GamePlane.h"
#include "PlaneSprite.h"
#include "BulletNode.h"
#include "EnemyPlane.h"
#include "EnemyBullet.h"
USING_NS_CC;
Scene* GamePlane::createScene()
{
auto scene = Scene::create();
auto layer = GamePlane::create();
scene->addChild(layer);
return scene;
}
bool GamePlane::init()
{
if (!Layer::init())
return false;
auto layer = Layer::create();
bg[0] = Sprite::create("background.png");
bg[0]->setAnchorPoint(Vec2(0, 0));
bg[0]->setPosition(0, 0);
layer->addChild(bg[0]);
bg[1] = Sprite::create("background.png");
bg[1]->setAnchorPoint(Vec2(0, 0));
bg[1]->setPosition(0, HEIGH);
layer->addChild(bg[1]);
bg[2] = Sprite::create("plane_background.png");
bg[2]->setAnchorPoint(Vec2(0, 0));
bg[2]->setPosition(0, 0);
layer->addChild(bg[2]);
bg[3] = Sprite::create("plane_background.png");
bg[3]->setAnchorPoint(Vec2(0, 0));
bg[3]->setPosition(0, -HEIGH);
layer->addChild(bg[3]);
addChild(layer);
auto plane = PlaneSprite::createPlane(Point(180, 100));
plane->setTag(PLANE);
addChild(plane);
for (int i = 0; i < BULLE; ++i)
{
bullets[i] = Bullet::createBullet(Point(0, 660));
addChild(bullets[i]);
}
for (int i = 0; i < BULLE; ++i)
{
enemyBullet[i] = EnemyBullet::createBullet(Point(0, 720));
addChild(enemyBullet[i]);
}
scheduleUpdate();
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = CC_CALLBACK_2(GamePlane::touchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(GamePlane::touchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(GamePlane::touchEnded, this);
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
for (int i = 0; i < ENEMY; ++i)
{
enemy[i] = EnemyPlane::create();
addChild(enemy[i]);
}
return true;
}
void GamePlane::update(float dt)
{
bg[0]->setPositionY(bg[0]->getPositionY() - 1);
bg[1]->setPositionY(bg[1]->getPositionY() - 1);
if (bg[0]->getPositionY() <= -HEIGH)
{
bg[0]->setPositionY(HEIGH);
}
if (bg[1]->getPositionY() <= -HEIGH)
{
bg[1]->setPositionY(HEIGH);
}
bg[2]->setPositionY(bg[2]->getPositionY() + 2);
bg[3]->setPositionY(bg[3]->getPositionY() + 2);
if (bg[2]->getPositionY() >= HEIGH)
{
bg[2]->setPositionY(-HEIGH);
}
if (bg[3]->getPositionY() >= HEIGH)
{
bg[3]->setPositionY(-HEIGH);
}
auto plane = (PlaneSprite*)getChildByTag(PLANE);
for (int i = 0; i < BULLE; ++i)
{
if (!bullets[i]->Using())
{
bullets[i]->shoot(plane->getPosition());
break;
}
}
for (int i = 0; i < BULLE; ++i)
{
if (bullets[i]->Using() && bullets[i]->getPosY() == 660)
bullets[i]->setUnUse();
}
static int enemyBulletLock = 0;
++enemyBulletLock;
if (enemyBulletLock % 100 == 0)
{
for (int i = 0; i < ENEMY; ++i)
{
if (enemy[i]->getType() == 1)
{
for (int j = 0; j < BULLE; ++j)
{
if (!enemyBullet[j]->Using())
{
enemyBullet[j]->shoot(enemy[i]->getPosition());
break;
}
}
}
}
}
for (int i = 0; i < BULLE; ++i)
{
if (enemyBullet[i]->Using() && enemyBullet[i]->getPositionY() == -80)
enemyBullet[i]->setUnUse();
}
static float t = 0;
t += dt;
if (t < 0.1)
{
return;
}
t = 0;
static int number = time(NULL);
srand(number);
number = rand();
srand(number);
int num = number % 150;
int type = 0;
bool fly = false;
switch (num)
{
case 30:
case 120:
type = 1;
fly = true;
break;
case 2:
case 22:
type = 2;
fly = true;
break;
case 3:
case 33:
type = 3;
fly = true;
break;
default:
type = 0;
fly = false;
break;
}
if (fly)
{
for (int i = 0; i < ENEMY; ++i)
{
if (enemy[i]->getType() == 0)
{
enemy[i]->start(type, num * number % 360);
break;
}
}
for (int i = 0; i < ENEMY; ++i)
{
if (enemy[i]->getPositionY() == -80)
{
enemy[i]->setType(0);
}
}
}
checkEnemy();
}
bool GamePlane::touchBegan(cocos2d::Touch* touch, cocos2d::Event*)
{
auto plane = (PlaneSprite*)getChildByTag(PLANE);
auto tPos = touch->getLocation();
if (plane->boundingBox().containsPoint(tPos))
{
return true;
}
return false;
}
void GamePlane::touchMoved(cocos2d::Touch* touch, cocos2d::Event*)
{
auto plane = (PlaneSprite*)getChildByTag(PLANE);
plane->setPosition(plane->getPosition() + touch->getDelta());
if (touch->getDelta().x < 0)
plane->setRotation3D(Vec3(0, 0, -10));
else if (touch->getDelta().x > 0)
plane->setRotation3D(Vec3(0, 0, 10));
/*else
plane->setRotation3D(Vec3(0, 0, 0));*/
}
void GamePlane::touchEnded(cocos2d::Touch*, cocos2d::Event*)
{
auto plane = (PlaneSprite*)getChildByTag(PLANE);
plane->setRotation3D(Vec3(0, 0, 0));
}
void GamePlane::checkEnemy()
{
for (int i = 0; i < BULLE; ++i)
{
if (bullets[i]->Using())
{
for (int j = 0; j < ENEMY; ++j)
{
if (enemy[j] > 0)
{
auto pos1 = enemy[j]->getPosition();
auto pos2 = bullets[i]->getPos();
if (fabs(pos1.x - pos2.x) < 40 && fabs(pos1.y - pos2.y) < 30)
{
enemy[j]->die();
bullets[i]->die();
}
}
}
}
}
}