cocos2d_x_08_游戏_FlappyBird

最终效果图:

环境版本:cocos2d-x-3.3beta0 使用内置的物理引擎
计时器没有添加,可参考【cocos2d_x_06_游戏_一个都不能死
主场景
//
//  FlappyBirdScene.h
//  01_cocos2d-x
//
//  Created by beyond on 14-10-7.
//
//

#ifndef ___1_cocos2d_x__FlappyBirdScene__
#define ___1_cocos2d_x__FlappyBirdScene__

#include "cocos2d.h"

#include "FlappyBird.h"
#include "Floor.h"
#include "TopBar.h"
#include "BottomBar.h"

USING_NS_CC;
// 注意 这儿,继承的是 Layer
class FlappyBirdScene : public cocos2d::Layer
{
private:
    // 屏幕尺寸
    Size winSize;
    // 小鸟
    FlappyBird *bird;
    // 地板
    Floor *floor;
    // 顶部圆管
    TopBar *topBar;
    // 底部圆管
    BottomBar *bottomBar;
    
    // 用一个Node 包装起来 所有的圆管,因为圆管在后面,要最先添加;然后才添加floor
    Node *_barContainer;
    
private:
    
    // 每隔 随机的时间,创建并添加一个圆管
    void addTopBar();
    void addBottomBar();
    
    // 临时变量,用于累计 记录 流逝的时间
    int tempTimeDelta;
    // 总共的时间间隔 (即 时间delta累计到 该间隔时,创建并添加一个圆管)
    int totalIntervalTime;
    
    // 每添加一个新的障碍物之后,需重置 用于累计 记录 流逝的时间 的变量
    void resetTempTimeDelta();
    
public:
    // c++里面没有id类型,所以 返回类的实例对象的 指针
    static cocos2d::Scene* createScene();
    // 以下是 不同点:cocos2d-x的 'init' 方法 返回 bool
    // 而cocos2d-iphone 返回 'id' 类型
    virtual bool init();
    // 宏 自动实现 "静态的 create()方法"
    CREATE_FUNC(FlappyBirdScene);
    
    // 时钟方法
    // 在场景的时钟方法中,更新\控制  每一个游戏控制器的时钟方法
    virtual void update(float dt);
    
    // 添加小鸟
    void addBird();
    // 添加地板
    void addFloor();
    
    
    
};

#endif /* defined(___1_cocos2d_x__FlappyBirdScene__) */


//
//  FlappyBirdScene.cpp
//  01_cocos2d-x
//
//  Created by beyond on 14-10-7.
//
//

#include "FlappyBirdScene.h"
#include "GameOverScene.h"



USING_NS_CC;
Scene* FlappyBirdScene::createScene()
{
    // 'scene' 自动释放
    // 使用cocos2d 内置的物理引擎
    auto scene = Scene::createWithPhysics();
    // 显示 调试用的 刚体 边线
    // scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
    // 调整重力加速度
    scene->getPhysicsWorld()->setGravity(Vec2(0,-1000));
    
    // 'layer' 自动释放
    auto layer = FlappyBirdScene::create();
    // 将图层 添加到场景中
    scene->addChild(layer);
    // 返回 填充好图层的 场景
    return scene;
}

// 在 "init" 方法中,实例化自己要用的精灵对象
bool FlappyBirdScene::init()
{
    // 1. 调用父类的init,cpp 没有super,直接写父类名
    if ( !Layer::init() ) return false;
    // 屏幕尺寸
    winSize = Director::getInstance()->getVisibleSize();
    
    
    // 2.添加小鸟
    addBird();
    // 2.添加地板
    addFloor();
    

    // 初始化时,添加一个新的圆管
    tempTimeDelta = totalIntervalTime;
    
    // 开启消息调度
    scheduleUpdate();
    // ********************************************
    // 物理碰撞检测 「PhysicsContact」
    auto listener = EventListenerPhysicsContact::create();
    // 开始碰撞 游戏结束
    listener->onContactBegin = [this](PhysicsContact & contact){

        // 取消 消息调度
        this->unscheduleUpdate();
        // 切换至Game Over场景
        Director::getInstance()->replaceScene(GameOverScene::createScene());
        return true;
    };
    // 向事件分发器,注册listener
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener,this);
    // ********************************************
    // 用户单点触摸 jump high 【TouchOneByOne】
    auto touchListener = EventListenerTouchOneByOne::create();
    // 开始触摸 原地 跳一下
    touchListener->onTouchBegan = [this](Touch * t,Event * e){
        // 每点一下,原地跳一下
        bird->getPhysicsBody()->setVelocity(Vec2(0,400));
        log(">>>click<<<");
        return false;
    };
    // 向事件分发器,注册listener
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(touchListener,this);
    return true;
}

