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:
// 宏,静态的create方法,内部会调用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, 0, 640, 208));
SpriteFrame *frame2 = SpriteFrame::create("floor2.png", Rect(0, 0, 640, 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:
// 宏,静态的create方法,内部会调用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:
// 宏,静态的create方法,内部会调用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);
// 重要~~~若想參与 碰撞,必须绑定一个碰撞标识
getPhysicsBody()->setContactTestBitmask(1);
// 不是动态的刚体 即:是静态的刚体
getPhysicsBody()->setDynamic(false);
// ***************************************
// 开启时钟方法
scheduleUpdate();
return true;
}
#pragma mark - 时钟方法
// 时钟方法,内部会 让 障碍物不断地向左移动
void BottomBar::update(float dt)
{
this->setPositionX(getPositionX()-20);
// 移动到屏幕外边时,就停止消息调度,而且移除
if (getPositionX()<0)
{
unscheduleUpdate();
removeFromParent();
}
}

//
// 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);
}
//
// 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.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:
// 宏,静态的create方法,内部会调用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, 0, 640, 208));
SpriteFrame *frame2 = SpriteFrame::create("floor2.png", Rect(0, 0, 640, 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.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:
// 宏,静态的create方法,内部会调用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:
// 宏,静态的create方法,内部会调用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);
// 重要~~~若想參与 碰撞,必须绑定一个碰撞标识
getPhysicsBody()->setContactTestBitmask(1);
// 不是动态的刚体 即:是静态的刚体
getPhysicsBody()->setDynamic(false);
// ***************************************
// 开启时钟方法
scheduleUpdate();
return true;
}
#pragma mark - 时钟方法
// 时钟方法,内部会 让 障碍物不断地向左移动
void BottomBar::update(float dt)
{
this->setPositionX(getPositionX()-20);
// 移动到屏幕外边时,就停止消息调度,而且移除
if (getPositionX()<0)
{
unscheduleUpdate();
removeFromParent();
}
}
cocos2d_x_08_游戏_FlappyBird的更多相关文章
- 使用HTML5开发Kinect体感游戏
一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
- Unity游戏内版本更新
最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...
- 游戏服务器菜鸟之C#初探一游戏服务
本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...
- iOS审核这些坑,腾讯游戏也踩过
作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...
- 漫谈C#编程语言在游戏领域的应用
0x00 前言 随着微软越来越开放,C#也变得越来越吸引人们的眼球.而在游戏行业中,C#也开始慢慢地获得了关注.这不, 网易绝代双娇手游团队已经全面使用.Net Core支持前后端统一C#开发,跨平台 ...
- 解构C#游戏框架uFrame兼谈游戏架构设计
1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...
- 趣说游戏AI开发:曼哈顿街角的A*算法
0x00 前言 请叫我标题党!请叫我标题党!请叫我标题党!因为下面的文字既不发生在美国曼哈顿,也不是一个讲述美国梦的故事.相反,这可能只是一篇没有那么枯燥的关于算法的文章.A星算法,这个在游戏寻路开发 ...
- 拼图小游戏之计算后样式与CSS动画的冲突
先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...
随机推荐
- 转: Linux 技巧:让进程在后台可靠运行的几种方法
我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终端窗口/网络断开 ...
- [2015编程之美] 第一场A
#1156 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, …, n.树中有n - 1条边,任意两个节点间恰好有一 ...
- iOS使用WSDL2ObjC工具调用Webservice接口
1. 下载 WSDL2ObjC.app https://code.google.com/archive/p/wsdl2objc/downloads 2:下载WSDL文件 2.1一般情况下, 你会得到这 ...
- Android开发优化宝典
I. 网络相关 http头信息带Cache-Control域 确定缓存过期时间 防止重复请求 直接用IP直连,不用域名,策略性跟新本地IP列表. – DNS解析过程耗时在百毫秒左右,并且还有可能存在D ...
- HTML5桌面通知:notification api
1. 为什么需要HTML5的桌面通知 传统的桌面通知可以写一个div放到页面右下角自动弹出来,并通过轮询等等其他方式去获取消息并推送给用户.这种方式有个弊端就是:当我在使用京东 进行购物的时候,我是不 ...
- ArcGIS.Server.9.3和ArcGIS API for JavaScript地图实现Toorbar功能(四)
转自:http://www.cnblogs.com/hll2008/archive/2008/11/22/1338630.html 目的:1.ArcGIS API for JavaScript实现To ...
- HDU 3001 Travelling 3进制状压dp
题意:10个点,若干条边,边有花费,每个点最多走两次,求走过所有点,花费最少 分析:因为每个点最多走两次,所以联想到3进制,然后枚举状态,就行了(我也是照着网上大神的代码写的) #include &l ...
- Appium自动化测试环境的搭建及脚本执行
之前搭建了robotium的环境,并使用了一下,因为需要兼顾到ios的测试,所以这次又搭建了appium的环境.关于Appium的介绍网上有很多了,也可以去它的官网学习,这里就不在赘述了. 具体搭建步 ...
- 【译】 AWK教程指南 1前言
前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...
- CentOS上安装MySQL
1.准备RPM安装包 MySQL-server-5.6.33-1.linux_glibc2.5.x86_64 MySQL-client-5.6.33-1.linux_glibc2.5.x86_64 2 ...