• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

COCOS2D官方physics申明

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0809/594.html

 
Introduction
在游戏中企业培训模拟实在世界的物理会很复杂。应用物理引擎会用很大的赞助。 Box2D的和Chipmunk是两个闻名的物理引擎,Cocos2d-x曾经很好的集成它们。在Cocos2d-x v2的开发人员必要干脆应用物理引擎。 Cocos2d-x提供了一个简单CCPhysicsSprite类,以赞助收缩应用差异,但对付其它元素的开发者必要干脆挪用物理引擎的API。
 
在Cocos2d-x V3+ 版本工作产生了变更。Cocos2d-x V3+ 版本集成了斩新的物理引擎,基于Chipmunk的焦点API。开发人员不再必要体贴它的物理引擎将被用于或必要干脆挪用物理引擎的API。
 
Cocos2d-x 中的物理属性:
物理世界被集成加入景中,当你建立一个场景,你可以干脆建立基于物理世界或不应用物理世界的场景。
Node拥有它本人的身材body属性。 (Sprite 也同样)
Cocos2d-x 3.0 曾经封装了物理属性 Body(PhysicsBody), Shape(PhysicsShape),Contact(PhysicsContact), Joint(PhysicsJoint) 和 World(PhysicsWorld), 加倍利便应用。
利便的应用listener-EventListenerPhysicsContact进行碰撞检验
常州软件技术培训应用Cocos2d-x 物理 API外, 你还可以干脆应用 Chipmunk 或 Box2D。
 
建立一个带物理引擎的游戏工程
你可以应用该/tools/project-creator/create_project.py剧本建立一个 3.0的工程。
 
默认是集成了物理引擎的,且默认应用chipmunk作为物理引擎。
 
你可在ccConfig.h 中注释该定义 CC_USE_PHYSICS 来禁用它。
 
建立一个带物理世界的场景
底下的代码建立了一个带物理世界的建立,并传递到子层上。在PhysicsLayer.h中增加如下代码:
 
class PhysicsLayer : public cocos2d::Layer
{
...
// add following codes
void setPhyWorld(PhysicsWorld* world){m_world = world;}
private:
PhysicsWorld* m_world;
...
}
而后在PhysicsLayer.cpp中createScene要领增加底下代码:
 
Scene* PhysicsLayer::createScene()
{
...
// add following codes
auto scene = Scene::createWithPhysics();
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
auto layer = HelloWorld::create();
layer->setPhyWorld(scene->getPhysicsWorld());
...
return scene;
}
Scene类有一个新的static 厂家要领createWithPhysics()建立一个带物理世界的场景。你可以通过常州平台运营Scene的 getPhysicsWorld()要领获取PhysicsWorld实例。
 
在调试物理引擎时PhysicsWorld的 setDebugDrawMask() 最有用。它可以使物理世界中的样式(shape)、环节(joint)、接触(contact)可见。记得在公布你的游戏时关闭该调试功效。
 
你可以应用setPhyWorld()要领传递PhysicsWorld到ChildLayer,在一个场景中惟有一个PhysicsWorld实例。各个层之间分享。
 
PhysicsWorld 拥有默认的重力配置,Vect(0.0f, -98.0f), 你可以应用 setGravity() 配置你本人的。
 
你可以通过 setSpeed() 转变物理世界的速率。
 
建立物理界限
我们晓得,在物理世界的每一件工作由重力的影响。物理引擎提供staticShape要领来建立一个不受重力影响的样式,在Cocos2d-x 2.0,我们必要晓得staticShape的物理引擎各项参数。
 
不过,在3.0 PhysicsShape是节点的一个属性,以是要是你要配置PhysicsWorld的属性,您必需通过一个节点实例来传递它们。
 
底下的代码将报告你若何建立在屏幕上一个物理界限:
 
Size visibleSize = Director::getInstance()->getVisibleSize();
auto body = PhysicsBody::createEdgeBox(visibleSize, PHYSICSBODY_MATERIAL_DEFAULT, 3);
auto edgeNode = Node::create();
edgeNode->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
edgeNode->setPhysicsBody(body);
scene->addChild(edgeNode);
PhysicsWorld有良多厂家要领,如createEdgeBox建立一个矩形的边框,所有的参数是:
 
矩形区域,配置作为visibleSize。
可选参数,纹理,默认为PHYSICSBODY_MATERIAL_DEFAULT。
可选参数,边框大小,默认为1。
而后,我们常州微信公众平台建立节点,并持续方才建立的节点的身材。屏幕为节点的位置配置好的中间,末了加入节点加入景。
 
在Cocos2d-x 3.0节点的addChild要领可以处分物理刚体。它会自动增加节点的身材加入景的PhysicsWorld。
 
