Android游戏,'LEVER' - box2D

时间:2012-05-27 13:43:09

标签: java android box2d andengine

我正试图在我的安卓游戏中实现'杠杆',这里的图像展示了我想要的东西,展示它是如何工作的:

1)

enter image description here

2)

enter image description here

我设法通过使用joint来实现它的基本功能:

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);   

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

这是我的基本想法,如何通过以这种方式创建棒的身体来检查球员的哪个部分(左或右)被触摸:

enter image description here

通过添加2个传感器来解释,一个在左侧,一个在右侧,因此在接触式监听器中,我会检查哪一侧已被触摸。

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

2 个答案:

答案 0 :(得分:1)

你提到的两种方法都可行,这只是你觉得更方便的问题。你似乎已经理解了这个实现,所以我认为任何人都不能更好地回答这个问题,而不是说'哪个更适合你'。

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

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

答案 1 :(得分: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的角度,393 ns与Body相同。它也比使用联系人监听器简单得多。只需注意,如果旋转Sprite,Sprite的角度可以在(-360,+ 360)度之外。