鼠标与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. ubutun 下webalizer 分析Apache日志

    http://www.webalizer.org/  配置Webalizer 我们可以通过命令行配置Webalizer,也可以通过配置文件进行配置.下面将重点介绍使用配置文件进行配置,该方法使用形式比 ...

  2. Parsing HTML with C++ (using Qt preferably) - Stack Overflow

    Parsing HTML with C++ (using Qt preferably) - Stack Overflow Parsing HTML with C++ (using Qt prefera ...

  3. android 安全未来怎么走

  4. Razor强类型视图下的文件上传

    域模型Users.cs using System;using System.Collections.Generic;using System.Linq;using System.Web; namesp ...

  5. cordova安装--创建ionic项目

    1.简介ionic ionic 是一个强大的 HTML5 应用程序开发框架(HTML5 Hybrid Mobile App Framework ). 可以帮助您使用 Web 技术,比如 HTML.CS ...

  6. URAL 1203 Scientific Conference dp?贪心

    题目:click here 分明就是贪心怎么会在dp的专题 #include <bits/stdc++.h> using namespace std; typedef unsigned l ...

  7. JavaSE学习总结第07天_面向对象2

      07.01 成员变量和局部变量的区别 1.在类中的位置不同 成员变量    类中方法外 局部变量    方法内或者方法声明上 2.在内存中的位置不同 成员变量   堆内存 局部变量   栈内存 3 ...

  8. COM编程-注册DLL形式的COM服务器

    这篇文章不涉及任何的有关COM的技术的讲解,仅仅的说一下写好的DLL形式的COM怎么使用.如下图所示,我已经有了一个DLL形式的COM服务器和一个使用COM服务器的COM客户端: 现在这个DLL的CO ...

  9. spring多数据源的配置

    C3P0和DBCP的区别 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等.   d ...

  10. 如何查看.Net源代码vs版本号以及C#项目中各文件的含义

    查看.Net源代码vs版本号以及C#项目中各文件的含义 用记事本打开vs项目的.sln文件. 第2行就是这个源代码包的开发软件vs版本号了 注意了,如果是vs2003的sln文件通常没有这行,可以判断 ...