cocos2d-x3.0 Physics新的物理引擎

1、说明:

3.0以后将box2d和chipmunk这两个物理引擎进行了封装,使用起来很的便利

2、详细用法:

1、创建物理世界场景

auto scene = Scene::createWithPhysics();
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); //调试时使用

2、在场景中加入重力

Vect gravity = Vect(0.0f, -10.0f);  //-10表示重力向下
scene->getPhysicsWorld()->setGravity(gravity); 

3、创建物理边界,边界有碰撞体

auto body = PhysicsBody::createEdgeSegment(Point(0,0),Point(600,0),PHYSICSBODY_MATERIAL_DEFAULT, 3); //3是边线度
auto edgeNode = Node::create();
edgeNode->setPosition(Point(0,10));
edgeNode->setPhysicsBody(body);
scene->addChild(edgeNode);

4、创建精灵,给精灵绑定刚体,这个封装一个加入刚体的方法,怎样创建精灵这里不做过多的说明

void GameScene::addBoxBodyForSprite(Sprite *sprite){
auto body = PhysicsBody::createCircle(sprite->getContentSize().width / 2);
// body->setCategoryBitmask(0);   //当为0不仅能闯过并且还检測不到碰撞
body->setContactTestBitmask(1); //有碰撞检測
body_player->setRotationEnable(false); //设置是否旋转
/** 设置body是否受引力影响 */
body->setGravityEnable(true);  //是否受重力影响
sprite->setPhysicsBody(body);

5、碰撞监听 在onEnter中绑定监听

void GameScene::onEnter()
{
    Layer::onEnter();
    auto contactListener = EventListenerPhysicsContact::create();
    contactListener->onContactBegin = CC_CALLBACK_1(GameScene::onContactBegin, this);  //刚開始碰撞,监听
    contactListener->onContactPreSolve = CC_CALLBACK_2(GameScene::onContactPreSolve, this); //碰撞中监听
    auto dispatcher = Director::getInstance()->getEventDispatcher();
    dispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);
}

6、開始碰撞监听函数

bool GameScene::onContactBegin( const PhysicsContact& contact){
    auto spriteA = (Sprite*)contact.getShapeA()->getBody()->getNode();
    auto spriteB = (Sprite*)contact.getShapeB()->getBody()->getNode();
    return true;  //返回true,才干够继续监听其他碰撞
}

7、碰撞中的监听(反弹力、摩擦力等属性可在此改动)

bool GameScene::onContactPreSolve(PhysicsContact& contact, PhysicsContactPreSolve& solve){
//	solve.setFriction(0);  //摩擦力
	solve.setRestitution(0);  //反弹力
//	solve.setSurfaceVelocity(Point(200,200));  //反弹运动方向
	return true;
}

8、physicsShape

//能够依据刚体得到PhysicsShape,然后改动PhysicsShape属性,包含,密度反弹力等。跟在碰撞检測中改动效果一样
//Vector<PhysicsShape*> physicShape = player->getPhysicsBody()->getShapes();
Vector<PhysicsShape*> physicShape = body_player->getShapes();
for(int i=0; i<physicShape.size();i++){
    physicShape.at(i)->setDensity(0); //密度
    physicShape.at(i)->setRestitution(0);  //反弹力
}

3、射线使用

1、实现

Point point1(10,10);
Point point2(1000,1000);
Point point3 = point2;
auto func = CC_CALLBACK_3(GameScene::anyRay, this);
scene->getPhysicsWorld()->rayCast(func, point1, point2, &point3);  //起始点、终点、保存碰撞的坐标位置 scene为開始创建的物理世界scene
//以下是画红色线方便调试查看
DrawNode *_node = DrawNode::create();
this->addChild(_node);
_node->drawSegment(point1, point2, 1, Color4F(1.0f, 0.0f, 0.0f, 1.0f));

2、射线碰撞监听

bool GameScene::anyRay(PhysicsWorld& world, const PhysicsRayCastInfo& info, void* data)
{
    *((Point*)data) = info.contact;
    return false;
}

4、參考文献

http://blog.csdn.net/v_leg/article/details/22584743

http://blog.csdn.net/st75033562/article/details/29574939

cocos2d-x3.0 Physics新的物理引擎,布布扣,bubuko.com

时间: 2024-10-14 06:04:10

cocos2d-x3.0 Physics新的物理引擎的相关文章

cocos2d-x3.0 新的物理引擎之详解setCategoryBitmask()、setContactTestBitmask()、setCollisionBitmask()

