2012-05-27 60 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

無論你提到會的工作方法,它只是其中的你會發現更方便的事。它似乎也像是你已經理解了實現,所以我認爲任何人都不能回答這個問題,而不是說'更適合你'。

把一個傳感器在杆的範圍的各端部和使用接觸聽者當槓桿接觸它們是最「正確的」的方法來檢測。當杆接觸傳感器和停止觸摸時,它可以方便地爲您提供事件,但是它需要更多的工作來設置。

檢查關節角度後每個時間步長將正常工作過,但你需要與價值的角度比較前面的步驟,如果你想檢測開始/結束感人的「事件」。如果你想要一個可以給出連續值的槓桿(例如,用於某些其他物體的速度控制)而不是簡單的開/關開關,那麼使用這種方法會更好。