初学Cocos2d-x3.1物理碰撞(1)
来源:互联网 发布:淘宝卖大米的营销策略 编辑:程序博客网 时间:2024/04/30 09:44
#include "cocos2d.h"USING_NS_CC;class HelloWorld : public cocos2d::Layer{public: // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::Scene* createScene(); Sprite* ball; PhysicsWorld* m_world; void setPhyWorld(PhysicsWorld* world) {m_world = world;} bool onContactBegin(const PhysicsContact& contact); virtual bool init(); Sprite* ballOne; Sprite* ballTwo; CREATE_FUNC(HelloWorld);};
#include "HelloWorldScene.h"USING_NS_CC;int ball1Mask = 1 << 0;int ball2Mask = 1 << 1;int wallMask = 1 << 2;Scene* HelloWorld::createScene(){ //创建有物理空间的场景 auto scene = Scene::createWithPhysics(); //这事debug模式,使物体表面被线条保卫,主要是为了在调试中方便观察 scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); //创建Layer层 auto layer = HelloWorld::create(); //把空间保持我们创建的层中 layer->setPhyWorld(scene->getPhysicsWorld()); scene->addChild(layer); return scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){ ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } //添加事件监听 auto contactListener = EventListenerPhysicsContact::create(); //设置回调函数 contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin,this); //添加到事件分发器中 Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contactListener, this); auto winSize = Director::getInstance()->getWinSize(); ballOne = Sprite::create(); ballOne->setContentSize(Size(50,50)); ballOne->setPosition(Vec2(winSize.width/2,winSize.height/2)); //创建物体,并且物体的形状为圆形,参数1为半径,参数2为物体材质,参数三为物体边缘厚度,即Debug模式下看到的物体外面线条的厚度,默认为0; PhysicsBody* ballBodyOne = PhysicsBody::createCircle(ballOne->getContentSize().width/2,PHYSICSBODY_MATERIAL_DEFAULT,Vec2(1,1)); //设置物体恢复力 ballBodyOne->getShape(0)->setRestitution(1.0f); //设置物体摩擦力 ballBodyOne->getShape(0)->setFriction(0.0f); //设置物体密度 ballBodyOne->getShape(0)->setDensity(1.0f); //设置物体是否受重力系数影响 ballBodyOne->setGravityEnable(false); //设置物体的冲力 Vect force = Vect(500000.0f,500000.0f); ballBodyOne->applyImpulse(force); //将物体加入精灵中 ballOne->setPhysicsBody(ballBodyOne); ballOne->setTag(1); addChild(ballOne); //设置第二个球 ballTwo = Sprite::create(); ballTwo->setContentSize(Size(100,100)); ballTwo->setPosition(Vec2(winSize.width/3,winSize.height/3)); PhysicsBody* ballBodyTwo = PhysicsBody::createCircle(ballOne->getContentSize().width/2,PHYSICSBODY_MATERIAL_DEFAULT); ballBodyTwo->getShape(0)->setRestitution(1.0f); ballBodyTwo->getShape(0)->setFriction(0.0f); ballBodyTwo->getShape(0)->setDensity(1.0f); ballBodyTwo->setGravityEnable(false); force = Vect(-500000.0f,-500000.0f); ballBodyTwo->applyImpulse(force); ballTwo->setPhysicsBody(ballBodyTwo); ballTwo->setTag(2); addChild(ballTwo); //创建容器,用来碰撞 Sprite* edgeSpace = Sprite::create(); //设置盒子属性 PhysicsBody* boundBody = PhysicsBody::createEdgeBox(winSize,PHYSICSBODY_MATERIAL_DEFAULT,3); boundBody->getShape(0)->setFriction(0.0f);//摩擦力 boundBody->getShape(0)->setRestitution(1.0f);//恢复力 edgeSpace->setPhysicsBody(boundBody);//将物体加入盒子 edgeSpace->setPosition(Vec2(winSize.width/2,winSize.height/2)); addChild(edgeSpace); edgeSpace->setTag(0); //碰撞检测 ballBodyOne->setCategoryBitmask(ball1Mask); ballBodyOne->setCollisionBitmask(wallMask|ball1Mask|ball2Mask); ballBodyOne->setContactTestBitmask(wallMask|ball1Mask|ball2Mask); ballBodyTwo->setCategoryBitmask(ball2Mask); ballBodyTwo->setCollisionBitmask(wallMask|ball1Mask|ball2Mask); ballBodyTwo->setContactTestBitmask(wallMask|ball1Mask|ball2Mask); boundBody->setCategoryBitmask(wallMask); boundBody->setCollisionBitmask(wallMask|ball1Mask|ball2Mask); boundBody->setContactTestBitmask(wallMask|ball1Mask|ball2Mask); return true;}bool HelloWorld::onContactBegin(const cocos2d::PhysicsContact &contact){ if((contact.getShapeA()->getBody()->getCategoryBitmask() & ball1Mask) == ball1Mask) { log("ball1 touch something"); } if((contact.getShapeB()->getBody()->getCategoryBitmask() & ball1Mask) == ball1Mask) { log("ball1 touch something"); } if((contact.getShapeA()->getBody()->getCategoryBitmask() & ball2Mask) == ball2Mask) { log("ball2 touch something"); } if((contact.getShapeB()->getBody()->getCategoryBitmask() & ball2Mask) == ball2Mask) { log("ball2 touch something"); } return true;}
0 0
- 初学Cocos2d-x3.1物理碰撞(1)
- 使用cocos2d-x3.0和物理引擎实现碰撞检测
- Cocos2d-x3.2总结:使用物理引擎进行碰撞检测
- Cocos2d-x3.2总结---使用物理引擎进行碰撞检测
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检测(1)
- cocos2d-x3.x 像素碰撞
- 学习 "使用cocos2d-x3.0和物理引擎实现碰撞检测" 中出现的一个问题
- Cocos2d-x3.2总结(四)使用物理引擎进行碰撞检测
- [转载]Cocos2d-x3.2总结(四)使用物理引擎进行碰撞检测
- 免费自学Cocos2d-x3.0final2014原创视频教程(56集)(适用于Cocos2d-x3.1 Cocos2d-x3.2版本全)
- Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检测
- cocos2d-x3.0学习1
- Cocos2d-x3.1FileUtilsTest使用
- Cocos2d-x3.1事件实例
- Cocos2d-x3.1SpriteBatchNode使用
- Cocos2d-x3.1粒子使用
- Cocos2d-x3.1 多点触摸
- cocos2d-x3.0 Physics封装物理引擎
- UML类图示例一张:公司结构
- nginx配置文档,转
- Java 多线程之--- Thread.join介绍
- python处理excel
- linux 命令
- 初学Cocos2d-x3.1物理碰撞(1)
- 言的幸运数 swun1701
- 内部类在迭代器设计模式中的应用
- Codeforces Round #266 (Div. 2)E(判断父子关系+离线)
- 面试总结:用Java搞定面试中的链表题目
- 第一记
- IOS多线程编程之NSOperation和NSOperationQueue的使用
- libsvm在python下的使用及用绘制ROC曲线
- Codeforces Round #266 (Div. 2)C(算是简单计数吧)