2012-05-27 50 views
2

我想实现“杠杆”到我的Android游戏,这里的图像显示做我想做的,可见它是如何工作的:的Android游戏,“杠杆” - Box2D的

1)

enter image description here

2)

enter image description here

我能够做到基本的它利用联合:

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,但它是有效的方法?或者,也许有更好的?我将非常感谢任何提示!由于

回答

1

你不需要在这里担心的效率,检查的角度性能损失是完全可以忽略不计。我测使用下面的代码片段获得雪碧和身体的角度所需要的时间:

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纳秒做与Body相同。它也比使用联系人监听器简单得多。只是一个侧面说明,如果您旋转Sprite,则Sprites的角度可以超出(-360,+360)度。

1

无论你提到会的工作方法,它只是其中的你会发现更方便的事。它似乎也像是你已经理解了实现,所以我认为任何人都不能回答这个问题,而不是说'更适合你'。

把一个传感器在杆的范围的各端部和使用接触听者当杠杆接触它们是最“正确的”的方法来检测。当杆接触传感器和停止触摸时,它可以方便地为您提供事件,但是它需要更多的工作来设置。

检查关节角度后每个时间步长将正常工作过,但你需要与价值的角度比较前面的步骤,如果你想检测开始/结束感人的“事件”。如果你想要一个可以给出连续值的杠杆(例如,用于某些其他物体的速度控制)而不是简单的开/关开关,那么使用这种方法会更好。