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);
}
libgdx, mouse 关节的更多相关文章
- libgdx学习记录21——Box2d物理引擎之碰撞Contact、冲量Impulse、关节Joint
Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Bo ...
- [libgdx游戏开发教程]使用Libgdx进行游戏开发(11)-高级编程技巧 Box2d和Shader
高级编程技巧只是相对的,其实主要是讲物理模拟和着色器程序的使用. 本章主要讲解利用Box2D并用它来实现萝卜雨,然后是使用单色着色器shader让画面呈现单色状态:http://files.cnblo ...
- 鼠标mouse事件冒泡处理
简单的鼠标移动事件: 进入 mouseenter:不冒泡 mouseover: 冒泡 不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件 只有在鼠标指针穿过被选元素时,才会触发 m ...
- libgdx 裁剪多边形(clip polygon、masking polygon)
直接放例子代码,代码中以任意四边形为例,如果需要做任意多边形,注意libgdx不能直接用ShapeRender填充多边形,需要先切割成三角形. public static void drawClip( ...
- Libgdx 循环绘制图片时间隔的问题
在libgdx中使用循环绘制一张图片铺满某个区域时,有可能会遇到像素计算没有问题时,图块中间还是有约1像素的间隔,或者是本来没有间隔,做了缩放处理之后发现中间有间隔. 解法 当使用Texture加载图 ...
- 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 ...
- Mouse.OverrideCursor
介绍: 获取和设置整个应用程序的光标,WPF父元素将覆盖所有子元素的光标. WPF设置控件的光标: WPF 中每个光标通过一个System.Windows.Input.Cursor表示, 获取Curs ...
- mouse scrollings and zooming operations in linux & windows are opposite
mouse scrollings and zooming operations in linux & windows are opposite. windows中, 鼠标滚动的方向是: 查看页 ...
- ACM Greedy Mouse
Greedy Mouse 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 A fat mouse prepared M pounds of cat food,read ...
随机推荐
- Error inflating class android.support.v7.widget.Toolbar
建立程序的时候出现的错误 style.xml中的 <!-- Base application theme. --> <style name="AppTheme" ...
- HDU 2722 Here We Go(relians) Again
最短路,建图太麻烦,略过…… #include <cstdio> #include <cstring> #include <queue> const int INF ...
- hive 0.10 0.11新增特性综述
我们的hive版本升迁经历了0.7.1 -> 0.8.1 -> 0.9.0,并且线上shark所依赖的hive版本也停留在0.9.0上,在这些版本上有我们自己的bug fix patch和 ...
- C++模板编程
如何处理函数模板中的函数体? 预备知识补充: 按照c++的语言系统,普通函数及类的声明应该放在一个头文件中(通常是.h. .hpp..hh为扩展名)里: 而将其实现放在一个主代码文件中(通常以.c . ...
- BZOJ 100题留念
- Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)下
前面说了一些在OpenCV在VS2013下的配置的过程,下面说一下其中的个别的知识点,了解一下这样配置的一点点更细节的过程.其实配置项目属性的时候,有两种方式: 一.通过项目属性管理器配置项目属性表 ...
- myEclipse快捷键及其常用设置
快捷键: 查找替换:ctrl + f 复制行: ctrl + alt + down 删除行: ctrl + d 插入行: shift + enter, ctrl + shift ...
- Android Studio does not point to a valid jvm
环境变量 JAVA_HOME的值,去掉后面的分号,一般情况下就可以启动
- ThinkPHP第七天(F函数使用,项目分组配置,项目分组模板文件放置规则配置)
1.F(文件名称,写入数据,写入地址),用于将数据写入至磁盘文件中,如F('Data',$arr,'./Data/'),作用是将$arr写入至网站根目录的Data文件夹中的Data.php中. 2.读 ...
- http://riddle.arthurluk.net walkthrough
MSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnN0YWdlb25lLnBocCUwRCUwQTIlRTMlODAlODFo ...