PhysicsBody的工程要领可以凭据参数配置刚体的大小,建立响应的PhysicsBody和PhysicsShape。这是一个多见的做法由物理引擎干脆建立一个刚体。不过,在Cocos2d-x 3.0物理集成简化了这个历程,以是我们并不必要编写大批的代码。
 
建立受重力影响的精灵
在3.0中建立一个受重力感化的Sprite也很简单。
 
void HelloWorld::addNewSpriteAtPosition(Point p)
{
auto sprite = Sprite::create("circle.png");
sprite->setTag(1);
auto body = PhysicsBody::createCircle(sprite->getContentSize().width / 2);
sprite->setPhysicsBody(body);
sprite->setPosition(p);
this->addChild(sprite);
}
开始建立一个sprite,而后用PhysicsBody::createCircle建立一个圆形的body附加在sprite上。 全部历程和以前建立界限的历程是一致的。
 
您可以建立PhysicsShape并将它们通过addShape()增加到刚体,但要留意,品质mess(由密度和面积计较)和瞬间样式会自动增加到刚体,而在增加到刚体body后你无法转变样式的相对位置和扭转。要是你不必要它了,您可以应用removeShape()删除它。
 
碰撞检验
Cocos2d-x中,事件派发机制做了重构,所有事件均有事件派发器统一经管。物理引擎的碰撞事件也不例外, 底下的代码注册碰撞begin回调函数:
 
auto contactListener = EventListenerPhysicsContact::create();
contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);
每一次碰撞检验事件是由EventListenerPhysicsContact监听。建立一个实例,而后配置其回调函数conContactBegin。 CC_CALLBACK_1是回调指针转换应用C++ 11个功效。由于onContactBegin回调函数有两个参数,以是我们应用CC_CALLBACK_1转换他们。
 
_eventDispatcher是基类节点Node的成员,它可以被用来通过一个初始化层。
 
你还可以应用EventListenerPhysicsContactWithBodies,EventListenerPhysicsContactWithShapes,EventListenerPhysicsContactWithGroup来监听你感乐趣的bodys,shape或group事件。不过,你还必要配置物理接触关联的位掩码值,由于接触事件默认不会被接受,即便你建立相对的EventListener。
 
接触相对位掩码配置和组配置 和Box2D的同样。
 
这里常州微信小程序开发有三个值:CategoryBitmask,ContactTestBitmask和CollisionBitmask。您可以应用响应的get/set要领来获取/配置它们。它们是由逻辑和操纵测试的。当一个身材的CategoryBitmask并与另一主体的ContactTestBitmask其后果不即是零时,接触事件将被发出,相反接触的事件将不被发送。当一个的身材的CategoryBitmask并与另一主体的CollisionBitmask其后果不即是零,则它们将碰撞,相反不会。是自力的,在默认环境下,CategoryBitmask值为0xFFFFFFFF,ContactTestBitmask值是00000000,而CollisionBitmask值为0xFFFFFFFF,表示所有的身材会互相碰撞,但默认不发送接触事件。
 
另一个配置物理接触是组(group),当它的值大于零,在统一组中的工具会互相碰撞时;当它的值小于零则不会互相碰撞时。留意,当一群不即是零,它会纰漏碰撞位掩码配置(接触测试配置仍旧有用)。
 
EventListenerPhysicsContact有四个接触回调函数:onContactBegin,onContactPreSolve,onContactPostSolve和onContactSeperate。
 
onContactBegin会在接触被挪用开始,仅在这个接触挪用一次。您可以决意两个样式有无碰撞通过回笼true或false。您可以应用PhysicsContact::setData()来配置接触操纵的用户数据。留意,其时onContactBegin回笼false时,onContactPreSolve和onContactPostSolve不会被挪用,不过onContactSeperate将被挪用一次。
 
onContactPreSolve会在每一步被挪用,你可以应用PhysicsContactPreSolve配置要领来配置接触参数,如恢复原状,冲突等。你还可以通过回笼true或false决意两个样式是否有碰撞,你可以挪用PhysicsContactPreSolve::ignore()跳事后续的onContactPreSolve和``onContactPostSolve回调(回笼默认为true)。
 
onContactPostSolve在两个样式碰撞反馈中的每个步骤中被处分被挪用。你可以在内部做少许后续的接触操纵,比方销毁一个body。
 
onContactSeperate将在两个样式张开时被挪用。它也是在这个接触仅挪用一次。它必需和onContactBegin配对应用,你可以在这里销毁你应用PhysicsContact::setData()配置常州网站开发建设的本人的数据。
 

上篇:上一篇:运用EasyTouch控制人物挪动
下篇:下一篇:U3D用EasyTouch虚拟摇杆控制人物挪动