zoukankan      html  css  js  c++  java
  • libgdx, mouse 关节

    鼠标与body的交互就靠这个mouse 关节了。

    在使用中:主要分成3步:

    步1:mouseDown : 这个时期,调用world->QueryAABB。它有一个回调接口,并依据鼠标指针指定一个AABB的极小区域。

    有3个细节需注意:

    细节1:鼠标的xy值是屏幕坐标系统的,要转换成stage坐标系统(stage->screenToStageCoordinates),然后再转成box2d的单位xy值;

    细节2:AABB极小区域是多小?当然是越小越好(比方:0.001f ,单位是米的,或者1个像素的差)x-0.001f, y-0.001f, x+0.001f,y+0.001f。这样就形成了一个极小区域。但实际測试时发现,回调函数被调用时,鼠标距离我们的目标body还有3-5个像素,这可能会造成视觉上的困惑。为解决问题,我一般在回调函数中再对其进行“(鼠标)点的測试”,即fixture->testPoint(x,y)方法。用它来实现測试我们的fixture是否被击中,以严格的击中測试来定位fixture击中与否,以此来建立鼠标关节会更符合视觉习惯。

    细节3:bodyB是操作目标,bodyA通常是静态body;我第一次使用时将这两个搞混了,结果发生崩溃异常。(參见后面的图1)


    步2:mouseDrag:在这个时间,仅仅是简单设置目标位置即可。注意坐标的转换与单位的转换。


    步3:mouseUp:这个时间是销毁鼠标关节。一般要注意将关节对象的引用置空(=null)。


    最后还要依据实例的body属性,特别调节例如以下參数,以保证mouse关节行为不是那么怪异!

    mouseJointDef.dampingRatio = 1;
    mouseJointDef.frequencyHz = 60; 、、调大些,会使用命中时显的更灵敏。
    mouseJointDef.maxForce = 5000;、、力要足够大,否则可能由于干只是重力而出现不期望的效果,比方“向下掉”。

    mouseJointDef.collideConnected = true;、、一般都设置为true,连接的body也要有碰撞,默认值为false,假设为false,它可能会“向下掉,且掉到地板以下去了”。


    下图是图1:


    代码參考:

       @Override
        public boolean reportFixture(Fixture fixture) {


            // 假设不是这个类型,直接转换会抛异常
    //        KwLetter kwLetter = (KwLetter)fixture.getBody().getUserData();
            // 改动成例如以下代码
            Object object = fixture.getBody().getUserData();
            if (object instanceof KwLetter) {
                KwLetter kwLetter = (KwLetter)object;
                if (null == m_mouseJoint && kwLetter.hit(m_mouseX2d, m_mouseY2d)) {
                    Gdx.app.debug("reportFixture", "kwLetter="+kwLetter);
                    MouseJointDef mouseJointDef = new MouseJointDef();
    //                mouseJointDef.dampingRatio = 1;
    //                mouseJointDef.frequencyHz = 1;
    //                mouseJointDef.maxForce = 5;
                    mouseJointDef.target.set(new Vector2(m_mouseX2d, m_mouseY2d));
                    mouseJointDef.bodyA = m_kwGround.getBody();
                    mouseJointDef.bodyB = kwLetter.getBody();//目标
                    m_mouseJoint = (MouseJoint)m_world.createJoint(mouseJointDef);
                }
            }


            return false;
        }



        public boolean hit(float x2d, float y2d)
        {
            return m_fixture.testPoint(x2d, y2d);
        }

  • 相关阅读:
    .net的委托和事件的直接理解[转载]
    虚函数 多态 函数重载[转载]
    自动化 object <> xml
    用System.Web.HttpRequest模拟一个form的post
    【WP7】动画的使用
    【WP7】关于ListBox控件的数据绑定
    【WP7】坐标变换
    【WP7】页面之间数据交互
    【WP7】调用系统LED灯
    【WP7】MediaPlayer与关闭音乐的方法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3861295.html
Copyright © 2011-2022 走看看