cocos2d_x_08_遊戲_FlappyBird,cocos2dx權威指南
最終:
環境版本: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;// 注意 這兒,繼承的是 Layerclass 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(); }}
FLAPPY BIRD中文是什遊戲
flappy bird(瘋狂的小鳥或像素鳥)由一位來自越南河內的獨立遊戲開發人員阮哈東開發,是一款形式簡易但難度極高的休閒遊戲。簡單並不粗糙的8位元像素畫面、超級瑪麗遊戲中的綠色通道、眼神有點獃滯的小鳥和幾朵白雲便構成了遊戲的一切。你需要不斷控制點擊螢幕的頻率來調節小鳥的飛行高度和降落速度,讓小鳥順利地通過畫面右端的通道,如果你不小心擦碰到了通道的話,遊戲便宣告結束。
通過pp助手可以直接下載,還有輔助刷分教程
flappy bird什遊戲
lappy bird由一位來自越南河內的獨立遊戲開發人員阮哈東開發,是一款簡易卻難度極高的休閒遊戲。簡單並不粗糙的8位元像素畫面、超級瑪麗遊戲中的綠色通道、眼神有點獃滯的小鳥和幾朵白雲便構成了遊戲的一切。你需要不斷控制點擊螢幕的頻率來調節小鳥的飛行高度和降落速度,讓小鳥順利的通過畫面右端的通道,如果你不小心擦碰到了通道的話,遊戲便宣告結束。2月10日訊息,據國外媒體報道,近期火爆的手機遊戲《Flappy Bird》已被開發人員本人從蘋果應用網店下架。屆時國內使用者仍可以通過 百度手機小幫手,PP助手下載安裝。[1]