Box2D关节-鼠标关节(鼠标联合)

我们可以通过鼠标联合点击、操作世界里面的刚体。鼠标联合的原理是当鼠标点击刚体时,给隐藏的一个鼠标Sprite(位置和当前鼠标相同)和点击的刚体创建一根联合线(Joint Line),该联合线的特点是刚体会沿着联合线运动,而鼠标的移动就是改变联合线。

鼠标点击刚体获取所选刚体的步骤:

  • 1.获取鼠标在物理世界中的坐标
  • var mouseXWorldPhys:Number = mouseX / worldScale;
    var mouseYWolrdPhys:Number = mouseY / worldScale;

  • 2.将鼠标的坐标存放到一个鼠标向量
  • var mousePVec2:b2Vec2 = new b2Vec2();
    mousePVec2.Set(mouseXWorldPhys,mouseYWorldPhys);

         或者

var mousePVec2:b2Vec2 = new b2Vec2(mouseXWorldPhys,mouseYWorldPhys);

  • 3.创建一个包围盒,很小很小,小到可以认为可以是一个点。通过这个包围盒去获取世界中的刚体。
  • var aabb:b2AABB = new b2AABB();
    aabb.lowerBound.Set(mouseXWorldPhys-0.001,mouseYWorldPhys-0.001);
    aabb.upperBound.Set(mouseXWorldPhys+0.001,mouseYWorldPhys+0.001);

  • 4.使用世界的QueryAABB方法。该方法有两个参数:(1)回调函数;(2)包围盒AABB的实例,如第三步的包围盒aabb。该方法用于查询世界中处于包围盒内部的所有b2Fixture,回调函数的参数必须是b2Fixture,返回值类型会Boolean,如function callBack(fixture:b2Fixture):Boolean。当返回值为true时,重新调用该回调函数,直到返回值为false,即当点击处于动态刚体内部时候。
  • /**Query the world for all fixtures that potentially overlap the provided AABB.
    */
                                                    
    //Parameters
    //callback:Function — a user implemented callback class. It should match signature function //Callback(fixture:b2Fixture):Boolean Return true to continue to the next fixture.
                                                     
    //aabb:b2AABB — the query box.

  • 5.在回调函数中进行判断点碰撞检测。如果fixture.GetBody( ).GetTransform( )与鼠标向量碰撞,则认为鼠标点击了该刚体。(从另一个角度理解:鼠标向量点处于刚体内部中)

核心代码如下:

private function GetBodyAtMouse(includeStatic:Boolean = false):b2Body
        {
            mousePVec2.Set(mouseXWorldPhys, mouseYWorldPhys);
            var aabb:b2AABB = new b2AABB();
            aabb.lowerBound.Set(mouseXWorldPhys - 0.001, mouseYWorldPhys - 0.001);
            aabb.upperBound.Set(mouseXWorldPhys + 0.001, mouseYWorldPhys + 0.001);
            var body:b2Body;
            function getBodyCallback(fixture:b2Fixture):Boolean
            {
                var shape:b2Shape = fixture.GetShape();
                if (fixture.GetBody().GetType() != b2Body.b2_staticBody||includeStatic)
                {
                    var inside:Boolean = shape.TestPoint(fixture.GetBody().GetTransform(), mousePVec2);
                    if (inside)
                    {
                        body = fixture.GetBody();
                        return false;
                    }
                }
                return true;
            }
            world.QueryAABB(getBodyCallback, aabb);
            return body;
        }


转载于:https://my.oschina.net/childhood123/blog/80254

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值