如题
我写的是一个打飞机的游戏, 移植后屏幕上的飞机一闪一闪 求解
主要代码如下:
#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);
}