cocos2dx之飞机大战简单版

2015年03月24日 14:12 0 点赞 0 评论 更新于 2025-11-21 18:25

今天,我将为大家详细介绍如何使用Cocos2d-x实现简单版飞机大战游戏,包括创建背景、飞机、子弹精灵,让它们动起来,以及进行碰撞测试。当子弹和敌方飞机碰撞时,会销毁相应的精灵并添加一个爆炸的精灵。

创建背景、飞机、子弹精灵

1. 在 GameScene.h 中添加成员

GameScene.h 文件里,我们需要添加一些成员变量和函数声明,用于后续的游戏逻辑实现。以下是具体代码:

GameScene();
~GameScene();
void addMonster();
void addBullet1();
void GameLogic(float dt);
void GameLogicaddBullet1(float dt);
void GameLogicaddBullet2(float dt);
void spriteMoveFinished(CCNode *sender);
void keyArrowClicked(int arrow);
void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
cocos2d::CCArray * _monsters;
cocos2d::CCArray * _bullets;
cocos2d::CCSprite * player;
cocos2d::CCSprite * bgSprite1;
cocos2d::CCSize visibleSize;
cocos2d::CCPoint origin;
int bgHeight;
int monsterSpeed;

2. 在 GameScene::init() 中添加代码

GameScene 类的 init() 方法里,我们要完成背景精灵和飞机精灵的创建。以下是具体实现代码:

// 获取可见区域大小和原点
visibleSize = CCDirector::sharedDirector()->getVisibleSize();
origin = CCDirector::sharedDirector()->getVisibleOrigin();

// 计算背景高度
bgHeight = (visibleSize.height + origin.y);

// 创建背景精灵
bgSprite1 = CCSprite::create("background.png");
bgSprite1->setAnchorPoint(ccp(0.5, 0));
bgSprite1->setPosition(ccp(visibleSize.width / 2 + origin.x, bgHeight));
this->addChild(bgSprite1, 0);

// 创建飞机精灵
player = CCSprite::create("player.png");
player->setPosition(ccp(origin.x + visibleSize.width / 2, origin.y + player->getContentSize().height / 2));
this->addChild(player, 1);

通过上述代码,我们成功创建了一个背景精灵和一个飞机精灵。由于背景和飞机在游戏中通常只有一个,所以我们将它们设为类的成员变量。

3. 处理子弹和敌方飞机

由于子弹和敌方飞机在游戏中会有多个,我们将它们的添加逻辑封装成函数,并在 init() 方法中设置一个计时器,通过计时器来控制每隔多少秒调用一次添加函数。

添加敌方飞机的函数

void GameScene::addMonster() {
// 创建敌方飞机精灵
CCSprite* pMonster = CCSprite::create("monster.png");

// 计算敌方飞机出现位置的x值范围
int minX = pMonster->getContentSize().width / 2;
int maxX = visibleSize.width - pMonster->getContentSize().width / 2;
int rangeX = maxX - minX;
int actualX = (rand() % rangeX) + minX;

// 设置敌方飞机的初始位置
pMonster->setPosition(ccp(actualX, origin.y + visibleSize.height - pMonster->getContentSize().height));
this->addChild(pMonster, 1);

// 计算敌方飞机移动所需时间
int time = (origin.y + visibleSize.height - pMonster->getContentSize().height) / monsterSpeed;

// 创建移动动作
CCMoveTo *actionMove = CCMoveTo::create(time, ccp(actualX, origin.y + pMonster->getContentSize().height / 2));
CCCallFuncN *actionMoveDone = CCCallFuncN::create(this, callfuncN_selector(GameScene::spriteMoveFinished));
pMonster->runAction(CCSequence::create(actionMove, actionMoveDone, NULL));
}

在这个函数中,我们首先创建了一个敌方飞机精灵,其出现位置的 x 值是在最大 x 值和最小 x 值之间随机生成的。然后,我们为敌方飞机设置了移动动作,当移动完成后会调用 spriteMoveFinished 函数进行后续处理。

添加子弹的函数

void GameScene::addBullet1() {
// 创建子弹精灵
CCSprite* pBullet = CCSprite::create("bullet1.png");

// 获取飞机的位置
float x = player->getPositionX();
float y = player->getPositionY();

// 设置子弹的初始位置
pBullet->setPosition(ccp(x, y + 40));
this->addChild(pBullet, 2);

// 创建子弹移动动作
CCMoveTo *actionMove = CCMoveTo::create(1, ccp(x, origin.y + visibleSize.height - pBullet->getContentSize().height));
CCCallFuncN *actionMoveDone = CCCallFuncN::create(this, callfuncN_selector(GameScene::spriteMoveFinished));
pBullet->runAction(CCSequence::create(actionMove, actionMoveDone, NULL));
}

在这个函数中,我们创建了一个子弹精灵,并将其位置设置在飞机的上方。然后,为子弹设置了移动动作,当子弹移动到屏幕顶部时会调用 spriteMoveFinished 函数进行处理。

综上所述,我们完成了简单版飞机大战游戏中背景、飞机、子弹和敌方飞机精灵的创建和移动逻辑。后续还需要实现碰撞检测和爆炸效果等功能,以完善整个游戏。

作者信息

feifeila

feifeila

共发布了 3994 篇文章