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 关节,布布扣,bubuko.com

时间: 2024-11-13 10:38:31

libgdx, mouse 关节的相关文章

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

Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Box2d内置的积分器实现运动变化. 冲量是一个瞬时效果,能立马改变其效果. 主要函数: body.applyLinearImpulse( Vector2 impulse, Vector2 position, boolean wakeup ) 第一个参数表示冲量,包含x和y方向的大小. 第二个参数表示施

libgdx 3D 瞄准星和隐藏鼠标

1. 瞄准星 1 /**画瞄准星*/ 2 private void drawSight(){ 3 debugRenderer.begin(ShapeRenderer.ShapeType.Line); 4 float w = 50; 5 float h = 40; 6 Rectangle rect = new Rectangle((Gdx.graphics.getWidth()-w)/2, (Gdx.graphics.getHeight()-h)/2, w, h); 7 debugRenderer

Libgdx Box2D实战---放开那小球(四:不规则body创建--physics-body-editor的使用)

继续我们的问题,如果遇到不规则的图形怎么办?难不成要一个个组装吗? 这里就要提一个叫做"关节"的名词了,它可以将一个个部分进行组装成自己的形状,特别是各部件独自运转时,比如一辆自行车,它的轮子和车身都是各自运转的. 但是网上相关的资料真是太少了!一大堆复制粘贴的,全是废话,不知道大家是怎么感觉的?但是我的这个游戏没用到,所以没有深究,有兴趣的可以去谷歌一下. 下面我介绍的是一个非常非常方便的工具,它的名字叫做physics-body-editor,那么它是干什么的呢?恩,它可以根据你的

Libgdx之监听用户输入

做游戏的最重要的是要与用户有交互,怎样与用户交互Ligdx提供了2种方式. Libgdx事件查询(Event Polling) 这种方式主要是Libgdx主动查询当前的状态,通过这种方式我们可以查询键盘输入,鼠标事件,加速器等状态 事实上主动查询事件是在render()方法中调用,意味每一帧我们都会来查询事件状态. 在Libgdx上我们可以获得屏幕点击坐标 Gdx.input.getX() 和 Gdx.input.getY(),注意这时获取的坐标为Touch坐标,我们要通过函数camera.un

单细胞文章分享:Molecular Diversity of Midbrain Development in Mouse, Human, and Stem Cells

Molecular Diversity of Midbrain Development in Mouse, Human, and Stem Cells 本文作者的官网:Ventral midbrain 顺便找到了:Download all the data and Python Notebooks from GitHub to reproduce the main figures. GitHub:linnarsson-lab/ipynb-lamanno2016 教程:scRNA-Seq Data

Libgdx之国际化 中英文菜单切换

有时候我们做的游戏不仅仅发布在国内市场,有时候也需要发布在国际市场,这时候我们至少需要中英2套菜单来供不同的玩家使用,毕竟中文不是每个人都能看懂. Libgdx中提供了I18NBundle来供我们使用,I18NBundle提供了一套机制可以使我们从属性(properties)文件中加载资源, 属性文件中的资源是以"name"和"values"的形式存在的,而且资源最好有一个父文件,这样防止资源丢失时,可以使用父文件中的值: 通过上面图片可以看出string.prop

关于Unity中关节的使用(一)

1: 刚体的形状大小在物理世界里面是不变的,可是很多时候,我们需要多个刚体来配合使用;2: 关节: 连接刚体与刚体的对应的物理模拟;3: 关节类型: 铰链关节,弹簧关节, 固定关节, 角色关节,可配置关节 铰链关节 1: 将两个刚体束缚在一起,在两者之间产生铰链效果;2: 铰链关节属性 connect Body:目标连接的刚体; Anchor 本体锚点,连接目标旋转时围绕的中心点; Connect Anchor 连接目标的锚点,本体旋转时围绕的中心点;自动计算出来的. Axis 锚点和目标锚点的

Libgdx之正交相机 OrthographicCamera

本翻译自Libgdx Wiki 本文主要介绍OrthographicCamera相机类和用法.OrthographicCamera是正交相机,用在2D游戏开发中,无论游戏物体放在游戏世界中的那个位置,用正交相机看到的物体都不会被缩放. 描述 正交相机的操作非常简单,就像我们在现实世界中操作相机一样,文章中主要介绍: 相机的移动和旋转 相机的放到和缩小 改变相机的视窗大小 在窗口(widow)坐标系和(世界)坐标系之间切换点的位置 使用正交相机可以在不必去操作矩阵的情况下非常方便的来移动游戏世界,

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

直接放例子代码,代码中以任意四边形为例,如果需要做任意多边形,注意libgdx不能直接用ShapeRender填充多边形,需要先切割成三角形. public static void drawClip(Batch batch, Polygon polygon, TextureRegion region, float x, float y) { float[] vertices = polygon.getVertices(); if (shapes == null) { shapes = new S