2

我正在尝试在我的 android 游戏中实现“杠杆”,这里的图片显示了我想要什么,展示了它是如何工作的:

1)

在此处输入图像描述

2)

在此处输入图像描述

我设法通过使用联合来完成它的基本工作:

final RevoluteJointDef revoluteJointDef = new RevoluteJointDef();
revoluteJointDef.initialize(anchorBody, movingBody, anchorBody.getWorldCenter());
revoluteJointDef.enableLimit = true;
revoluteJointDef.upperAngle = MathUtils.degToRad(40);
revoluteJointDef.lowerAngle = MathUtils.degToRad(-40);
physicsWorld.createJoint(revoluteJointDef);   

它可以工作,我可以向左/向右移动操纵杆,并且你应该不能超过适当的角度,所以这部分完成了。但是现在我正在寻找一种方法,在移动此杠杆后执行操作(例如打开一些门/大门)

这是我的基本想法,如何通过用这种方式创建棒的身体来检查玩家(左或右)触摸了棒的哪一部分:

在此处输入图像描述

所以解释一下,通过添加 2 个传感器,一个在左侧,一个在右侧,所以在接触侦听器时,我会检查哪一侧被触摸。

但是我仍然不知道如何检查是否应该执行操作,我知道如果坚持角为 40 或 -40,我可以检查每次更新,但这是有效的方法吗?或者也许有更好的?我将非常感谢任何提示!谢谢

4

2 回答 2

1

您提到的两种方法都可以,只是您觉得哪种方法更方便。看起来您似乎已经了解了实现,所以我认为没有人能比说“哪个更适合您”更好地回答这个问题。

在杠杆范围的每一端放置一个传感器并使用接触监听器来检测杠杆何时接触它们是最“正确”的方式。它可以方便地为您提供控制杆接触传感器和停止接触时的事件,但设置起来需要更多的工作。

在每个时间步之后检查关节角度也可以正常工作,但是如果要检测开始/结束触摸“事件”,则需要将角度与上一步中的值进行比较。如果您想要一个可以提供连续值的杠杆(例如,其他对象的速度控制)而不是简单的开/关开关,那么使用这种方法会更好。

于 2012-05-27T16:04:27.973 回答
1

您不必担心这里的效率,检查角度的性能损失绝对可以忽略不计。我使用以下代码片段测量了获取 Sprite 和 Body 的角度所需的时间:

double testEnd;
double testStart;
testStart = System.nanoTime();
for (int i = 0; i<1000000; i++) {doStuff()}
testEnd = System.nanoTime();
Log.v("speed test", "it takes "+ (testEnd - testStart)/1000000 + " nanoseconds");

因此,在 Desire Z 上,只需 157 ns 即可找到 Sprite 的角度,而使用 Body 则需要 393 ns。它也比使用联系人监听器简单得多。顺便说一句,如果您旋转 Sprite,Sprite 的角度可以超出 (-360, +360) 度。

于 2012-05-27T16:08:35.123 回答