其实就是这三类PhysicsWorld类,PhysicsBody类,PhysicsShape类。

1.PhysicsWorld类

PhysicsWorld对象代表Cocos2d-x中的物理世界,这个世界能够用来模拟碰撞和其他物理性质。不要直接创建PhysicsWorld对象,建议从一个场景对象中获取PhysicsWorld对象,scene->getPhysicsWorld()。

2.PhysicsBody类

PhysicsBody对象代表物理世界中的刚体,一个刚体可以被附加一个或多个形状。如果通过createXXX()函数创建刚体对象,将会根据密度自动计算质量和力矩。

3.PhysicsShape类

PhysicsShape对象代表一个刚体的形状和一些其他的属性,可以设置刚体的一些密度,质量,弹性等等。

给一个精灵对象设置刚体的步骤:

1.创建一个精灵对象ball

2.创建一个刚体body

3.用PhysicsShape指针对象调整这个刚体的属性

PhysicsShape *ps=body->getShape(0);

ps->setMass(0.2f);

...

4.设置这个精灵对象的刚体属性

ball->setPhysicsBody(body);

5.把这个精灵对象添加到层

this->addchild(ball);

在某个对象类的init函数中写

getPhysicsBody()->setDynamic(false);

表示创建出来的实例对象是静态的刚体,不受重力的影响。相反,如果不写这一句,那创建出来的刚体就受重力的影响,是动态刚体。

同时表示创建出来的实例对象是不会被其他的物体挡住不动的,会一直朝着自己的轨迹运动。如果想要两个刚体之间发生碰撞事件,就是触发碰撞监听器的函数,有碰撞检测,则两者之间必须至少有一个是动态刚体。

在某个对象类的init函数中写

getPhysicsBody()->setRotationEnable(false);

表示创建出来的实例对象是不会被其他的物体碰撞而发生一点点旋转。

在某个对象类的init函数中写

getPhysicsBody()->setContactTestBitmask(1); //例1

myCreep->getPhysicsBody()->setContactTestBitmask(GameScene::ContactMaskBit::HERO_CONTACTMASKBIT);  //例2

表示创建出来的实例对象是参与碰撞检测的,如果在HelloWorld的init函数中加一个刚体的碰撞事件监听器,当设置了这个属性的实例对象彼此之间发生碰撞的时候就会调用这个事件监听器中的函数,不写这个的话是不参与碰撞检测的。

在某个对象类的init函数中写

getPhysicsBody()->getShape(0)->setFriction(0);

表示创建出来的实例对象的刚体表面的摩擦力为0

在某个对象类的init函数中写
getPhysicsBody()->getShape(0)->setRestitution(0);

表示创建出来的实例对象的刚体的弹性为0

在某个对象类的init函数中写

getPhysicsBody()->setCollisionBitmask(0x0);

默认情况下参数里面是非0的,那样子的话“与”起来就不会为0。

表示不进行碰撞模拟,就是不产生碰撞的效果,直接穿透而过,我的理解是这样的,但是只设置这个的话还是会碰撞检测。这个不会影响子节点的碰撞效果和检测。

在某个对象类的init函数中写

getPhysicsBody()->setGravityEnable(false);

表示这个刚体不受重力,这句话经常和setDynamic(true)搭配,这样子既可以产生碰撞事件,进行碰撞检测,又可以自定义一些刚体的普通动作。

在某个对象类的init函数中写

setPhysicsBody(PhysicsBody::createBox(this->getContentSize()));

表示用这个实例化对象的ContentSize为大小,创建一个刚体,如果已经有刚体的时候,用这个方法是无效的,刚体的大小为第一次使用这个方法创建的时候的大小,就算想this->getPhysicsBody()->setPhysicsBody(PhysicsBody::createBox(this->getContentSize()));也不行,getPhysicsBody()后也并没有setPhysicsBody()方法。

在某个对象类的init函数中写

getPhysicsBody()->setEnabled(false);

表示用这个实例化对象的刚体变得不可见,无效果,相应绑定的精灵也不会发生碰撞,红色调试框没了。当变成true的时候,又可以看见红色调试框,又可以参加碰撞,又有效果。

在某个对象类的init函数中写

getPhysicsBody()->removeFromWorld();

表示把这个实例化对象的刚体彻底从物理世界中删除,且不能再用setPhysicsBody()创建刚体,写setPhysicsBody()也是无效。一般是不用这个相应刚体所绑定节点后才使用这个方法。

在GameScene.cpp的中写

((Scene*)this->getParent())->getPhysicsWorld()->setAutoStep(true);

获取物理世界并且进行一些操作,进行一些物理世界属性的设置。

