cocos2dx实例开发之flappybird(入门版)

cocos2dx社区里有个系列博客完整地复制原版flappybird的所有特性,不过那个代码写得比较复杂,新手学习起来有点捉摸不透,这里我写了个简单的版本。演示如下:

创建项目

VS2013+cocos2dx 3.2创建win32项目,由于只是学习,所以没有编译为安卓、ios或者WP平台的可执行文件。

最终的项目工程结构如下:

很简单,只有三个类,预加载类,游戏主场景类,应用代理类,新手刚入门喜欢将很多东西都写在尽量少的类里面。

游戏设计游戏结构如下,游戏包含预加载场景和主场景,主场景中包含背景、小鸟、管道和各种UI界面。

开发步骤1,素材收集

从apk文件里提取出来一些图片和音频,并用TexturePatcher拼成大图,导出plist文件。

2,预加载场景

新建一个LoadingScene,在里面添加一张启动图片,通过异步加载纹理并回调的方式把所有图片素材、小鸟帧动画以及音频文件都加入到缓存,加载完毕后跳转到游戏主场景。

//添加加载回调函数,用异步加载纹理Director::getInstance()->getTextureCache()->addImageAsync("game.png", CC_CALLBACK_1(LoadingScene::loadingCallBack, this));void LoadingScene::loadingCallBack(Texture2D *texture){//预加载帧缓存纹理SpriteFrameCache::getInstance()->addSpriteFramesWithFile("game.plist", texture);//预加载帧动画auto birdAnimation = Animation::create();birdAnimation->setDelayPerUnit(0.2f);birdAnimation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird1.png"));birdAnimation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird2.png"));birdAnimation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird3.png"));AnimationCache::getInstance()->addAnimation(birdAnimation, "birdAnimation"); //将小鸟动画添加到动画缓存//预加载音效SimpleAudioEngine::getInstance()->preloadEffect("die.mp3");SimpleAudioEngine::getInstance()->preloadEffect("hit.mp3");SimpleAudioEngine::getInstance()->preloadEffect("point.mp3");SimpleAudioEngine::getInstance()->preloadEffect("swooshing.mp3");SimpleAudioEngine::getInstance()->preloadEffect("wing.mp3");//加载完毕跳转到游戏场景auto gameScene = GameScene::createScene();TransitionScene *transition = TransitionFade::create(0.5f, gameScene);Director::getInstance()->replaceScene(transition);}3,游戏主场景

3.1,背景和logo

用图片精灵即可

//添加游戏背景Sprite *backGround = Sprite::createWithSpriteFrameName("bg.png");backGround->setPosition(visibleOrigin.x + visibleSize.width / 2, visibleOrigin.y + visibleSize.height / 2);this->addChild(backGround);//logoauto gameLogo = Sprite::createWithSpriteFrameName("bird_logo.png");gameLogo->setPosition(visibleOrigin.x + visibleSize.width / 2, visibleOrigin.y + visibleSize.height / 2+100);gameLogo->setName("logo");this->addChild(gameLogo);logo在游戏开始后要隐藏掉。

3.2,小鸟//小鸟birdSprite = Sprite::create();birdSprite->setPosition(visibleOrigin.x + visibleSize.width / 3, visibleOrigin.y + visibleSize.height / 2);this->addChild(birdSprite);auto birdAnim = Animate::create(AnimationCache::getInstance()->animationByName("birdAnimation"));birdSprite->runAction(RepeatForever::create(birdAnim)); //挥翅动画auto up = MoveBy::create(0.4f, Point(0, 8));auto upBack = up->reverse();if (gameStatus == GAME_READY){swingAction = RepeatForever::create(Sequence::create(up, upBack, NULL));birdSprite->runAction(swingAction); //上下晃动动画}在准备界面下除了有扇翅膀的动作,,还有上下浮动的动作。3.3,地板

地板的左移是用两张错位的地板图片循环左移实现的。需要用到自定义调度器,注意调节移动速度。

//添加两个landland1 = Sprite::createWithSpriteFrameName("land.png");land1->setAnchorPoint(Point::ZERO); land1->setPosition(Point::ZERO); this->addChild(land1, 10); //置于最顶层land2 = Sprite::createWithSpriteFrameName("land.png");land2->setAnchorPoint(Point::ZERO);land2->setPosition(Point::ZERO);this->addChild(land2, 10);Size visibleSize = Director::getInstance()->getVisibleSize();//两个图片循环移动land1->setPositionX(land1->getPositionX() – 1.0f);land2->setPositionX(land1->getPositionX() + land1->getContentSize().width – 2.0f);if (land2->getPositionX() <= 0)land1->setPosition(Point::ZERO);3.4,水管

一组水管由上下2半根组成,用Node包起来,弄个vector容器添加两组管道,每次出现在屏幕中的管子只有两组,当一组消失在屏幕范围内则重设置其横坐标,需要提前计算好各种间距或者高度。

发现一种久违的感动。

cocos2dx实例开发之flappybird(入门版)

相关文章:

你感兴趣的文章:

标签云: