0

ゲームに奇妙な問題があります。私は2つのジョイスティックを使用しています。1つは射撃/照準用で、もう1つはキャラクターの移動用です。何らかの理由で、私のマルチタッチメソッドは一度に1つの動きしか登録しません。下を押すと2番目のポインターが登録されますがACTION_MOVE、最初のポインターに対してのみ機能します。これは奇妙なことです。つまり、1つ以上のポインターが必要ですが、同時に1つ以上のポインターを移動することはできません。私はgamedev.stackexchangeでこれを尋ねました、そしてそれは約1週間アクティブでした、いくつかの答えを得ました、しかしそれを100%機能させるものは何もありません。そして、私は自分で何時間も試しました。

onTouchメソッドのコード:

    //global variables
    private int movePointerId = -1;
    private int shootingPointerId = -1;

public void update(MotionEvent event) {

    if (event == null && lastEvent == null) {
        return;
    } else if (event == null && lastEvent != null) {
        event = lastEvent;
    } else {
        lastEvent = event;
    }   

    // grab the pointer id 
    int action = event.getAction();
    int actionCode = action & MotionEvent.ACTION_MASK;
    int actionIndex = event.getActionIndex();
    int pid = action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
    int x = (int) event.getX(pid);
    int y = (int) event.getY(pid); 
    String actionString = null;


    switch (actionCode)
    {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:

            actionString = "DOWN";
            try{
                if(x > 0 && x < steeringxMesh + (joystick.get_joystickBg().getWidth() * 2)
                   && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){
                        movingPoint.x = x;
                        movingPoint.y = y;
                        movePointerId = pid;
                        dragging = true;
                        //checks if Im pressing the joystick used for moving
                    }
                 else if(x > shootingxMesh - (joystick.get_joystickBg().getWidth()) && x < panel.getWidth()
                         && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){
                        shootingPoint.x = x;
                        shootingPoint.y = y;
                        shootingPointerId = pid;
                        shooting=true;
                        //checks if Im pressing the joystick used for shooting
                    }
                }catch(Exception e){

                }
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_OUTSIDE:

           if( pid == movePointerId ){
              movePointerId = -1;
              dragging = false;
              }
           else if( pid == shootingPointerId ){
              shootingPointerId = -1;
              shooting=false;
              }
            actionString = "UP";
            break;  
        case MotionEvent.ACTION_MOVE: // this is where my problem is

          if( pid == movePointerId ) {
                        movingPoint.x = x;
                        movingPoint.y = y;
          } else if( pid == shootingPointerId ) {
                        shootingPoint.x = x;
                        shootingPoint.y = y;
          }
                actionString = "MOVE";
                break;

    }

印刷actionStringpidて、移動するとチェックするだけpid=0ですが、()を押すと、ACTION_POINTER_DOWN別のファイルが登録されていることがわかりpidます。これは本当に混乱します。

わかりやすくするために、たとえばシューティングスティックで2番目のポインターを押すと、他のジョイスティックを同時に動かしても、押した位置になりますが、それはそのままになります。もう一方のジョイスティックを手放しました。それが1タッチ以上と1以上を登録するというさらなる証拠pid

さらに説明が必要な場合はお知らせください。

4

3 に答える 3

2

私はあなたのコードにいくつかの変更を加えました、それは私が問題を解決するはずだと信じています。少なくともそれは私にとってはうまくいきます...

    //global variables 
private int movePointerId = -1; 
private int shootingPointerId = -1; 

public void update(MotionEvent event) { 

if (event == null && lastEvent == null) { 
    return; 
} else if (event == null && lastEvent != null) { 
    event = lastEvent; 
} else { 
    lastEvent = event; 
}    

// grab the pointer id  
int action = event.getAction(); 
int actionCode = action & MotionEvent.ACTION_MASK; 
int pid = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int fingerid = event.getPointerId(pid);

//int actionIndex = event.getActionIndex(); 
//int pid = action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
int x = (int) event.getX(pid); 
int y = (int) event.getY(pid);  
String actionString = null; 


switch (actionCode) 
{ 
    case MotionEvent.ACTION_DOWN: 
    case MotionEvent.ACTION_POINTER_DOWN: 

        actionString = "DOWN"; 
        try{ 
            if(x > 0 && x < steeringxMesh + (joystick.get_joystickBg().getWidth() * 2) 
               && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){ 
                    movingPoint.x = x; 
                    movingPoint.y = y; 
                    //movePointerId = pid; 
                    movePointerId = fingerid; 
                    dragging = true; 
                    //checks if Im pressing the joystick used for moving 
                } 
             else if(x > shootingxMesh - (joystick.get_joystickBg().getWidth()) && x < panel.getWidth() 
                     && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){ 
                    shootingPoint.x = x; 
                    shootingPoint.y = y; 
                    //shootingPointerId = pid; 
                    shootingPointerId = fingerid; 
                    shooting=true; 
                    //checks if Im pressing the joystick used for shooting 
                } 
            }catch(Exception e){ 

            } 
        break; 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_POINTER_UP: 
    case MotionEvent.ACTION_CANCEL: 
    case MotionEvent.ACTION_OUTSIDE: 

       if( fingerid == movePointerId ){  //changed this line
          movePointerId = -1; 
          dragging = false; 
          } 
       else if( fingerid == shootingPointerId ){  //changed this line
          shootingPointerId = -1; 
          shooting=false; 
          } 
        actionString = "UP"; 
        break;   
    case MotionEvent.ACTION_MOVE: // this is where my problem is 

      if( fingerid == movePointerId ) { //changed this line
                    movingPoint.x = x; 
                    movingPoint.y = y; 
      } else if( fingerid == shootingPointerId ) { //changed this line
                    shootingPoint.x = x; 
                    shootingPoint.y = y; 
      } 
            actionString = "MOVE"; 
            break; 

} 

これは、一部のデバイスでは、1本の指を離すとポインタIDが変わる可能性があるためです。たとえば、最初の指がポインタID 1を受け取り、次にポインタID 2を受け取る2番目の指を押すと、指1を離すと、指2からのポインタIDが1になる場合があります。少し紛らわしいように聞こえるかもしれませんが、上記のこの指IDで問題が発生します。

幸運を。

于 2012-09-26T00:22:39.477 に答える
1

ポインタには、それらを識別するために使用できる2つの異なるプロパティがあります。

  • index:0からgetPointerCount()によって返される値より1小さい範囲です。現在のイベントの処理中にのみ有効です

  • id:このプロパティはポインタを一意に識別し、その存続期間中、ポインタに対して同じままであることが保証されています

コードで、インデックスID情報を正しく取得していません。基本的に、インデックスを使用していくつかのイベント間でポインターを識別していますが、インデックスが異なる可能性があるため、これは完全に間違っています。これは、アプリで発生していることです。つまり、ポインタを識別するためにidを使用する必要があります

私が言ったように、彼らはあなたがインデックスを取得している方法であり、IDは間違っています。これらのプロパティを取得する正しい方法は次のとおりです。

int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;
int index = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >>
             MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int pid = event.getPointerId(index);

詳細については、こちらを参照してください:MotionEvent | Android開発者

于 2013-12-14T18:00:14.473 に答える
0

private int movePointerId = -1;private int shootingPointerId = -1;、それらは異なる値を持つべきではありませんか?私は本当に知りませんが、問題が発生したら、値を変更して機能しました。

于 2012-09-25T20:52:00.283 に答える