2012-02-24 21 views
7

Şu anda, kullanıcının ekranın sol tarafındaki ekran joystick'iyle bir gemiyi kontrol ettiği ve ekranın sağ tarafına dokunarak ateşlendiği bir oyun yapım aşamasındayım. Ancak, çoklu dokunma girişimlerim başarısız oldu. Kullanıcı önce joystick'e dokunduğunda ve daha sonra patladığında, mükemmel çalışır, ancak kullanıcı ateş ederken stikine dokunduğunda, kullanıcı joystick'i sürükleyemez. Ben hala android için yeni, bu yüzden herhangi bir yardım büyük takdir edilecektir. Kodu aşağıya yapıştırırım.Android Multitouch Oyunu

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    int action = event.getAction() & MotionEvent.ACTION_MASK; 
    int pointerIndex=(event.getAction()&MotionEvent.ACTION_POINTER_ID_MASK) 
    >>MotionEvent.ACTION_POINTER_ID_SHIFT; 
    int pI = event.getPointerId(pointerIndex); 
    //On screen joystick 
    if(event.getX(pI)<pad.getWidth()+(screenWidth*.18)&&event.getX(pI)>0&&event.getY(pI)<(screenHeight)&&event.getY(pI)>(screenHeight-(0.42*screenHeight))){ 
     sx2=event.getX(pI)-(stick.getWidth()/2); 
     sy2=event.getY(pI); 
     angle=(Math.atan2((sy2-sy),(sx2-sx))); 
    } 
    //firing system 
    if(event.getX(pI)>screenWidth/3){ 
     switch(action){ 
     case MotionEvent.ACTION_DOWN: 
      incrementRunnable.run(); 
      break; 
     case MotionEvent.ACTION_POINTER_DOWN: 
      incrementRunnable.run(); 
      break; 
     case MotionEvent.ACTION_UP: 
      handler.removeCallbacks(incrementRunnable); 
      break; 
     case MotionEvent.ACTION_POINTER_UP: 
      handler.removeCallbacks(incrementRunnable); 
      break; 
     } 

    } 
    //reset joystick 
    if(event.getAction()==MotionEvent.ACTION_UP||event.getAction()==MotionEvent.ACTION_POINTER_UP){ 
     sx2=sx; 
     sy2=sy; 
     handler.removeCallbacks(incrementRunnable); 
    } 
    return true; 
} 
+0

deneyin. Bazı google cihazların multitouch ile ilgili garip sorunları var: https://play.google.com/store/apps/details?id=multitouchpro.tests&hl=de – devsnd

+0

Bunun bir donanım işi olduğunu düşünmüyorum. Çoklu dokunuş telefonumda iyi çalışıyor. Ben galaksim s2 üzerinde test ediyorum – user1229888

cevap

1

Eğer izolasyon joystick ve yangın düğmesini işleyebilirsiniz göz önüne alındığında, doğru ekran boyutlarını alıyoruz ve oyun nesnesine bir işaretçinin civarı algılama konusunda her şey doğru olduğunu nedenle duran. Belirli Android sürümleri ve çoklu dokunuşla ilgili sorunları okudum, ancak bunun sorun olmadığını varsayalım.

MotionEvent ile zor olan şey, birden çok gösterici için kapatılmış olması ve dokunma ve hareketle ilgileniyorsanız, tüm olası işaretleri dikkate almanız gerektiğidir. Meselenin sizin yaklaşımınızda olabileceğini düşünüyorum.

Kullanıcının ne dokunduğunu belirlemek ve ardından farklı türdeki olaylar hakkında ne yapılması gerektiğini bulmak yerine, hangi olay türünün oluştuğunu belirlemeli ve ardından kullanıcının hangi nesneyle etkileşim kurduğunu belirlemelisiniz. Bu, kodunuzu biraz daha temiz hale getirecek ve gelecekte sorunları tespit etmenizi kolaylaştıracak.

Yukarıdaki örneğini aldım ve aşağıdaki şekilde yeniden yazdım. Bu örnek, kullanıcının neye/nerede dokunacağını göstermek için ekrana metin yazacaktır. Yangın butonundan sonra joystick dokunuşlarını belirleyebilir ve bunun tersi de mümkündür. Bir donanım şeymiş