转载请注明出处:游戏开发实验室http://blog.csdn.net/u010019717/article/details/32942641 我在编写游戏的时候遇到了这个问题,  物理引擎其他的内容还好理解,  就这三个函数就是没找到有人详细的解释一下.  我不知道这个都没弄明白,游戏是怎么做出来的.那我就不吐糟了,      下面的所有内容都是我的个人推断.不知道正不正确.    反正我目前是这么理解的. 我们先来看看这三个函数的定义: /** * A mask that defines w

cocos2dx3.X项目重写(二)新的物理引擎

新的物理引擎叫physicsBody 创建物理scene auto scene = Scene::createWithPhysics(); 添加调试信息 这样可以让刚体附加方框显示出来 scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); 创建边界框 void Stage::addEdgeBox() { auto visibleSize = Director::getInstance()->get

cocos2d-x3.0 新的物理引擎之详解setCategoryBitmask()、setContactTestBitmask()、setCollisionBit...(转)

时间 2014-06-21 20:20:10  CSDN博客原文  http://blog.csdn.net/u010019717/article/details/32942641 转载请注明出处:游戏开发实验室 http://blog.csdn.net/u010019717/article/details/32942641 我在编写游戏的时候遇到了这个问题,  物理引擎其他的内容还好理解,  就这三个函数就是没找到有人详细的解释一下.  我不知道这个都没弄明白,游戏是怎么做出来的.那我就不吐糟

转:Bullet物理引擎不完全指南(Bullet Physics Engine not complete Guide)

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 前言 Bullet据称为游戏世界占有率为第三的物理引擎,也是前几大引擎目前唯一能够找到的支持iPhone,开源,免费(Zlib协议,非常自由,且商业免费)的物理引擎,但是文档资料并不是很好,Demo虽然多,但是主要出于特性测试/展示的目的,会让初学者无从看起,一头雾水.我刚学习Bullet的时候困于没有好的文档及资料,非常没有头绪,折腾了很久,所以就发挥没有就创造的精神,写作及整

关于cocos2d-X 3.x版本使用引擎自带的物理引擎Physics

今天本来打算使用BOX2D物理引擎的, 想到前段时间听说cocos2d-X在3.0版本中封装了一个自己的物理引擎Physics, 听名字就很霸气额, 用起来确实是比BOX2D简单很多( 毕竟是基于BOX2D封装的嘛), 好了, 现在我们来看看如何使用Physics这个物理引擎, 第一步: 创建项目............略 第二部: 修改场景的创建方式 将Scene::create();换成Scene::createWithPhysics(); Scene* HelloWorld::create

SPRITEKIT游戏框架之关于PHYSICS物理引擎属性

Spritekit提供了一个默认的物理模拟系统,用来模拟真实物理世界,可以使得编程者将注意力从力学碰撞和重力模拟的计算中解放出来,通过简单地代码来实现物理碰撞的模拟,而将注意力集中在更需要花费精力的地方.现在,让我们来学习这个系统的使用吧. 首先需要认识两个类,一个是场景scene的属性类SKPhysicsWorld,这个类基于场景,只能被修改但是不能被创建,这个类负责提供重力和检查碰撞(碰撞需要实现SKPhysicsContactDelegate代理协议),另一个就是SKPhysicsBody

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

我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用物理引擎的开发过程,熟悉这些API的使用.这个实例的运行后的场景,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的精灵,精灵的运行是自由落体运动. HelloPhysicsWorld实例 使用物理引擎的一般步骤,如下图所示. 这个过程与上帝创建世界的过程类似,上帝首先创建了世界,然后为世界指定了边界,否则万物就会掉到世界之外的混沌里去了,最后上帝创建了万物.当然这只是一个最基本的步骤,有的时候还需要碰撞检测和使

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

我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用.这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的精灵,精灵的运行自由落体运动. HelloBox2D实例 使用Box2D引擎进行开发过程,如图12-15所示.下面我们就按照这个步骤介绍一下代码部分.首先看一下看HelloWorldScene.h文件,它的代码如下: [html] view plaincopy #ifndef __H

【Unity 3D】学习笔记三十六:物理引擎——刚体

物理引擎就是游戏中模拟真是的物理效果.如两个物体发生碰撞,物体自由落体等.在unity中使用的是NVIDIA的physX,它渲染的游戏画面很逼真. 刚体 刚体是一个很很中要的组件. 默认情况下,新创的物体是不具备物理效果的,而刚体组件能够给物体加入一些常见的物理属性.比方说:质量.摩擦力.碰撞等. 假设对象加入了刚体组件.那么它将感应物理引擎中的一切物理效果. 简单的使用下 首先穿件一个游戏对象,接着在hierarchy视图中选择创建的游戏对象.然后在unity导航菜单条中选择component