2011-08-12 9 views
1

なので、私が作ろうとしているのはちょっとした宇宙ゲームです。画面上のジョイスティックで触ってドラッグして船をコントロールします。私はこれをうまく動作させるようにしました。私が武器を発射するために画面の上部に触れる機能を追加しようとすると、問題が発生します。何らかの理由で、現在ジョイスティックをドラッグしていると、他のタッチ入力を無視して何もしないように見えます(しかし、ジョイスティックを止めるとうまくいきます)。 これは初めてのことです。それはおそらく何かばかげているが、ivは数日間それに固執していた。とにかく、私のコードはここに 。私Androidマルチタッチイベントの問題...ドラッグ中に新しいタッチイベントはありませんか?

パブリッククラスパネルSurfaceViewがSurfaceHolder.Callback {以下

@Override 
    public boolean onTouchEvent(MotionEvent event) {  
     fingers= event.getPointerCount(); //Returns 1 or 2 properly if 2 fingers on screen 
     playership.onTouchEvent(event); //Pass the event along to the spaceship object 
     return true; 
     //return super.onTouchEvent(event); //no idea what this does, but it seems to disable the drag event 
    } 

はplayership.onTouchEvent(イベント)が実装延びから

以下です。関数

public boolean onTouchEvent(MotionEvent event) { 
     switch (event.getAction()) 
    {   

     case MotionEvent.ACTION_DOWN: 
      if(event.getY()<(Panel.mHeight-150)) 
       { 
        Laser1.reset(mX,mY,(int)event.getX(),(int)event.getY()); 
       } 
      break; 
     } 
    joy1.onTouchEvent(event); 
    return true; 
} 

以下はjoy1.onTouchEvent(イベント)です。

public boolean onTouchEvent(MotionEvent event) { 

    int eventaction = event.getAction(); 

    //Offset between mouse(x,y) and center 
    double offx=oX-event.getX(); 
    double offy=oY-event.getY(); 
    double d=Math.sqrt((offx*offx)+(offy*offy)); 

    switch (eventaction) 
    {   

     case MotionEvent.ACTION_DOWN: 
       if(d<dragrange) //Start Dragging if clicked 
       { 
      offx=offx/d; 
        offy=offy/d; 
        Dragging=true; 
        reset = false; 
       dX=(int) (offx*dragrange); 
        dY=(int) (offy*dragrange); 
       } 
     break; 
     case MotionEvent.ACTION_MOVE:     
       if(Dragging)//if joy is already being draged, update it. 
       { 
       offx=offx/d; 
        offy=offy/d; 
        if(d>dragrange) 
        { 
        dX=(int) (offx*dragrange); 
        dY=(int) (offy*dragrange); 
        } 
        else 
        { 
         dX=(int) (offx*d); 
        dY=(int) (offy*d); 
        } 
       reset = false; 
      } 

     break; 
     case MotionEvent.ACTION_UP: 
      if(Dragging) 
      { 
       Dragging=false; 
      } 
     break; 
     } 
    return true; 
} 

そうそう、問題がジョイスティックを例真ん中にある場合は、適切に登録するから、他のタッチイベントをブロックするように思わMotionEvent.ACTION_MOVEということです。

答えて

5

他の指の検出を処理する必要があります。具体的にはそうでなければ、他の指を無視している

MotionEvent.ACTION_POINTER_DOWNMotionEvent.ACTION_POINTER_UP

を扱います。ここでは、あなたが探しているんまさに私のプロジェクトの1からいくつかのコードは次のとおりです。

public void onTouchEvent(MotionEvent event) 
{ 
    int ptrId = -1; 
    int action = event.getAction(); 
    switch (action & MotionEvent.ACTION_MASK) 
    { 
     case MotionEvent.ACTION_DOWN: 
      down(event.getPointerId(0), (int)event.getX(), (int)event.getY()); 
     break; 
     case MotionEvent.ACTION_UP: 
      up(event.getPointerId(0)); 
     break; 
     case MotionEvent.ACTION_POINTER_DOWN: 
      ptrId = action >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
      int ptrIdx = event.findPointerIndex(ptrId); 
      down(ptrId, (int)event.getX(ptrIdx), (int)event.getY(ptrIdx)); 
     break; 
     case MotionEvent.ACTION_POINTER_UP: 
      ptrId = action >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
      up(ptrId); 
     break; 
     case MotionEvent.ACTION_MOVE: 
      for(int i = 0; i < event.getPointerCount(); ++i) 
       if(event.getPointerId(i) == inputPad.id()) 
       { 
        inputPad.position(event.getX(inputPad.id())); 
        player.velocity(inputPad.delta()); 
        player.stand(); 
        if(enemy != null) { 
         Fighter.collide(player, enemy); 
         enemy.update(); 
        } 
        player.update(); 
        break; 
       } 
     break; 
    } 
} 

は、より多くの説明のためのherehereを参照してください。

+0

Ohh大丈夫です。つまり、onTouchEventは+ finger入力が2つあっても一度呼び出されます。私はonTouchEventが各入力に対して一度呼び出されると考えました。ありがとう! – Brasou

+0

実際にonTouchEvent()は各入力に対して1回呼び出されますが、ACTION_(POINTER_)DOWN/UPにIDを記録し、それが正しい指であるかどうかを確認するためにACTION_MOVEが呼び出されるたびに指のポインタIDと比較する必要があります。 – Jasoneer

関連する問題