`

实例介绍Cocos2d-x物理引擎:HelloPhysicsWorld

阅读更多

我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用物理引擎的开发过程,熟悉这些API的使用。这个实例的运行后的场景,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的精灵,精灵的运行是自由落体运动。



HelloPhysicsWorld实例



使用物理引擎的一般步骤,如下图所示。



这个过程与上帝创建世界的过程类似,上帝首先创建了世界,然后为世界指定了边界,否则万物就会掉到世界之外的混沌里去了,最后上帝创建了万物。
当然这只是一个最基本的步骤,有的时候还需要碰撞检测和使用关节等处理。下面我们就按照这个步骤介绍一下代码部分。首先看一下看HelloWorldScene.h文件,它的代码如下:

[html] view plaincopy
 
  1. #ifndef __HELLOWORLD_SCENE_H__  
  2. #define __HELLOWORLD_SCENE_H__  
  3.   
  4.   
  5. #include "cocos2d.h"  
  6. USING_NS_CC;  
  7.   
  8.   
  9. class HelloWorld : public cocos2d::Layer  
  10. {  
  11. public:  
  12.     static cocos2d::Scene* createScene();  
  13.   
  14.   
  15.    
  16.     virtual bool init();    
  17.     virtual bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event);            ①  
  18.   
  19.   
  20.     CREATE_FUNC(HelloWorld);  
  21.   
  22.   
  23.     void addNewSpriteAtPosition(Vec2 p);                                    ②  
  24. };  
  25.   
  26.   
  27. #endif // __HELLOWORLD_SCENE_H__  



上述第①行代码是声明了单点触摸函数onTouchBegan,以便于响应单点触摸事件。第②行代码是定义创建精灵函数,这个函数是在触摸点击位置创建一个精灵对象。
HelloWorldScene.cpp中创建物理世界,代码如下:

[html] view plaincopy
 
  1. Scene* HelloWorld::createScene()  
  2. {  
  3.     auto scene = Scene::createWithPhysics();                                    ①  
  4.     scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);      ②  
  5.       
  6.     auto layer = HelloWorld::create();  
  7.   
  8.   
  9.     scene->addChild(layer);  
  10.   
  11.   
  12.     return scene;  
  13.   
  14.   
  15. }  



上述第①行代码Scene::createWithPhysics()语句是创建场景,这个是带物理引擎世界场景,使用createWithPhysics()函数会在场景中进行初始化物理引擎,我们可以通过场景的getPhysicsWorld()函数获取初始化的物理世界(PhysicsWorld)对象。我们也可以根据需要在这里设置物理世界,其中第②行代码设置在物理世界中绘制调试遮罩,这会把物体的形状绘制出来。因为世界中的物体,如果没有与精灵绑定到一起,我们是看不到它的。这主要用于调试,当调试结束后,游戏发布的时候,我们需要把它关闭。关闭绘制调试遮罩的场景如下图所示。



HelloWorldScene.cpp中指定世界的边界,代码如下:

[html] view plaincopy
 
  1. bool HelloWorld::init()  
  2. {  
  3.     if ( !Layer::init() )  
  4.     {  
  5.         return false;  
  6.     }  
  7.       
  8.     Size visibleSize = Director::getInstance()->getVisibleSize();  
  9.     Vec2 origin = Director::getInstance()->getVisibleOrigin();  
  10.   
  11.   
  12.     //定义世界的边界  
  13.         auto body = PhysicsBody::createEdgeBox(visibleSize,  
  14.                         PHYSICSBODY_MATERIAL_DEFAULT,5.0f);                     ①  
  15.     auto edgeNode = Node::create();                                         ②  
  16.     edgeNode->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2));               ③  
  17.     edgeNode->setPhysicsBody(body);                                      ④  
  18.     this->addChild(edgeNode);                                            ⑤  
  19.   
  20.   
  21.     setTouchEnabled(true);                                              ⑥  
  22.     //设置为单点触摸  
  23.     setTouchMode(Touch::DispatchMode::ONE_BY_ONE);                          ⑦  
  24.   
  25.   
  26.     return true;  
  27. }  



上述代码HelloWorld::init是初始化层函数,在这个函数中我们可以指定世界的边界,世界边界也是一个物体,代码第①行PhysicsBody::createEdgeBox是创建物体对象,静态函数createEdgeBox指定世界边界是矩形盒子,createEdgeBox函数的第一个参数指定矩形的大小。第二个参数是设置材质,PHYSICSBODY_MATERIAL_DEFAULT常量是默认材质,材质是由结构体PhysicsMaterial定义的,结构体PhysicsMaterial成员有:density(密度)、friction(磨擦系数)和restitution(弹性系数)。密度可以用来计算物体的质量,密度可以为零或者为正数。摩擦系数经常会设置在0.0~1.0之间,0.0表示没有摩擦力,1.0会产生强摩擦。弹性系数的值通常设置到0.0~1.0之间,0.0表示物体不会弹起,1.0表示物体会完全反弹,即称为弹性碰撞。createEdgeBox函数的第三个参数是设置边的宽度。
代码第②行是创建边界节点对象,这个节点对象作为世界边界对象,第③行代码是设置节点对象的位置。第④行代码edgeNode->setPhysicsBody(body)是设置与节点相关的物体对象。通过这条语句使得游戏场景中的节点对象(精灵等)与物体关联起来。第⑤行代码是将节点对象添加到层中。
代码第⑥行setTouchEnabled(true)是使层开始触摸事件支持。第⑦行代码setTouchMode(Touch::DispatchMode::ONE_BY_ONE)是设置触摸模式为单点触摸。
HelloWorldScene.cpp其他代码如下:

[html] view plaincopy
 
  1. bool HelloWorld::onTouchBegan(Touch* touch, Event* event)                       ①  
  2. {  
  3.     Vec2 location = touch->getLocation();  
  4.     addNewSpriteAtPosition(location);  
  5.     return false;  
  6. }     
  7.   
  8.   
  9. void HelloWorld::addNewSpriteAtPosition(Vec2 p)                                 ②  
  10. {      
  11.     auto sp = Sprite::create("Ball.png");                                       ③  
  12.     sp->setTag(1);                                                       ④  
  13.       
  14.     auto body = PhysicsBody::createCircle(sp->getContentSize().width / 2);               ⑤  
  15.     //auto body = PhysicsBody::createBox(sp->getContentSize());                      ⑥  
  16.     sp->setPhysicsBody(body);                                            ⑦  
  17.     sp->setPosition(p);                                                    
  18.     this->addChild(sp);  
  19. }  



上述代码第①行是单点触摸时候调用的函数,在这个函数中调用addNewSpriteAtPosition(location)函数,在触摸点创建一个精灵对象。
第②行代码是定义addNewSpriteAtPosition函数,第③行代码Sprite::create("Ball.png")是创建一个精灵对象,第④行代码sp->setTag(1)是设置精灵的tag属性,在检查碰撞时候可以通过tag属性判断并获得精灵对象。
第⑤行代码是通过PhysicsBody的静态createCircle函数创建圆圈形状物体。PhysicsBody还有很多类似的create函数,如createBox、createCircle、createPolygon和createEdgePolygon等函数,这些函数与物理形状对应的。这里只详细解释createCircle函数, createCircle函数API如下:
static PhysicsBody* createCircle(float radius,
const PhysicsMaterial & material = PHYSICSBODY_MATERIAL_DEFAULT,
const Vec2 & offset = Vec2::ZERO 
)
其中第一个参数radius是设置圆圈的半径,第二参数material是材质,这可以省略,默认值是PHYSICSBODY_MATERIAL_DEFAULT,所以在HelloWorld::init()函数中定义世界的边界时候,PhysicsBody::createEdgeBox语句中的material参数也是可以省略的。第三个参数offset是偏移量,可以省略,默认值是Vec2::ZERO。

第⑥行代码PhysicsBody::createBox(sp->getContentSize())是创建一个没有边的矩形盒子。第⑦行代码sp->setPhysicsBody(body)是设置与精灵相关的物体对象。

 

 

 

更多内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》
本书交流讨论网站:http://www.cocoagame.net
更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com
欢迎加入Cocos2d-x技术讨论群:257760386


《Cocos2d-x实战 C++卷》现已上线,各大商店均已开售:

京东:http://item.jd.com/11584534.html

亚马逊:http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

当当:http://product.dangdang.com/23606265.html

互动出版网:http://product.china-pub.com/3770734

 

《Cocos2d-x实战 C++卷》源码及样章下载地址:

源码下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1 

样章下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

欢迎关注智捷iOS课堂微信公共平台
分享到:
评论

相关推荐

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    大富翁手机游戏开发实战基于Cocos2d-x3.2引擎

    资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...

    实例妙解Cocos2D-X游戏开发

    一线资深游戏开发工程师根据Cocos2D-X 最新版本撰写,Cocos2D...完全通过真实游戏案例驱动,不仅将Cocos2D-X的各种功能、原理、技巧融入其中,而且还详细讲解了空战类、塔防类、物理类游戏的开发过程和方法,实战性极强

    大富翁手机游戏开发实战 基于Cocos2d-x3.2引擎

    李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发。本书根据大富翁项目一一展开讲解游戏开发过程中涉及的各方面内容...

    Cocos2d-x高级开发教程

    Cocos2d-x是移动跨平台开发最流行的游戏引擎,而本书是一本很全面的、比较‘接地气’的游戏开发教程。书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关...

    cocos2d-x-3.2旧版引擎下载

    cocos2d-x-3.2下载,不多说。或者可以下载另一个资源 cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5) http://download.csdn.net/download/crazymagicdc/9982656

    cocos2d-x-2.1.5

    cocos2d-x-2.1.5

    Cocos2D-X游戏开发技术精解.pdf

    《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如何建立跨平台的开发环境;引擎的核心模块——渲染框架;如何实现动态画面和...

    Cocos2d-x高级开发教程制作自己的《捕鱼达人》

    捕鱼达人游戏开发。Cocos2d-x高级开发教程:...曾经参与Cocos2d-x for Windows Phone 7引擎的开发,负责《捕鱼达人》系列游戏Windows Phone版本的移植工作,并参与了多个移动游戏项目的开发,拥有丰富的游戏开发经验。

    Cocos2D-X游戏开发技术精解

     《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    cocos2d-x-v2:更新cocos2d-x 2.2.6的库并支持Android Studio,64位Android

    cocos2d-x 游戏类 通过PayPal支持更新第三库: $ 10,$ 50,$ 100等。 经过测试 带有ndk-r10d的cocos命令3.8.1 cocos run -p android --android-studio --app-abi armeabi-v7a:arm64-v8a cocos run -p android --...

    cocos2d-x事件类

    在使用cocos2d-x开发游戏的过程中,为了实现逻辑和显示相分离。 在下通宵了一个晚上,写出了该事件类。 谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类...

    Cocos2d-x 3.2 自动更新 -- 使用AssetsManager更新游戏资源包

    Cocos2d-x 3.2 自动更新 使用AssetsManager更新游戏资源包

    cocos2d-x实战项目

    cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...

    Cocos2d-x游戏引擎实战开发炸弹超人

    Cocos2d-x 是一个支持多平台的 2D 手机游戏引擎

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    cocos2d-x-3.4旧版引擎下载

    cocos2d-x-3.4下载,不多说。或者可以下载另一个资源 cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5) http://download.csdn.net/download/crazymagicdc/9982656

    Cocos2d-x 3.x游戏开发之旅

    本书是《Cocos2d-x 游戏开发之旅》的升级版,修改了2.0版进阶到3.0版后的一些内容...通过2到3个游戏实例介绍Cocos2d-x在实际开发中的应用;手机网络游戏开发入门;介绍在实际的手游开发过程中遇到的问题以及解决方法。

    Cocos2d-x实战:Lua卷(第2版)书籍代码

    这是书籍 Cocos2d-x实战:Lua卷(第2版)的代码,关东升老师的,这里分享出来。除了章节的小示例代码外,还有一个《迷失航线》的游戏示例代码。这是一个下载地址。

    Cocos2d-x3.2大富翁游戏项目开发apk测试版

    Cocos2d-x 3.2 大富翁游戏项目开发apk测试版

Global site tag (gtag.js) - Google Analytics