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

ここでは効率について心配する必要はありません。角度をチェックすることによるパフォーマンスの低下は完全に無視できます。次のコードスニペットを使用して、スプライトとボディの角度を取得するために必要な時間を測定しました。

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しかかからず、Bodyで同じことを行うのに393nsかかります。また、連絡先リスナーを使用するよりもはるかに簡単です。ちなみに、スプライトを回転させると、スプライトの角度が(-360、+ 360)度の外側になる可能性があります。

于 2012-05-27T16:08:35.123 に答える