cocos2d-x-3.3-020-碰撞检测2-物理引擎初探

原文同步发布于我的wiki,查看原文或更新请移步: 点击打开链接

原理

  • 不懂了,没深入研究物理引擎。。。但用用还是可以的。

Demo及源码

Demo解读

  • 每隔5s生成: 两架飞机,并从右往左飞行; 两颗子弹,从左向右飞。
  • 注册碰撞事件监听,剩下的事情就是等待碰撞事件的回调了。
  • 若发生碰撞,则播放相关动画

主要代码

  • 构建物理世界
    auto scene = Scene::createWithPhysics();
    scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);//debug模式
    Vect gravity = Vect(0.0f, 0.0f);//0重力
    scene->getPhysicsWorld()->setGravity(gravity);
  • 设置物理世界的大小
            //定义世界的边界
            auto body = PhysicsBody::createEdgeBox(visibleSize,
                                PHYSICSBODY_MATERIAL_DEFAULT,5.0f);
            auto edgeNode = Node::create();
            edgeNode->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2));
            edgeNode->setPhysicsBody(body);
            this->addChild(edgeNode);
  • 注册碰撞事件的监听

            // 注册物理碰撞事件监听
            auto listener = EventListenerPhysicsContact::create();
                listener->onContactBegin = [this](PhysicsContact& contact)
                {
                    return true;
                };

                listener->onContactPreSolve = [] (PhysicsContact& contact,
                        PhysicsContactPreSolve& solve) {
//                  log("onContactPreSolve");
                    return true;
                };

                listener->onContactPostSolve = [] (PhysicsContact& contact,
                        const PhysicsContactPostSolve& solve) {
//                  log("onContactPostSolve");
                };

                listener->onContactSeperate = [](PhysicsContact& contact) {
                    log("onContactSeperate");
                };

                Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(
                        listener, 1);

  • 给精灵设置物理body
        //设置物理body
        auto body = PhysicsBody::createBox(sp->getContentSize());
        body->setContactTestBitmask(0xFFFFFFFF);
        sp->setPhysicsBody(body);

优缺点

  • 优点: 相比通过自己判断矩形区域是否有相交,省了相关的辅助数据结构和逻辑,代码看上去更精炼了。
  • 缺点: 首先肯定会有性能上的损失,但主观判断下应该不大。

效果图

  • 开了debug模式 https://github.com/cheyiliu/All-in-One/raw/master/res/cocos2d/CollisionDetection-way2-use-physics-engine.gif

扩展阅读

时间: 2024-08-06 13:20:19

cocos2d-x-3.3-020-碰撞检测2-物理引擎初探的相关文章

cocos2dx 3.2中的物理引擎初探(一)

cocos2dx在设计之初就集成了两套物理引擎,它们是box2d和chipmunk.我目前使用的是最新版的cocos2dx 3.2.引擎中默认使用的是chipmunk,如果想要改使用box2d的话,需要修改对应的android工程或者是ios工程的配置文件. 在2.x版本的cocos中,使用物理引擎的步骤十分繁琐.但在3.x版本中变得非常方便了.我这次的学习目标是制作一个打砖块的小游戏. 首先,现在的Scene类提供了一个静态工厂方法,用以创造一个集成物理引擎的场景. Scene::initWi

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

碰撞检测是使用物理引擎的一个重要目的,使用物理引擎可以进行精确的碰撞检测,而且执行的效率也很高.在Cocos2d-x 3.x中使用事件派发机制管理碰撞事件,EventListenerPhysicsContact是碰撞事件监听器.碰撞检测相关的API我们在前面一节介绍过了,下面通过一个实例介绍碰撞检测的实现.这个实例的运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的精灵,精灵的运行是自由落体运动.当这些精灵之间发生接触时候,它们的颜色被设置为黄色,分

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

在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact(b2Contact* contact).两个物体开始接触时会响应,但只调用一次.virtual void EndContact(b2Contact* contact).分离时响应.但只调用一次.virtual void PreSolve(b2Contact* contact, const b2Ma

Cocos2d-x 使用物理引擎进行碰撞检测

[转自]: http://blog.csdn.net/cbbbc/article/details/38541099 通常在游戏简单逻辑判断和模拟真实的物理世界时,我们只需要在定时器中判断游戏中各个精灵的条件是否满足判断条件就可以了.例如,在飞机大战中,判断我方子弹和敌机是否发生碰撞一般在定时器中通过敌机所在位置的矩形是否包括了子弹的位置来判断是否发生碰撞.在消除类游戏中,判断在y轴或x轴上是否要消除相同物品一般在定时器中通过循环来检测在某个方向上是否有连续的相同物品满足消除个数来移除精灵就可以了

物理引擎中不规则物体的碰撞检测

在运用物理引擎的时候,经常回出现这种情况,不规则物体的碰撞检测无法更加精确的测量,那么,小杰今天就带您一起解决这个问题!!! 首先下载一个windows下面的软件 名称是:PhysicsEditor ,这个软件可以帮助你设计不规则的图形.软件的使用方法在这里不具体讲解了,说一下注意的问题,添加进精灵后 :按照这个步骤走 好了,这时候 做完了就会生成 plist文件,把它和png图片一起拷进资源目录下面: 定义一个成员方法: std::vector<std::vector<Vec2>>

Unity3D实践系列09, 物理引擎与碰撞检测

在Unity3D中,一个物体通常包含一个Collider和一个Rigidbody.Collider是碰撞体,一个物体是Collider,才可以进行碰撞检测.Collider组件中的"Is Trigger"属性项被勾选上时,这个物体就变成碰撞检测体. 物体有了Rigidbody组件,才会具备一些物理属性,比如重量.阻力.旋转阻力,等等."Use Gravity"项表示是否有自然引力."Is Kinematic"项表示是否被物理引擎所驱动,勾选上表示

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

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

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

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

Cocos2d-js官方完整项目教程翻译:六、添加Chipmunk物理引擎在我们的游戏世界里

添加Chipmunk物理引擎在我们的游戏世界里         一.简介                   cocos2d JS能给我们力量来创造令人印象深刻的游戏世界.但缺乏某种现实.          虽然我们可以做复杂的计算,使游戏世界更真实的,但有另一个选择          它可以缓解我们的生活.答案是物理引擎.          物理引擎提供了重力,碰撞检测和物理模拟,可以使我们的游戏世界看起来更真实.          在本教程中,我们将介绍的ChipMunk的物理引擎进入我们的

cocos2d_x_02_使用内置物理引擎

最终效果图: 一.新建工程 进入cocos2d-x的tools下的bin目录: /Users/beyond/Desktop/cocos2d-x/cocos2d-x-3.3beta0/tools/cocos2d-console/bin目录 打开终端,切换到上述bin目录 使用cocos命令,创建工程,格式如下: cocos new 工程名 -p 包名 -l 语言 -d 目标文件夹, 例如 : cocos new 01_cocos2d-x-p com.beyond-l cpp -d /Users/b