// 在 "init" 方法中,添加小鸟
void FlappyBirdScene::addBird()
{
    //**************************************
    bird = FlappyBird::create();
    // 屏幕中间
    bird->setPosition(winSize.width/2,winSize.height/2);
    // 添加到Layer
    addChild(bird);
}
// 在 "init" 方法中,添加地板
void FlappyBirdScene::addFloor()
{
    //**************************************
    floor = Floor::create();
    // 屏幕底部
    floor->setPosition(winSize.width/2,floor->getContentSize().height/2);
    // 添加到Layer
    addChild(floor);
}
#pragma mark - 时钟方法
void FlappyBirdScene::update(float dt)
{
    // 每隔一段时间,添加 上圆管和下圆管
    // 临时变量,用于累计 记录 流逝的时间
    tempTimeDelta++;
    // 总共的时间间隔 (即 时间delta累计到 该间隔时,创建并添加一个障碍物)
    if (tempTimeDelta >= totalIntervalTime)
    {
        // 每添加一个新的障碍物之后,需重置 用于累计 记录 流逝的时间 的变量
        resetTempTimeDelta();
        // 每隔 随机的时间,创建并添加一个障碍物
        addBottomBar();
        addTopBar();

    }
}
// 每添加一个新的障碍物之后,需重置 用于累计 记录 流逝的时间 的变量
void FlappyBirdScene::resetTempTimeDelta()
{
    tempTimeDelta = 0;
    totalIntervalTime = (rand()%50) + 20;
}
// 创建 并 添加 底部圆管  (在随机的 时间 间隔 之后 )
void FlappyBirdScene::addBottomBar()
{
    bottomBar = BottomBar::create();
    addChild(bottomBar);
    // 屏幕外
    bottomBar->setPositionX(winSize.width );
    // 注意 底部圆管的y值是 在地板之上
    // 即 bottomBar的半高
    bottomBar->setPositionY(bottomBar->getContentSize().height/2 + floor->getContentSize().height);
}
// 创建 并 添加 顶部圆管  (在随机的 时间 间隔 之后 )
void FlappyBirdScene::addTopBar()
{
    // 开口大小 为 70 ~ 130
    int margin = (rand()%60) + 70;
    
    topBar = TopBar::create();
    addChild(topBar);
    // 屏幕外
    topBar->setPositionX(winSize.width );
    // 注意 顶部圆管的y值是
    // 即 底部圆管的高 + 400 + 自己的半高 + 地板的高
    topBar->setPositionY(topBar->getContentSize().height/2 + margin +bottomBar->getContentSize().height +floor->getContentSize().height);
}


封闭的精灵
Bird
//
//  FlappyBird.h
//  01_cocos2d-x
//
//  Created by beyond on 14-10-7.
//
//

#ifndef ___1_cocos2d_x__FlappyBird__
#define ___1_cocos2d_x__FlappyBird__

#include <cocos2d.h>

USING_NS_CC;

class FlappyBird:public Sprite {
    
public:
    // 宏,静态的create方法,内部会调用init方法
    CREATE_FUNC(FlappyBird);
    virtual bool init();
    
};

#endif /* defined(___1_cocos2d_x__FlappyBird__) */


//
//  FlappyBird.cpp
//  01_cocos2d-x
//
//  Created by beyond on 14-10-7.
//
//

#include "FlappyBird.h"


bool FlappyBird::init()
{
    // 父类的init方法
    Sprite::init();
    // 执行 帧动画 一直拍打翅膀 扑腾着飞 RepeatForever
    setTexture("bird.png");
    // 图片的尺寸
    Size s = Size(34,34);
    // 精灵的大小
    setContentSize(s);
    
    // 设置物理世界的刚体body
    setPhysicsBody(PhysicsBody::createBox(s));
    // 刚体不允许 旋转
    getPhysicsBody()->setRotationEnable(false);
    // 重要~~~若想参与 碰撞,必须绑定一个碰撞标识
    getPhysicsBody()->setContactTestBitmask(1);
    
    return true;
}


地板Floor
//
//  Floor.h
//  01_cocos2d-x
//
//  Created by beyond on 14-10-7.
//
//  地板

#ifndef ___1_cocos2d_x__Floor__
#define ___1_cocos2d_x__Floor__

#include <cocos2d.h>

USING_NS_CC;

class Floor:public Sprite {
    
public:
    // 宏,内部会调用init方法
    CREATE_FUNC(Floor);
    virtual bool init();
    
};

#endif /* defined(___1_cocos2d_x__Floor__) */


//
//  Floor.cpp
//  01_cocos2d-x
//
//  Created by beyond on 14-10-7.
//
//

#include "Floor.h"