第十三章的书上代码的物理世界测试那一部分中,我感觉很可能作者是想在手机上用重力感应来控制物体或者说实现重力,所以就写了设备加速度计方法和加速度计监听器。

关于Cocos2d-x物理引擎用到的类和使用的更多相关文章

  1. cocos2dx-3.x物理引擎Box2D介绍

    理引擎 Cocos2d-x引擎内置了两种物理引擎,它们分别是Box2D和Chipmunk,都是非常优秀的2D物理引擎,而且x引擎将它们都内置在SDK中.Box2D使用较为广泛,在这里选择Box2D来进 ...

  2. [原创]cocos2d-x研习录-第三阶 特性之物理引擎

    游戏物理引擎是指在游戏中涉及物理现象的逻辑处理,它用于模拟现实世界的各种物理规律(如赛车碰撞.子弹飞行.物体掉落等),让玩家能够在游戏中有真实的体验. Cocos2D-x中支持Box2D和Chipmu ...

  3. [Cocos2D-x For WP8]Box2D物理引擎

    物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动.旋转和碰撞反映.为每个游戏使用物理引擎并不是完全必要的—简单的“牛顿”物理(比如加速和减速)也可以在一定程度上通过编程或编写脚本来实现.然而, ...

  4. Cocos2d-x3.2 使用物理引擎进行碰撞检测[转]

    通常在游戏简单逻辑判断和模拟真实的物理世界时,我们只需要在定时器中判断游戏中各个精灵的条件是否满足判断条件就可以了.例如,在飞机大战中,判断我方子弹和敌机是否发生碰撞一般在定时器中通过敌机所在位置的矩 ...

  5. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

  6. 实例介绍Cocos2d-x中Box2D物理引擎:HelloBox2D

    我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用.这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触 ...

  7. 实例介绍Cocos2d-x物理引擎:碰撞检测

    碰撞检测是使用物理引擎的一个重要目的,使用物理引擎可以进行精确的碰撞检测,而且执行的效率也很高.在Cocos2d-x 3.x中使用事件派发机制管理碰撞事件,EventListenerPhysicsCo ...

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

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

  9. Cocos2d-x3.2总结---使用物理引擎进行碰撞检测

    [转自]: http://blog.csdn.net/cbbbc/article/details/38541099 通常在游戏简单逻辑判断和模拟真实的物理世界时,我们只需要在定时器中判断游戏中各个精灵 ...

随机推荐

  1. 利用ARP和ICMP协议解释ping命令

    一.MTU 以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大传输单元(MTU,Maximum Transmission Unit).如果IP ...

  2. 谈谈CListCtrl如何调整行高

    原文链接: http://blog.csdn.net/sstower/article/details/9094939 调整CListCtrl 行高通常有3种方法: 1.设定字体2.设定图片3.处理Me ...

  3. Python atan() 函数

    描述 atan() 返回x的反正切弧度值. 语法 以下是 atan() 方法的语法: import math math.atan(x) 注意:atan()是不能直接访问的,需要导入 math 模块,然 ...

  4. Ext.net中Combobox如何绑定数据库中的值-通用方法

    今天在项目中再次碰到了问题,就是Combobox中的值如果是直接绑定很简单.简单添加项就行了.代码如下: <ext:ComboBox ID=" /> </Items> ...

  5. Matlab图形调色

    Matlab图形调色 Simple example var colormap = require('colormap') options = {   colormap: 'jet',   // pic ...

  6. CentOS7添加开机启动服务/脚本(延用CentOS6方法)

    一.添加开机自启服务 在centos7中添加开机自启服务非常方便,只需要两条命令(以Jenkins为例): systemctl enable jenkins.service #设置jenkins服务为 ...

  7. spring cloud中通过配置文件自定义Ribbon负载均衡策略

    一.Ribbon中的负载均衡策略 1.Ribbon中支持的负载均衡策略 AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端se ...

  8. 练习 Dijkstra 最短路径算法。

    练习 Dijkstra 最短路径算法. #coding: utf-8 # Author: woodfox, Oct 14, 2014 # http://en.wikipedia.org/wiki/Di ...

  9. Web学习篇之---html基础知识(一)

    html基础知识(一) 本篇文章主要介绍HTML头部所包括的信息. 一.下面都是在标签<head>...</head>之间的内容: 1.<title>-</t ...

  10. 【Android】5.7 图片库(Galery)

    分类:C#.Android.VS2015: 创建日期:2016-02-07 一.简介 图库(也叫画廊)是一个布局小部件,用于在可水平滚动的列表中显示每一副图片,当前所选的图片将置于视图的中心. 注意: ...