Cocos2d-x 3.0 写的一个游戏移植到安卓手机上闪屏

如题

我写的是一个打飞机的游戏, 移植后屏幕上的飞机一闪一闪 求解

主要代码如下:

#include “GameScene.h”

USING_NS_CC;

GameScene::GameScene()
{
initData();
}

Scene * GameScene::createScene()
{
auto scene = Scene::create();

auto layer = GameScene::create();

scene->addChild(layer);

return scene;
}

bool GameScene::init()
{
if (!Layer::init())
{
return false;
}

auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = CC_CALLBACK_2(GameScene::onTouchBegan,this);
listener->onTouchMoved = CC_CALLBACK_2(GameScene::onTouchMoved, this);
Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(listener, 1);


initBG();
initPlayer();
initScoreLabel();

this->scheduleUpdate();
this->schedule(schedule_selector(GameScene::startABullet),0.1);
this->schedule(schedule_selector(GameScene::randSchedule), 0.5);
this->schedule(schedule_selector(GameScene::startAEnermy), 0.5);

return true;
}

void GameScene::initScoreLabel()
{
auto labelScore = Label::createWithSystemFont("", “”, 14);
labelScore->setAnchorPoint(Point(0, 1));
labelScore->setPosition(Point(10,winSize.height-10));
labelScore->setColor(Color3B::BLACK);
labelScore->setTag(TAG_LABEL_SCORE);
this->addChild(labelScore);

auto labelHighScore = Label::createWithSystemFont("", "", 14);
labelHighScore->setAnchorPoint(Point(1, 1));
labelHighScore->setPosition(Point(winSize.width - 10, winSize.height - 10));
labelHighScore->setColor(Color3B::BLACK);
labelHighScore->setTag(TAG_LABEL_HIGH_SCORE);
this->addChild(labelHighScore);

addScore(0);
}

void GameScene::addScore(int dt)
{
this->score += dt;

if (score > highScore)
    {
    highScore = score;
    UserDefault::getInstance()->setIntegerForKey("highScore", highScore);
    UserDefault::getInstance()->flush();
    }

auto labelScore = (Label*)this->getChildByTag(TAG_LABEL_SCORE);
labelScore->setString(StringUtils::format("SCORE: %d", score));

auto labelHighScore = (Label*)this->getChildByTag(TAG_LABEL_HIGH_SCORE);
labelHighScore->setString(StringUtils::format("HIGH SCORE: %d", highScore));

}

void GameScene::startAEnermy(float dt)
{
int x = PADDING_SCREEN + rand() % ((int)winSize.width - PADDING_SCREEN * 2);

Sprite * enermy;

if (rand() % 100 < 20)
    {
    enermy = Sprite::create("game/boss.png");
    enermy->setTag(TAG_SPRITE_ENEMY_BOSS_HP);
    }
else
    {
    enermy = Sprite::create("game/enemy.png");
    enermy->setTag(TAG_SPRITE_ENEMY_HP);
    }

enermy->setPosition(Point(x, winSize.height));
this->addChild(enermy);

auto action = Sequence::create(
    MoveBy::create(10.0, Point(0,-winSize.height)),
    CallFuncN::create(CC_CALLBACK_1(GameScene::endAEnermy,this)),
    nullptr
    );

enermy->runAction(action);

enermys.pushBack(enermy);
}

void GameScene::endAEnermy(Ref * sender)
{
auto enermy = (Sprite*)sender;

enermy->runAction(RemoveSelf::create());

enermys.eraseObject(enermy);
}

void GameScene::randSchedule(float dt)
{
this->scheduleOnce(schedule_selector(GameScene::startPowerBall), 0.2 + rand() % 2);
}

void GameScene::initData()
{
winSize = Director::getInstance()->getVisibleSize();
originTouchPos = Point::ZERO;
originPlayerPos = Point::ZERO;
isGetPowerBall = false;
score = 0;
highScore = UserDefault::getInstance()->getIntegerForKey(“highScore”, 0);

powerBalls.clear();
enermys.clear();
bullets.clear();



srand(time(0));
}

