2012-02-24 28 views
7

Tôi hiện đang trong quá trình tạo trò chơi, nơi người dùng điều khiển một con tàu có cần điều khiển trên màn hình ở bên trái màn hình và kích hoạt bằng cách chạm vào bên phải của màn hình. Tuy nhiên, những nỗ lực của tôi ở multitouch đã không thành công. Khi người dùng chạm vào cần điều khiển trước và sau đó kích hoạt, nó hoạt động hoàn hảo, nhưng khi người dùng chạm vào thanh trong khi bắn, người dùng không thể kéo cần điều khiển. Tôi vẫn còn mới để android vì vậy bất kỳ trợ giúp sẽ được đánh giá rất nhiều. Tôi sẽ dán mã dưới đây.Android Multitouch Game

@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

Vui lòng thử nếu đó là một điều phần cứng. Một số thiết bị google có vấn đề lạ với multitouch: https://play.google.com/store/apps/details?id=multitouchpro.tests&hl=de – devsnd

+0

Tôi không nghĩ rằng đó là một điều phần cứng. Multi touch hoạt động tốt trên điện thoại của tôi. Tôi đã thử nghiệm nó trên thiên hà của tôi s2 – user1229888

Trả lời

1

Cho rằng bạn có thể thao tác các nút điều khiển và lửa trong sự cô lập, nó đứng vào lý do mà bạn đang nhận được các kích thước màn hình một cách chính xác và mọi thứ khác về việc phát hiện vùng lân cận của một con trỏ đến đối tượng trò chơi của bạn là đúng. Tôi đã đọc về các vấn đề với một số phiên bản Android và đa cảm ứng nhưng hãy giả sử đó không phải là vấn đề.

Điều khó khăn với một MotionEvent là nó được tắt cho nhiều con trỏ và nếu bạn quan tâm đến chạm và chuyển động, bạn cần phải xem xét tất cả các con trỏ có thể. Tôi nghĩ vấn đề có thể nằm trong cách tiếp cận của bạn. Thay vì xác định những gì người dùng đang chạm vào và sau đó tìm ra điều cần làm cho các loại sự kiện khác nhau, bạn nên tìm ra loại sự kiện nào đang xảy ra và sau đó xác định đối tượng người dùng đang tương tác với. Điều này sẽ làm cho mã của bạn sạch hơn một chút và giúp dễ dàng phát hiện ra các vấn đề trong tương lai.

Tôi lấy ví dụ của bạn ở trên và viết lại nó như hiển thị bên dưới. Ví dụ này sẽ chỉ viết văn bản vào màn hình để hiển thị những gì/nơi người dùng đang chạm vào. Nó có thể xác định các phím điều khiển chạm sau nút lửa và ngược lại.

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

} 
Các vấn đề liên quan