使用物理引擎进行碰撞检测
来源:互联网 发布:php隐藏域名跳转代码 编辑:程序博客网 时间:2024/04/30 20:29
源码介绍
手机游戏源码cocos2d-x使用物理引擎进行碰撞检测
在Cocos2d-x3.2中,物理世界被融入到Scene中,即当创建一个场景时,就可以指定这个场景是否使用物理引擎。
sprite自带body属性,直接设置body,而形状、约束等属性添加到body中即可。碰撞的检测通过事件分发器来监控,所以你首先要创建监听器--EventListenerPhysicsContact,再把其添加到分发器中。
出自:http://blog.csdn.net/cbbbc/article/details/38541099
在Cocos2d-x3.2中,物理世界被融入到Scene中,即当创建一个场景时,就可以指定这个场景是否使用物理引擎。
sprite自带body属性,直接设置body,而形状、约束等属性添加到body中即可。碰撞的检测通过事件分发器来监控,所以你首先要创建监听器--EventListenerPhysicsContact,再把其添加到分发器中。
出自:http://blog.csdn.net/cbbbc/article/details/38541099
效果图
源码介绍:
#ifndef _HELLOWORLD_SCENE_H_#define _HELLOWORLD_SCENE_H_#include "cocos2d.h"USING_NS_CC;class HelloWorld:public cocos2d::Layer{public:Sprite* ballOne;Sprite* ballTwo;PhysicsWorld* m_world;void setPhyWorld(PhysicsWorld* world) {m_world=world;};static cocos2d::Scene* createScene();virtual bool init();CREATE_FUNC(HelloWorld);virtual void onEnter();bool onContactBegin(const PhysicsContact& contact);};#endif#include "HelloWorldScene.h"Scene* HelloWorld::createScene(){ //创建有物理空间的场景 Scene* scene=Scene::createWithPhysics(); //设置Debug模式,你会看到物体的表面被线条包围,主要为了在调试中更容易地观察 scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); HelloWorld* layer=HelloWorld::create(); //把空间保持我们创建的层中,就是上面所说m_world的作用,方便后面设置空间的参数 layer->setPhyWorld(scene->getPhysicsWorld()); scene->addChild(layer); return scene;}bool HelloWorld::init(){if(!Layer::init()){return false;}Size visibleSize=Director::getInstance()->getVisibleSize();Point origin=Director::getInstance()->getVisibleOrigin();ballOne=Sprite::create("Ball.jpg");ballOne->setPosition(200,200);//创建物体,并且物体的形状为圆形,第一参数为半径,第二个参数为物体材质//第三个参数为边的厚度,就是在Debug模式下看到的物体外面线条的厚度,默认为0PhysicsBody* ballBodyOne=PhysicsBody::createCircle(ballOne->getContentSize().width/2,PHYSICSBODY_MATERIAL_DEFAULT);//是否设置物体为静态//ballBodyOne->setDynamic(false);//设置物体的恢复力ballBodyOne->getShape(0)->setRestitution(1.0f);//设置物体的摩擦力ballBodyOne->getShape(0)->setFriction(0.0f);//设置物体密度ballBodyOne->getShape(0)->setDensity(1.0f);//设置质量//ballBodyOne->getShape(0)->setMass(5000);//设置物体是否受重力系数影响ballBodyOne->setGravityEnable(false);ballBodyOne->setCategoryBitmask(0x0001);ballBodyOne->setCollisionBitmask(0x0001);ballBodyOne->setContactTestBitmask(0x0001);//设置物体的冲力Vect force=Vect(500000.0f, 500000.0f);//把物体添加到精灵中ballOne->setPhysicsBody(ballBodyOne);//设置标志ballOne->setTag(1);this->addChild(ballOne); ballBodyOne->applyImpulse(force);//ballOne->runAction(RepeatForever::create(// Sequence::create(MoveTo::create(1.0f,Vec2(300,200)),//MoveTo::create(1.0f,Vec2(300,400)),//MoveTo::create(1.0f,Vec2(200,400)),//MoveTo::create(1.0f,Vec2(200,200)),//NULL)));//设置第二个球ballTwo=Sprite::create("Ball.jpg");ballTwo->setPosition(700,400); PhysicsBody* ballBodyTwo=PhysicsBody::createCircle(ballOne->getContentSize().width/2,PHYSICSBODY_MATERIAL_DEFAULT);//是否设置物体为静态//ballBodyTwo->setDynamic(false);ballBodyTwo->getShape(0)->setRestitution(1.0f);ballBodyTwo->getShape(0)->setFriction(0.0f);ballBodyTwo->getShape(0)->setDensity(1.0f);ballBodyTwo->setGravityEnable(false);ballBodyTwo->setCategoryBitmask(0x0001);ballBodyTwo->setCollisionBitmask(0x0001);ballBodyTwo->setContactTestBitmask(0x0001);force=Vect(-500000.0f, -500000.0f);ballTwo->setPhysicsBody(ballBodyTwo);ballTwo->setTag(2); ballBodyTwo->applyImpulse(force);/*ballTwo->runAction(RepeatForever::create( Sequence::create(MoveTo::create(1.0f,Vec2(100,400)), MoveTo::create(1.0f,Vec2(700,400)),NULL)));*/this->addChild(ballTwo);//创建一个盒子,用来碰撞Sprite* edgeSpace=Sprite::create();PhysicsBody* boundBody=PhysicsBody::createEdgeBox(visibleSize,PHYSICSBODY_MATERIAL_DEFAULT,3);boundBody->getShape(0)->setFriction(0.0f);boundBody->getShape(0)->setRestitution(1.0f); /*boundBody->setCategoryBitmask(0x0011);boundBody->setCollisionBitmask(0x0011);boundBody->setContactTestBitmask(0x0);*/edgeSpace->setPhysicsBody(boundBody);edgeSpace->setPosition(Point(visibleSize.width/2,visibleSize.height/2));this->addChild(edgeSpace);edgeSpace->setTag(0);
<span style="white-space:pre">//添加一个框 auto parent = Sprite::create("YellowSquare.png"); parent->setPosition(200, 100); parent->setPhysicsBody(PhysicsBody::createBox(parent->getContentSize()*parent->getScale(), PhysicsMaterial(0.1f, 1.0f, 0.0f))); parent->getPhysicsBody()->setTag(2); parent->setTag(1); addChild(parent);</span>return true;}void HelloWorld::onEnter(){Layer::onEnter();//添加监听器auto contactListener=EventListenerPhysicsContact::create();//设置监听器的碰撞开始函数 contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin, this);//添加到事件分发器中_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);}bool HelloWorld::onContactBegin(const PhysicsContact& contact){Sprite* spriteA=(Sprite*)contact.getShapeA()->getBody()->getNode();Sprite* spriteB=(Sprite*)contact.getShapeB()->getBody()->getNode();int tagA=spriteA->getTag();int tagB=spriteB->getTag();if(tagA==1&&tagB==2||tagA==2&&tagB==1){ /*spriteA->removeFromParent();spriteB->removeFromParent(); */}return true;}
0 0
- 使用物理引擎进行碰撞检测
- 使用物理引擎进行碰撞检测
- 使用物理引擎进行碰撞检测
- Cocos2d-x3.2总结:使用物理引擎进行碰撞检测
- Cocos2d-x3.2总结---使用物理引擎进行碰撞检测
- Cocos2d-x3.2总结(四)使用物理引擎进行碰撞检测
- [转载]Cocos2d-x3.2总结(四)使用物理引擎进行碰撞检测
- 使用cocos2d-x3.0和物理引擎实现碰撞检测
- 关于碰撞检测和物理引擎
- Box2d物理引擎:b2ContactListener类碰撞检测
- cocos2dx物理引擎和碰撞检测(一)
- cocos2dx物理引擎和碰撞检测(二)
- cocos2dx物理引擎和碰撞检测(三)
- 物理引擎里的碰撞检测
- Cocos2dx物理引擎碰撞检测总结
- cocos2dx3.x物理引擎的碰撞检测
- 【amazing cocos2d-x 3.0之十七】使用新物理引擎实现碰撞检测
- 学习 "使用cocos2d-x3.0和物理引擎实现碰撞检测" 中出现的一个问题
- 查看java jdk安装路径和设置环境变量
- Exchange 2013的OWA页面出现503错误的解决办法
- javascript原生移动云编程11 - 如何调用手机图库中图片
- layout_wigth详解
- protocol buffers Scalar Value Types
- 使用物理引擎进行碰撞检测
- Json-lib 自定义序列化和反序列化
- 报表制作
- js中获取月份和季度的最后一天
- 统计代码行数
- 表 T006 和 T006_OIB 不匹配
- ZOJ1654
- PHP做301跳转定向
- 黑马程序员-----网络编程总结(一)