3

バグ

ピアノ アプリに奇妙なバグがあります。ときどきキー (およびノー​​ト) がハングします。私は多くのデバッグを行い、アンドロイドのモーションイベント処理の不正確さのように見えるものに絞り込みました:

 DEBUG/(2091): ACTION_DOWN A4
 DEBUG/(2091): KeyDown: A4
 DEBUG/(2091): ACTION_MOVE A4 => A4
 DEBUG/(2091): ACTION_MOVE ignoring
 DEBUG/(2091): ACTION_MOVE A4 => A4
 DEBUG/(2091): ACTION_MOVE ignoring
 DEBUG/(2091): ACTION_MOVE A4 => A4
 DEBUG/(2091): ACTION_MOVE ignoring
 DEBUG/(2091): ACTION_UP B4 //HOW CAN THIS BE????
 DEBUG/(2091): KeyUp: B4
 DEBUG/(2091): Stream is null, can't stop
 DEBUG/(2091): Hanging Note: A4 X=240-287 EventX=292 Y=117-200 EventY=164
 DEBUG/(2091): KeyUp Note:   B4 X=288-335 EventX=292 Y=117-200 EventY=164

ACTION_UP明らかに、どこからともなく私が突然別のメモを持っていることがわかります。絶対にACTION_MOVE1位をとるべきではないですか?

ACTION_UPログの最後に示されているように、イベントは明らかに B4 領域にあるため、領域検出のエラーではありません。

ロギングの実装の詳細

すべてのonTouchEvent()通話が記録されるため、ログは正確です。

ACTION_MOVE ロギングに関連する疑似コードは次のとおりです。

 Key oldKey = Key.get(event.getHistoricalX(), event.getHistoricalY());
 Key newKey = Key.get(event.getX(), event.getY());

質問

これは Android の通常の動作 (座標のジャンプ) ですか?

その座標に向かってACTION_UP前もって何も発生しませんか?ACTION_MOVE

4

1 に答える 1

0

Android で簡単なシューティング ゲームを開発しようとしたときに、同様の問題が発生しました。問題がハードウェアに起因する場合、これを解決するために使用したトリックは機能しない可能性がありますが、とにかく試してみる価値があります.

一般的な考え方は、「TouchEvents」の配列を持ち、この配列をループで繰り返し処理することです。このようにして、デバイスが複数または同時のタッチイベントを登録すると、それらは配列に線形にストックされますが、その場で処理されません。発生する非同期イベントを削除して、それらを次々に処理するようにしてください。

List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
    int len = touchEvents.size();
    for(int i = 0; i < len; i++) {
        TouchEvent event = touchEvents.get(i);

        if(event.type == TouchEvent.TOUCH_DRAGGED || event.type == TouchEvent.TOUCH_DOWN) ...    

ここで、「game.getInput().getTouchEvents()」は単に TouchEvent オブジェクトとその getTouchEvent などのメソッドを指します。

それは私にとってはうまくいきました。これが何らかの形で役立つことを願っています。幸運を祈ります!

于 2012-06-15T16:19:43.097 に答える