bool Floor::init()
{
    // 父类的init方法
    Sprite::init();
    // 地板图片
    setTexture("floor.png");
    // 图片的尺寸
    Size s = Size(640,208);
    // 精灵的大小
    setContentSize(s);

    // 设置物理世界的刚体body
    setPhysicsBody(PhysicsBody::createBox(s));
    // 刚体不允许 旋转
    getPhysicsBody()->setRotationEnable(false);
    // 重要~~~若想参与 碰撞,必须绑定一个碰撞标识
    getPhysicsBody()->setContactTestBitmask(1);
    // 不是动态的刚体 即:是静态的刚体
    getPhysicsBody()->setDynamic(false);


    // *****************************
    // 播放帧动画
    // 容器,数组,里面存放的是精灵帧
    Vector<SpriteFrame*> vec;
    SpriteFrame *frame1 = SpriteFrame::create("floor.png",Rect(0,640,208));
    SpriteFrame *frame2 = SpriteFrame::create("floor2.png",208));
    // 将小精灵帧  加入容器
    vec.pushBack(frame1);
    vec.pushBack(frame2);
    // 创建 Animation
    Animation *animation = Animation::createWithSpriteFrames(vec,0.1f);
    // 创建 Animate
    Animate *animate = Animate::create(animation);
    // 执行序列帧动画
    Sequence *seq = Sequence::create(animate,animate->reverse(),NULL);
    runAction(RepeatForever::create(seq));
    
    return true;
}


TopBar和BottomBar还可以抽取
//
//  TopBar.h
//  01_cocos2d-x
//
//  Created by beyond on 14-10-7.
//
//  圆管 内部分为上圆管和下圆管

#ifndef ___1_cocos2d_x__TopBar__
#define ___1_cocos2d_x__TopBar__


#include <cocos2d.h>

USING_NS_CC;

class TopBar:public Sprite {
public:
    // 宏,内部会调用init方法
    CREATE_FUNC(TopBar);
    virtual bool init();
    // 时钟方法,内部会 让 障碍物不断地向左移动
    void update(float dt);
};


#endif /* defined(___1_cocos2d_x__TopBar__) */


//
//  TopBar.cpp
//  01_cocos2d-x
//
//  Created by beyond on 14-10-7.
//
//

#include "TopBar.h"


bool TopBar::init()
{
    // 父类的init方法
    Sprite::init();

    setTexture("top_bar2.png");
    // 图片的尺寸
    Size s = Size(52,450);
    // 精灵的大小
    setContentSize(s);
    
    // 设置物理世界的刚体body
    setPhysicsBody(PhysicsBody::createBox(s));
    // 刚体不允许 旋转
    getPhysicsBody()->setRotationEnable(false);
    // 重要~~~若想参与 碰撞,必须绑定一个碰撞标识
    getPhysicsBody()->setContactTestBitmask(1);
    // 不是动态的刚体 即:是静态的刚体
    getPhysicsBody()->setDynamic(false);
    // ***************************************
    // 开启时钟方法
    scheduleUpdate();
    return true;
}
#pragma mark - 时钟方法
// 时钟方法,内部会 让 障碍物不断地向左移动
void TopBar::update(float dt)
{
    this->setPositionX(getPositionX()-20);
    // 移动到屏幕外边时,就停止消息调度,并且移除
    if (getPositionX()<0)
    {
        log("remove top bar");
        unscheduleUpdate();
        removeFromParent();
    }
}


//
//  BottomBar.h
//  01_cocos2d-x
//
//  Created by beyond on 14-10-7.
//
//  圆管 内部分为上圆管和下圆管

#ifndef ___1_cocos2d_x__BottomBar__
#define ___1_cocos2d_x__BottomBar__


#include <cocos2d.h>

USING_NS_CC;

class BottomBar:public Sprite {
public:
    // 宏,内部会调用init方法
    CREATE_FUNC(BottomBar);
    virtual bool init();
    
    // 时钟方法,内部会 让 底部圆管 不断地向左移动
    void update(float dt);
    
};


#endif /* defined(___1_cocos2d_x__BottomBar__) */


//
//  BottomBar.cpp
//  01_cocos2d-x
//
//  Created by beyond on 14-10-7.
//
//

#include "BottomBar.h"


bool BottomBar::init()
{
    // 父类的init方法
    Sprite::init();
    
    setTexture("bottom_bar.png");
    // 图片的尺寸
    Size s = Size(52,319);
    // 精灵的大小
    setContentSize(s);
    
    // 设置物理世界的刚体body
    setPhysicsBody(PhysicsBody::createBox(s));
    // 刚体不允许 旋转
    getPhysicsBody()->setRotationEnable(false);
    // 重要~~~若想参与 碰撞,内部会 让 障碍物不断地向左移动
void BottomBar::update(float dt)
{
    this->setPositionX(getPositionX()-20);
    // 移动到屏幕外边时,并且移除
    if (getPositionX()<0)
    {
        unscheduleUpdate();
        removeFromParent();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是