void GameScene::update(float dt)
{
//检测能量球碰撞
auto player = this->getChildByTag(TAG_SPRITE_PLAYER);

Sprite * removeBall = Sprite::create();

for (auto ball : powerBalls)
    {
    auto ballRec = ball->getBoundingBox();

    if (player->getBoundingBox().intersectsRect(ballRec))
        {
        isGetPowerBall = true;
        this->scheduleOnce(schedule_selector(GameScene::cancelPowerBall), 5);
        removeBall = ball;
        }
    }
endPowerBall(removeBall);


//检测子弹与敌机的碰撞
auto removeBullet = Sprite::create();
auto removeEnermy = Sprite::create();

for (auto enermy : enermys)
    {
    Rect enermy_rec = Rect(enermy->getPositionX() - 10,
                           enermy->getPositionY() - 10,
                           20,
                           20);

    for (auto bullet : bullets)
        {
        int atk = bullet->getTag();
        int hp = enermy->getTag();

        Rect bullet_rec = bullet->getBoundingBox();

        if (enermy_rec.intersectsRect(bullet_rec))
            {
            removeBullet = bullet;
            
            if (hp - atk > 0)
                {
                CCLOG("hp:%d",hp - atk);
                enermy->setTag(hp-atk);
                addScore(1);
                }
            else
                {
                removeEnermy = enermy;
                addScore(100);
                }

            }
        }
    }    // for enermy
//为消灭敌机添加爆炸效果
if (bullets.contains(removeBullet))
    {
    endABullet(removeBullet);
    }

if (enermys.contains(removeEnermy))
    {
    auto enermy_bomb = ParticleSystemQuad::create("game/explosion.plist");
    enermy_bomb->setPosition(removeEnermy->getPosition());
    enermy_bomb->setScale(0.5);
    this->addChild(enermy_bomb);
    auto action = Sequence::create
        (
        DelayTime::create(1.0),
        CallFuncN::create(CC_CALLBACK_1(GameScene::endABomb, this)),
        nullptr
        );
    enermy_bomb->runAction(action);
    endAEnermy(removeEnermy);
    }


}

void GameScene::endABomb(Ref * sender)
{
auto bomb = (Sprite*)sender;

this->removeChild(bomb);
}

void GameScene::cancelPowerBall(float dt)
{
isGetPowerBall = false;
}

void GameScene::startPowerBall(float dt)
{
CCLOG(“dt: %f”, dt);

auto ball = Sprite::create("game/item.png");

int x = PADDING_SCREEN + rand() % ((int)winSize.width - PADDING_SCREEN * 2 );

ball->setPosition(Point(x, winSize.height));
this->addChild(ball);

auto action = Sequence::create(
    MoveBy::create(5.0, Point(0,-winSize.height)),
    CallFuncN::create(CC_CALLBACK_1(GameScene::endPowerBall,this)),
    nullptr
    );

ball->runAction(action);

powerBalls.pushBack(ball);
}

void GameScene::endPowerBall(Ref * sender)
{
auto ball = (Sprite*)sender;

this->removeChild(ball);

powerBalls.eraseObject(ball);
}

bool GameScene::onTouchBegan(cocos2d::Touch * touch, cocos2d::Event * unused)
{
auto pos = touch->getLocation();
auto player = this->getChildByTag(TAG_SPRITE_PLAYER);

originPlayerPos = player->getPosition();
originTouchPos = pos;
return true;
}

void GameScene::onTouchMoved(cocos2d::Touch * touch, cocos2d::Event * unused)
{
auto touchPos = touch->getLocation();
auto changeTouchPos = touchPos - originTouchPos;

this->getChildByTag(TAG_SPRITE_PLAYER)->setPosition(originPlayerPos + changeTouchPos);
}

void GameScene::startABullet(float dt)
{
auto player = (Sprite*)this->getChildByTag(TAG_SPRITE_PLAYER);

Sprite * bullet;

if (isGetPowerBall)
    {
    bullet = Sprite::create("game/missile_pow.png");
    bullet->setTag(TAG_SPRITE_BULLET_POW);
    }
else
    {
    bullet = Sprite::create("game/missile.png");
    bullet->setTag(TAG_SPRITE_BULLET);
    }


bullet->setPosition(player->getPosition() + Point(-1,20)    );

this->addChild(bullet);

auto action = Sequence::create(
    MoveBy::create(1.0, Point(0, winSize.height - player->getPositionY())),
    CallFuncN::create(CC_CALLBACK_1(GameScene::endABullet,this)),
    nullptr
    );
bullet->runAction(action);

bullets.pushBack(bullet);
}

void GameScene::endABullet(Ref * sender)
{
auto bullet = (Sprite*)sender;

this->removeChild(bullet);

bullets.eraseObject(bullet);
}

void GameScene::initPlayer()
{
auto player = Sprite::create(“game/player.png”);

player->setPosition(Point(winSize.width/2,winSize.height/2));

player->setTag(TAG_SPRITE_PLAYER);

this->addChild(player);
}

void GameScene::initBG()
{
auto bgLayer = Layer::create();
this->addChild(bgLayer);

for (int i = 0; i<10; i++) {
    for (int j = 0; j<11; j++) {
        auto spr = Sprite::create("game/tile.png");
        spr->setAnchorPoint(Point::ZERO);
        spr->setPosition(Point(i * 33, j * 49));
        bgLayer->addChild(spr);
        }
    }

auto action_0 = Sequence::create(
    MoveBy::create(0.5, Point(0, -49)),
    Place::create(Point::ZERO),
    NULL);

auto action_1 = RepeatForever::create(action_0);
bgLayer->runAction(action_1);
}