1948人阅读
cocos2d-x(14)
鉴于最近在学习cocos2d-x开发手游,对于学习过程中的一些东西做个总结,也记录下学习历程,同时分享些项目源码来和大家一起学习。
第一次写系列教程,可能中间有疏漏的,看到的还请给提个醒,不好的也多多吐槽,以便自己能更好的以后的开发中基类经验。
此次教程分享下豪华版的飞机大战,老规矩,先上图:
介绍下开发环境:cocos2d-x3.2 alpha + Ubuntu14.04 + eclipse + 命令行终端 + android
用的引擎为3.2版本的,3.0以上的应该都能运行跑下来,windows下的开发环境只需新建个工程,将本工程中的Classes和Resources文件夹替换掉,同时写好编译的文件就可以运行。
Classes中的主要文件如下,文件不多,但是也够学习下3.0的特性:
工程中的主要场景为GameScene,GameLayer层中控制整个游戏的逻辑,同时其他游戏辅助层都添加到GameLayer层中,来构成整个游戏逻辑及画面。
接下来会逐个文件进行介绍,同时在游戏开发中用到的设计模式也会进行穿插的介绍,以便以后开发中也能借鉴好的设计模式来开发出结构清晰代码整洁的项目。
教程最后会附上源码,这是开源的力量,共同学习、共同进步。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:73885次
积分:1440
积分:1440
排名:千里之外
原创:36篇
转载:16篇
评论:125条
(7)(5)(14)(2)(22)(1)(1)2962人阅读
cocos2d-x(14)
最后一篇讲一下游戏中的主要逻辑判断,在上面的工作都做充分准备后,游戏主要逻辑将变得特别清晰,接下来你会看到所有的逻辑都是那么的清晰自然,因为前面已经做好了充分的准备工作,这里只是整合了前面的工作,稍微加入了一些游戏判断元素。
同时源码会在文章最后给出链接地址,源码托管在github上,所有的东西都是开源免费的,在现在的大环境下,开源才是王道,分享才能双赢,我始终觉得这是对的,你有一种思想我有一种思想,交流分享后我们都有了两种思想,何乐而不为呢。
好了,回归正题,游戏主要判断逻辑都在GameScene场景中,其中包括了GameLayer层,在层中进行游戏的逻辑判断。
来看一下GameScene.h的内容:
#include &cocos2d.h&
#include &PlaneLayer.h&
#include &BulletSprite.h&
#include &EnemyLayer.h&
USING_NS_CC;
class GameLayer: public cocos2d::Layer {
//创建GameLayer层所属的场景
static cocos2d::Scene* createScene();
virtual bool init();
//在onEnter执行完成之后调用此函数
virtual void onEnterTransitionDidFinish();
CREATE_FUNC(GameLayer);
//根据每帧来更新游戏
void gameUpdate(float dt);
//子弹碰撞检测
bool bulletCollisionEnemy(Sprite* pBullet);
//飞机碰撞检测
bool enemyCollisionPlane();
//menu回调函数
void menuCloseCallback(cocos2d::Ref* pSender);
PlaneLayer *planeL//飞机层
BulletSprite *bulletS//子弹层
EnemyLayer *enemyL//敌机层
int getRand(int start, int end);//获取从start到end的随机数
不做太多解释,直接看各个函数的具体实现,GameScene.cpp#include &GameScene.h&
* 创建场景,并添加GameLayer层
cocos2d::Scene* GameLayer::createScene() {
auto scene = Scene::create();
auto layer = GameLayer::create();
scene-&addChild(layer);
bool GameLayer::init() {
if (!Layer::init()) {
this-&setTouchEnabled(true);//设置层中可触摸点击
Size winSize = Director::getInstance()-&getWinSize();
* 随即加载背景图片,
char buff[15];
int id = getRand(1, 5);//返回1~5之间的随机数
sprintf(buff, &img_bg_%d.jpg&, id);
auto over = Sprite::create(buff);
over-&setPosition(Point(winSize.width / 2, winSize.height / 2));
this-&addChild(over);
* 返回从start到end的随机整数
int GameLayer::getRand(int start, int end) {
gettimeofday(&tv, NULL);
unsigned long int rand_seed = tv.tv_sec * 1000 + tv.tv_usec / 1000;//随机数种子
srand(rand_seed);
float i = CCRANDOM_0_1() * (end - start + 1) +
return (int)
* 在onEnter函数之后调用
* 功能:创建飞机、子弹、敌机并添加到层中
void GameLayer::onEnterTransitionDidFinish() {
planeLayer = PlaneLayer::create();
this-&addChild(planeLayer);
bulletSprite = BulletSprite::create();
this-&addChild(bulletSprite);
enemyLayer = EnemyLayer::create();
this-&addChild(enemyLayer);
//设置每帧时都调用gameUpdate函数
this-&schedule(schedule_selector(GameLayer::gameUpdate));
//添加menu,并设置回调函数
Size visibleSize = Director::getInstance()-&getVisibleSize();
Point origin = Director::getInstance()-&getVisibleOrigin();
auto closeItem = MenuItemImage::create(&CloseNormal.png&,
&CloseSelected.png&,
CC_CALLBACK_1(GameLayer::menuCloseCallback, this));
closeItem-&setPosition(
origin.x + visibleSize.width
- closeItem-&getContentSize().width / 2,
origin.y + closeItem-&getContentSize().height / 2));
auto menu = Menu::create(closeItem, NULL);
menu-&setPosition(Point::ZERO);
this-&addChild(menu, 1);
* menu的回调函数
void GameLayer::menuCloseCallback(Ref* pSender) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
MessageBox(&You pressed the close button. Windows Store Apps do not implement a close button.&,&Alert&);
Director::getInstance()-&end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
* 子弹和敌机碰撞检测函数
bool GameLayer::bulletCollisionEnemy(Sprite* pBullet) {
//遍历场景中的所有敌机,看子弹是否和敌机的包装矩形有重叠
for (auto& eEnemy : enemyLayer-&vecEnemy) {
EnemySprite* pEnemySprite = (EnemySprite*) eE
//判断矩形是否有重叠
if (pBullet-&boundingBox().intersectsRect(
pEnemySprite-&getBoundingBox())) {
if (1 == pEnemySprite-&getLife()) {
pEnemySprite-&loseLife();
enemyLayer-&blowupEnemy(pEnemySprite);
pEnemySprite-&loseLife();
//有重叠则移除子弹
bulletSprite-&removeBullet(pBullet);
* 在每帧时都进行游戏逻辑检测,
* 检测子弹和敌机是否有碰撞
* 检测主角飞机和敌机是否有碰撞
void GameLayer::gameUpdate(float dt) {
bool bMoveButt =
for (auto& eButtle : bulletSprite-&vecBullet) {
Sprite* pBullet = (Sprite*) eB
bMoveButt = bulletCollisionEnemy(pBullet);
if (bMoveButt) {
enemyCollisionPlane();
* 敌机和主角飞机是否有碰撞
* 遍历所有敌机进行检测
bool GameLayer::enemyCollisionPlane() {
Sprite* pPlane = (Sprite*) planeLayer-&getChildByTag(AIRPLANE);
for (auto& eEnemy : enemyLayer-&vecEnemy) {
EnemySprite* pEnemySprite = (EnemySprite*) eE
if (pPlane-&boundingBox().intersectsRect(pEnemySprite-&getBoundingBox())
&& pEnemySprite-&getLife() & 0) {
//TODO,DO WHAT YOU WANT
this-&unscheduleAllSelectors();
this-&bulletLayer-&StopBulletShoot();
this-&planeLayer-&blowUp();
在各个关键的地方都有详细注释,了解引擎的都应该可以看明白的,有具体问题的可以留言。
最后附上源码的下载链接,托管在github上,本人最烦的就是下载个东西还TM的需要积分,比如CSDN上的资源,你分享就分享吧,还得给你个积分来下载,要不你就别上传,既然开源,就不要想为自己谋多少利,可能又要被喷,但是我始终坚信开源才是王道,不喜务喷。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:73887次
积分:1440
积分:1440
排名:千里之外
原创:36篇
转载:16篇
评论:125条
(7)(5)(14)(2)(22)(1)(1)