• cocos2d-x游戏开发 跑酷(两) 物理世界


    原创。转载请注明出处:http://blog.csdn.net/dawn_moon/article/details/21240343


    泰然的跑酷用的chipmunk物理引擎。我没有细致学过这个东西。

    只是我看了一下他们的使用方法,感觉跟box2d差点儿相同。box2d用纯真的面向对象C++开发,用在这里应该没有问题,试一下。


    泰然的project没有增加box2d模块。所以须要增加。

    将external/Box2D增加project,将没用的引用删掉。增加后结构例如以下


    然后新建一个PlayScene类。開始创建物理世界。

    为了方便调试box2d物理世界,须要接入debug渲染器。将TestCpp/Classes/Box2DTestBed/下的GLES-Render.h和GLES-Render.cpp增加到project,这个能够绘制出物理模型的形状。

    由于box2d针对0-10米的仿真做过优化。所以我这里将像素大小映射到10左右

    1. #define RATIO 32  
    看下PlayScene.h

    1. //  
    2. //  PlayScene.h  
    3. //  Parkour  
    4. //  
    5. //  Created by lerry on 14-3-14.  
    6. //  Copyright (c) 2014年 Goonear Co.,Ltd. All rights reserved.  
    7. //  
    8.   
    9. #ifndef __Parkour__PlayScene__  
    10. #define __Parkour__PlayScene__  
    11.   
    12. #include "cocos2d.h"  
    13. #include "Box2D.h"  
    14. #include "GLES-Render.h"  
    15.   
    16.   
    17. #define RATIO 32  
    18. #define GROUND_HEIGHT 57  
    19. #define RUUNER_STARTX 80  
    20.   
    21. class PlayScene : public cocos2d::CCLayer  
    22. {  
    23.     b2World* mWorld;  
    24.       
    25.     GLESDebugDraw* mDebugDraw;  
    26.       
    27. private:  
    28.     // 初始化物理世界  
    29.     void initPhysics();  
    30.       
    31.     // 绘制物理世界debug区域  
    32.     void draw();  
    33.       
    34.     // 开启物理世界debug  
    35.     void setDebug(bool isDebug);  
    36.       
    37. public:  
    38.     virtual bool init();  
    39.       
    40.     virtual void update(float dt);  
    41.       
    42.     CREATE_FUNC(PlayScene);  
    43.       
    44.     static cocos2d::CCScene* scene();  
    45.       
    46.       
    47. };  
    48.   
    49. #endif /* defined(__Parkour__PlayScene__) */  

    如今主要有一个初始化物理世界的函数initPhysics()函数,在这里创建了一个地板。

    1. void PlayScene::initPhysics()  
    2. {  
    3.     mWorld = new b2World(b2Vec2(0, -10));  
    4.       
    5.     mWorld->SetAllowSleeping(true);  
    6.     mWorld->SetContinuousPhysics(true);  
    7. //    mWorld->SetContactListener(this);  
    8.       
    9.     // 地板body  
    10.     b2Body* ground = NULL;  
    11.     b2BodyDef bd;  
    12.     ground = mWorld->CreateBody(&bd);  
    13.       
    14.     // 地板  
    15.     b2EdgeShape shape;  
    16.     shape.Set(b2Vec2(0, GROUND_HEIGHT / RATIO), b2Vec2(INT_MAX, GROUND_HEIGHT / RATIO));  
    17.     ground->CreateFixture(&shape, 0.0f);  
    18.       
    19.       
    20.     setDebug(true);  
    21. }  

    这里创建了一个边缘形状。边缘形状类似静态物体。可是它没有体积。box2d里面的碰撞算法要求碰撞的两个物体至少一个要有体积。所以边缘形状不能和边缘形状碰撞。能够和其它形状类物体碰撞。


    box2d的物理世界有自己的世界循环函数。跟cocos2d-x的update函数类似,所以在update函数里面调用box2d的迭代函数

    1. void PlayScene::update(float dt)  
    2. {  
    3.     // 物理世界的迭代函数  
    4.     mWorld->Step(dt, 10, 8);  
    5. }  

    Step函数的參数解释一下,第一个时间參数,单步迭代步长,第二个參数单步时间内速度迭代次数。第三个參数但不是件内位置迭代次数。

    这几个參数有建议值。我这里就取这几个值。


    然后在MainScene.cpp的onPlay函数里面填上回调的实现:

    1. // startbutton回调  
    2. void MainScene::onPay()  
    3. {  
    4.     CCLog("onPlay click");  
    5.     // 创建带过渡的场景  
    6.     CCScene* s = CCTransitionFade::create(1, PlayScene::scene());  
    7.     CCDirector::sharedDirector()->replaceScene(s);  
    8. }  

    这里加了一个过渡场景,跑起来看到一条线。初步完毕。

  • 相关阅读:
    【memesuite】 FATAL: Template does not contain data section
    可变剪切位点强度计算[自用]
    面试官:分布式环境下,如何实现 Session共享
    MySQL 大表优化方案,收藏了细看
    为什么我们不用数据库生成 ID?
    10 分钟彻底理解 Redis 的持久化和主从复制
    linux系统变为只读,提示Readonly file system的解决办法
    一文读懂MySQL所有日志
    一次简单的 JVM 调优
    读文献BioNet: an RPackage for the functional analysis of biological networks
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4731885.html
Copyright © 2020-2023  润新知