2012-02-24 3 views
7

मैं वर्तमान में एक गेम बनाने की प्रक्रिया में हूं जहां उपयोगकर्ता स्क्रीन के बाईं तरफ स्क्रीन जॉयस्टिक पर एक जहाज को नियंत्रित करता है और स्क्रीन के दाईं ओर टैप करके आग लगाता है। हालांकि, मल्टीटाउच पर मेरे प्रयास असफल रहे हैं। जब उपयोगकर्ता जॉयस्टिक को पहले स्पर्श करता है और फिर आग लग जाता है, तो यह पूरी तरह से काम करता है, लेकिन जब उपयोगकर्ता फायरिंग करते समय छड़ी को छूता है, तो उपयोगकर्ता जॉयस्टिक को खींचने में सक्षम नहीं होता है। मैं अभी भी एंड्रॉइड के लिए नया हूं इसलिए किसी भी मदद की सराहना की जाएगी। मैं नीचे दिए गए कोड को पेस्ट कर दूंगा।एंड्रॉइड मल्टीटाउच गेम

@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

अगर यह एक हार्डवेयर बात है: प्रयास करें। कुछ Google उपकरणों में मल्टीटाउच के साथ अजीब समस्याएं हैं: https://play.google.com/store/apps/details?id=multitouchpro.tests&hl=de – devsnd

+0

मुझे नहीं लगता कि यह एक हार्डवेयर चीज है। बहु स्पर्श मेरे फोन पर अच्छी तरह से काम करता है। मैं इसे अपने आकाशगंगा एस 2 पर परीक्षण कर रहा हूं – user1229888

उत्तर

1

यह देखते हुए कि आप अलगाव में जॉयस्टिक और आग बटन में हेरफेर कर सकते हैं, यह तर्क करने कि आप स्क्रीन आयाम सही ढंग से हो रही है और अपने खेल वस्तु के लिए एक सूचक के आसपास के क्षेत्र का पता लगाने के बारे में सब कुछ सही है खड़ा है। मैंने कुछ एंड्रॉइड संस्करणों और मल्टी टच के साथ मुद्दों के बारे में पढ़ा है, लेकिन मान लीजिए कि यह समस्या नहीं है।

MotionEvent के साथ मुश्किल चीज यह है कि इसे एकाधिक पॉइंटर्स के लिए निकाल दिया जाता है और यदि आप स्पर्श और आंदोलन में रूचि रखते हैं तो आपको सभी संभावित पॉइंटर्स पर विचार करने की आवश्यकता है। मुझे लगता है कि समस्या आपके दृष्टिकोण में झूठ बोल सकती है।

यह निर्धारित करने के बजाय कि उपयोगकर्ता क्या स्पर्श कर रहा है और फिर विभिन्न प्रकार की घटनाओं को क्या करना है, यह पता लगाने के बजाय, आपको यह पता लगाना चाहिए कि किस प्रकार की घटना हो रही है और फिर निर्धारित करें कि उपयोगकर्ता किस ऑब्जेक्ट के साथ बातचीत कर रहा है। इससे आपका कोड थोड़ा क्लीनर बन जाएगा और भविष्य में समस्याओं को सुलझाना आसान हो जाएगा।

मैंने ऊपर अपना उदाहरण लिया और इसे नीचे दिखाए गए अनुसार पुनः लिखें। यह उदाहरण स्क्रीन पर टेक्स्ट लिखने के लिए बस यह दिखाएगा कि उपयोगकर्ता कहां स्पर्श कर रहा है। यह आग बटन के बाद जॉयस्टिक स्पर्श को निर्धारित करने में सक्षम है और इसके विपरीत।

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; 
     } 
    } 

}