鼠标与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);

    }

libgdx, mouse 关节的更多相关文章

  1. libgdx学习记录21——Box2d物理引擎之碰撞Contact、冲量Impulse、关节Joint

    Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Bo ...

  2. [libgdx游戏开发教程]使用Libgdx进行游戏开发(11)-高级编程技巧 Box2d和Shader

    高级编程技巧只是相对的,其实主要是讲物理模拟和着色器程序的使用. 本章主要讲解利用Box2D并用它来实现萝卜雨,然后是使用单色着色器shader让画面呈现单色状态:http://files.cnblo ...

  3. 鼠标mouse事件冒泡处理

    简单的鼠标移动事件: 进入 mouseenter:不冒泡 mouseover: 冒泡 不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件 只有在鼠标指针穿过被选元素时,才会触发 m ...

  4. libgdx 裁剪多边形(clip polygon、masking polygon)

    直接放例子代码,代码中以任意四边形为例,如果需要做任意多边形,注意libgdx不能直接用ShapeRender填充多边形,需要先切割成三角形. public static void drawClip( ...

  5. Libgdx 循环绘制图片时间隔的问题

    在libgdx中使用循环绘制一张图片铺满某个区域时,有可能会遇到像素计算没有问题时,图块中间还是有约1像素的间隔,或者是本来没有间隔,做了缩放处理之后发现中间有间隔. 解法 当使用Texture加载图 ...

  6. javascript code snippet -- Forwarding Mouse Events Through Layers

    Anyone who has worked with web apps has likely created a masking element at some point, and the grea ...

  7. Mouse.OverrideCursor

    介绍: 获取和设置整个应用程序的光标,WPF父元素将覆盖所有子元素的光标. WPF设置控件的光标: WPF 中每个光标通过一个System.Windows.Input.Cursor表示, 获取Curs ...

  8. mouse scrollings and zooming operations in linux & windows are opposite

    mouse scrollings and zooming operations in linux & windows are opposite. windows中, 鼠标滚动的方向是: 查看页 ...

  9. ACM Greedy Mouse

    Greedy Mouse 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 A fat mouse prepared M pounds of cat food,read ...

随机推荐

  1. mongodb 学习初探

    1.去mongodb 官方下载 http://www.mongodb.org/downloads 2.下载php的mongodb扩展 http://files.cnblogs.com/lsl8966/ ...

  2. curl 返回响应头

    demo:/root# curl -i baidu.com HTTP/1.1 200 OK Date: Wed, 27 Jul 2016 08:50:03 GMT Content-Type: text ...

  3. mysql 假设存在id则设数据自添加1 ,不存在则加入。java月份计算比較

    </pre><pre name="code" class="sql">INSERT INTO invite_rejectlog_num ...

  4. Memory Architecture-SGA-Database Buffer Cache

    启动instance:1.分配内存空间SGA 2.启动后台进程 内存结构:1.SGA 2.PGA 3.UGA 4.Software code areas SGA components:1.Databa ...

  5. Extending your SharePoint 2007 site with Microsoft ASP.NET AJAX 3.5

    After ASP.NET 3.5 has been installed you need to modify the web.config file of your MOSS web site wi ...

  6. windows版的node.js简单示例

    1.下载node.exe放到任意目录,假设E:\nodejs\ 2.在E:\nodejs\下新建helloworld.js,输入以下内容,保存关闭 var http = require('http') ...

  7. CSS的z-index(分层)

    z-index是针对网页显示中的一个特殊属性.因为显示器是显示的图案是一个二维平面,拥有x轴和y轴来表示位置属性.为了表示三维立体的概念如显示元素的上下层的叠加顺序引入了z-index属性来表示z轴的 ...

  8. Enze Second day

    哈喽,很高兴在云和学院又学了一天的新知识,现在,我来继续总结一下今天所学的以及对昨天的一些补充. 变量 • 声明变量的语法格式: –数据类型  变量名; •赋值:     变量名=值; 变量的命名 • ...

  9. Light OJ 1104 Birthday Pardo(生日悖论)

    ime Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu   Description Sometime ...

  10. 《Java TCP/IP Socket 编程 》读书笔记之十一:深入剖析socket——TCP套接字的生命周期

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/16113083 建立TCP连接      新的Socket实例创建后,就立即能用于发送和接收 ...