cocos2d-x 《Flappy Bird 》二、物理世界搭建(Box2d物理引擎)

来源:互联网 发布:知行理工app最新 编辑:程序博客网 时间:2024/05/17 01:47

《flappy bird》是由来自越南的独立游戏开发者Dong Nguyen所开发的作品,游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍,而这只鸟其实是根本不会飞的……所以玩家每点击一下小鸟就会飞高一点,不点击就会下降,玩家必须控制节奏,拿捏点击屏幕的时间点,让小鸟能在落下的瞬间跳起来,恰好能够通过狭窄的水管缝隙,只要稍一分神,马上就会失败阵亡。

图片资源提取后使用PS5 处理,Zwoptex 重新打包。

======================================================================================

开发环境:

  Cocos2d-x  cocos2d-x-2.2.1

  MacBook Pro 13'  10.9

  Xcode 5.0.2

  iPhone5   IOS 7.0.4

======================================================================================

一、效果图



二、小鸟的实现

////  Bird.h//  Flappy////  Created by yuzai on 14-2-12.////#ifndef __Flappy__Bird__#define __Flappy__Bird__#include "cocos2d.h"#include "Box2D/Box2D.h"using namespace cocos2d;class Bird:public cocos2d::CCNode{public:    Bird(void);    virtual ~Bird(void);        virtual void onEnter();    virtual void onExit();            CREATE_FUNC(Bird);    b2Body* m_pBody;//物理private:    CCSprite *body;        };#endif /* defined(__Flappy__Bird__) */

三、物理世界搭建

////  GameLayer.h//  Flappy////  Created by yuzai on 14-2-12.////#ifndef __Flappy__GameLayer__#define __Flappy__GameLayer__#include "cocos2d.h"#include "Box2D.h"#include "Bird.h"using namespace cocos2d;class GameLayer:public cocos2d::CCLayer{public:GameLayer(void);~GameLayer(void);    //背景    CCSprite *bg;    //路    CCSprite *land1;    CCSprite *land2;    //水管    CCSprite *pipe1;    CCSprite *pipe2;    CCSprite *pipe3;    CCSprite *pipe4;    Bird *bird;    void setBackgroud(unsigned int bg);CREATE_FUNC(GameLayer);virtual bool init();    virtual void update(float time);    void initPhysics(); private:    b2World* world;//定义物理世界    b2BodyDef groundBodyDef;//定义物体(世界的)            };#endif /* defined(__Flappy__GameLayer__) */