MultiTouchGame.java

package com.droidhut.stackoverflow; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.DisplayMetrics; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.WindowManager; 
import android.widget.TextView; 

public class MultiTouchGame extends Activity implements OnTouchListener { 
    StringBuilder builder = new StringBuilder(); 
    TextView textView; 

    boolean[] joystickTouched = new boolean[10]; 
    boolean[] fireButtonTouched = new boolean[10]; 
    int joyX = 0; 
    int joyY = 0; 

    int screenHeight; 
    int screenWidth; 
    Pad pad = new Pad(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     textView = new TextView(this); 
     textView.setText("Touch and drag (multiple fingers supported)!"); 
     textView.setOnTouchListener(this); 
     setContentView(textView); 

     WindowManager mWinMgr = (WindowManager)getSystemService(Context.WINDOW_SERVICE); 
     DisplayMetrics dm = new DisplayMetrics(); 
     mWinMgr.getDefaultDisplay().getMetrics(dm); 
     screenHeight = dm.heightPixels; 
     screenWidth = dm.widthPixels; 

    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     int action = event.getAction() & MotionEvent.ACTION_MASK; 
     int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
     int pI = event.getPointerId(pointerIndex); 
     switch (action) { 
      case MotionEvent.ACTION_DOWN: 
      case MotionEvent.ACTION_POINTER_DOWN: 
       joystickTouched[pI] = isPointerOnJoystick(event, pointerIndex); 
       fireButtonTouched[pI] = isPointerOnFireButton(event, pointerIndex); 
       break; 
      case MotionEvent.ACTION_UP:   
      case MotionEvent.ACTION_POINTER_UP: 
      case MotionEvent.ACTION_CANCEL: 
       joystickTouched[pI] = false; 
       fireButtonTouched[pI] = false; 
       break; 
      case MotionEvent.ACTION_MOVE: 
       joystickTouched[pI] = isPointerOnJoystick(event, pointerIndex); 
       fireButtonTouched[pI] = isPointerOnFireButton(event, pointerIndex); 
       if (isTouchingJoystick()){ 
        int index = getJoystickPointer(); 
        if (index != -1 && index < event.getPointerCount()){ 
         joyX = (int)event.getX(index); 
         joyY = (int)event.getY(index); 
        } 
       } 
       break; 
     } 

     updateTextView();  
     return true; 
    } 

    private boolean isPointerOnJoystick(MotionEvent event, int pointerIndex){ 
     return (event.getX(pointerIndex)<pad.getWidth()+(screenWidth*.18)&&event.getX(pointerIndex)>0&& 
       event.getY(pointerIndex)<(screenHeight)&&event.getY(pointerIndex)>(screenHeight-(0.42*screenHeight))); 
    } 

    private boolean isPointerOnFireButton(MotionEvent event, int pointerIndex){ 
     return (event.getX(pointerIndex)>screenWidth/3); 
    } 

    private boolean isTouchingJoystick(){ 
     for (int i = 0; i < joystickTouched.length; i++){ 
      if (joystickTouched[i]){ 
       return true; 
      } 
     } 
     return false; 
    } 

    private boolean isTouchingFireButton(){ 
     for (int i = 0; i < fireButtonTouched.length; i++){ 
      if (fireButtonTouched[i]){ 
       return true; 
      } 
     } 
     return false; 
    } 

    private int getJoystickPointer(){ 
     for (int i = 0; i < joystickTouched.length; i++){ 
      if (joystickTouched[i]){ 
       return i; 
      } 
     } 

     return -1; 
    } 

    private void updateTextView() { 
     builder.setLength(0); 
     builder.append(String.format("screenWidth[%d], screenHeight[%d]\n",screenWidth, screenHeight)); 
     builder.append(String.format("joystickTouched[%s]\n", isTouchingJoystick())); 
     builder.append(String.format("fireButtonTouched[%s]\n", isTouchingFireButton())); 
     builder.append(String.format("joystickMovement[%d,%d]",joyX,joyY)); 

     textView.setText(builder.toString()); 
    } 

    private static class Pad { 
     public int getWidth(){ 
     return 200; 
     } 
    } 

}