////  GameLayer.cpp//  Flappy////  Created by yuzai on 14-2-12.////#include "GameLayer.h"#define PTM_RATIO 32.0  //设定每32像素为一米GameLayer::GameLayer(void){    }GameLayer::~GameLayer(void){     CC_SAFE_DELETE(world);}bool GameLayer::init(){    if (!CCLayer::init())    {        return false;    }    //屏幕宽高比 首先 适配IPHONE5    CCSize frameSize = CCEGLView::sharedOpenGLView()->getFrameSize();    float scales = (float) frameSize.width/ 288;    CCSize winSize=CCDirector::sharedDirector()->getWinSize();    CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("res/default.plist");    CCSpriteFrame *bg1Frame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("bg_day.png");    bg=CCSprite::create();    bg->setAnchorPoint(ccp(0, 0));    bg->setDisplayFrame(bg1Frame);    bg->setScale(scales);    bg->setPosition(ccp(0,0));    addChild(bg);        //2.陆地        CCSpriteFrame *landFrame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("land.png");    land1=CCSprite::create();    land1->setAnchorPoint(ccp(0, 0));    land1->setDisplayFrame(landFrame);    land1->setScale(scales);    land1->setPosition(ccp(0, 0));    addChild(land1,1);    land2=CCSprite::create();    land2->setAnchorPoint(ccp(0, 0));    land2->setDisplayFrame(landFrame);    land2->setScale(scales);    land2->setPosition(ccp(frameSize.width, 0));    addChild(land2,1);        //3.添加小鸟    bird=new Bird();    bird->setPosition(winSize.width/2,winSize.height/2);    bird->setScale(scales);    addChild(bird,2);    //4.水管        //5.物理世界    this->initPhysics();    // Define the dynamic body.    //Set up a 1m squared box in the physics world    b2BodyDef bodyDef;    bodyDef.type = b2_dynamicBody;//小鸟是运动的 所有设置为动态刚体    bodyDef.position.Set(bird->getPositionX()/PTM_RATIO,bird->getPositionY()/PTM_RATIO);//转化真实世界坐标  Pix/PTM_RATIO    bodyDef.userData=bird;    bird->m_pBody=world->CreateBody(&bodyDef);        // Define another box shape for our dynamic body.    b2PolygonShape dynamicBox;    dynamicBox.SetAsBox(0.5f,0.5f);//These are mid points for our 1m box        // Define the dynamic body fixture.    b2FixtureDef fixtureDef;    fixtureDef.shape = &dynamicBox;    fixtureDef.density = 1.0f;    fixtureDef.friction = 0.3f;    fixtureDef.restitution=0.8f;    bird->m_pBody->CreateFixture(&fixtureDef);            scheduleUpdate();    return true;}//改变背景void GameLayer::setBackgroud(unsigned int bg){        switch (bg) {        case 1:        {                    }            break;                    default:            break;    }}void GameLayer::update(float time){    //land移动逻辑    CCSize frameSize = CCEGLView::sharedOpenGLView()->getFrameSize();    float dif=4;    land1->setPosition(ccp(land1->getPositionX()-dif,land1->getPositionY()));    land2->setPosition(ccp(land2->getPositionX()-dif,land2->getPositionY()));    if (land2->getPositionX()<0) {        float temp=land2->getPositionX()+frameSize.width;        land1->setPosition(ccp(temp,land2->getPositionY()));    }    if (land1->getPositionX()<0) {        float temp=land1->getPositionX()+frameSize.width;        land2->setPosition(ccp(temp,land1->getPositionY()));    }              float32 timeStep = 1.0f / 60.0f;    int32 velocityIterations = 6;        int32 positionIterations = 2;            world->Step(timeStep, velocityIterations, positionIterations);                b2Vec2 position = bird->m_pBody->GetPosition();                float32 angle = bird->m_pBody->GetAngle();                for (b2Body *body=world->GetBodyList(); body!=NULL; body=body->GetNext()) {            Bird *bir=(Bird*)body->GetUserData();            if (bir!=NULL) {                bir->setPosition(ccp(position.x*PTM_RATIO, position.y*PTM_RATIO));                bir->setRotation(CC_RADIANS_TO_DEGREES(body->GetAngle())*-1);            }        }                printf("%4.2f %4.2f %4.2f\n", position.x, position.y, angle);    }//初始化物理引擎的方法void GameLayer::initPhysics(){            //0.屏幕大小    CCSize winSize=CCDirector::sharedDirector()->getWinSize();    //1.重力向量    b2Vec2 gravity=b2Vec2(0.0f, -10.0f);//模拟真实世界        world = new b2World(gravity);        //2.设置是否持续物理模拟    world->SetAllowSleeping(true);        world->SetContinuousPhysics(true);        //3.设置世界盒子的位置    // Define the ground body. 定义 边缘刚体    groundBodyDef.position.Set(0,0); // bottom-left corner        // Call the body factory which allocates memory for the ground body    // from a pool and creates the ground box shape (also from a pool).    // The body is also added to the world.    //所有的b2Body都由b2World示例创建    b2Body* groundBody = world->CreateBody(&groundBodyDef);        // Define the ground box shape.//创建边缘刚体    b2PolygonShape groundBox;        b2FixtureDef boxShapeBox;    boxShapeBox.shape=&groundBox;    //屏幕宽高比 首先 适配IPHONE5    CCSize frameSize = CCEGLView::sharedOpenGLView()->getFrameSize();    float scales = (float) frameSize.width/ 288;            //定义物体边界    // bottom   112*scales 设置的是地面的高度    groundBox.SetAsBox(winSize.width/PTM_RATIO,112*scales/PTM_RATIO, b2Vec2(0, 0), 0);    groundBody->CreateFixture(&groundBox,0);        // top    groundBox.SetAsBox(winSize.width/PTM_RATIO, 0, b2Vec2(0, winSize.height/PTM_RATIO), 0);    groundBody->CreateFixture(&groundBox,0);        // left    groundBox.SetAsBox(0, winSize.height/PTM_RATIO, b2Vec2(0, 0), 0);    groundBody->CreateFixture(&groundBox,0);        // right    groundBox.SetAsBox(0, winSize.height/PTM_RATIO, b2Vec2(winSize.width/PTM_RATIO, 0), 0);    groundBody->CreateFixture(&groundBox,0);     }

注:代码迭代随时有变动

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米手机导航gps信号弱怎么办 安卓手机gps信号弱怎么办 苹果6导航gps信号弱怎么办 苹果6plus反应慢怎么办 手机文件打开是乱码怎么办 手机wps文件打开是乱码怎么办 腾讯视频vip账号被盗怎么办 附单据数错了 怎么办 橡胶的回弹性差怎么办 自己喷漆喷坏了怎么办 透明塑料磨花了怎么办 包包金属刮花了怎么办 鞋子刮了黑印子怎么办 黑色鞋跟磨白了怎么办 脚穿鞋子磨起泡怎么办 脚被鞋子磨红了怎么办 脚被鞋子磨黑了怎么办 白鞋皮鞋磨了皮怎么办 小脚趾磨肿了怎么办 穿鞋小拇指磨脚怎么办 高铁东西忘了怎么办 人故意去撞车死了怎么办? 新货车上户超重怎么办 车险出保单车号填错怎么办 货车拦板变形了怎么办 行车监控看不清楚车号怎么办? 1.5米的鱼缸要怎么办 被锤子砸到手了怎么办 家里地下污水管道堵塞怎么办 家里pvc灯罩变黄怎么办 欧普吸顶灯灯罩坏了怎么办 硬盘用久了变慢怎么办 地税申报工资人员弄错怎么办 买保险保单丢了怎么办 买保险的银行卡丢了怎么办 没学过JAVA入职怎么办 磨砂皮擦了鞋油怎么办 磨破皮伤口有沙子怎么办 工行信用卡被风险锁定了怎么办 超重被超限站查住以后怎么办 银行卡输入密码次数超限怎么办