2009-03-15 30 views
8

Tôi đang làm việc trên trò chơi điện tử đầu tiên của mình cho nền tảng Android như một dự án đêm và cuối tuần.Sử dụng Màn hình cảm ứng để điều khiển trò chơi

Nó đang đến cùng độc đáo, nhưng tôi rất không hài lòng với cảm giác kiểm soát.

Trong trò chơi này, bạn di chuyển một đối tượng sang trái và phải trên màn hình. Ở dưới cùng của màn hình là một "touchpad" của các loại, đó là nơi ngón tay của bạn nên nghỉ ngơi.

/-------------------------\ 
|       | 
|       | 
|       | 
|  Game Area   | 
|       | 
|       | 
|       | 
|       | 
|       | 
/-------------------------\ 
|       | 
|  Touch Area  | 
|       | 
\-------------------------/ 

Tôi hiện đang sử dụng biến trạng thái để giữ "MOVING_LEFT, MOVING_RIGHT, NOT_MOVING" và đang cập nhật vị trí của đối tượng trình phát mỗi khung dựa trên biến đó.

Tuy nhiên, mã của tôi mà đọc đầu vào màn hình cảm ứng và bộ biến trạng thái này là một trong hai quá sensative, hoặc quá lag, tùy thuộc vào cách tôi tinh chỉnh nó:

public void doTouch (MotionEvent e) { 
    int action = e.getAction(); 

    if (action == MotionEvent.ACTION_DOWN) { 
     this.mTouchX = (int)e.getX(); 
     this.mTouchY = (int)e.getY();   
    } 
    else if (action == MotionEvent.ACTION_MOVE) { 
     if ((int)e.getX() >= this.mTouchX) { 
      this.mTouchX = (int)e.getX(); 
      this.mTouchY = (int)e.getY(); 
      if (this.TouchRect.contains(this.mTouchX, this.mTouchY)) {    
       this.mTouchDirection = MOVING_RIGHT; 
      } 
     } 
     else if ((int)e.getX() <= this.mTouchX) { 
      this.mTouchX = (int)e.getX(); 
      this.mTouchY = (int)e.getY(); 
      if (this.TouchRect.contains(this.mTouchX, this.mTouchY)) {    
       this.mTouchDirection = MOVING_LEFT; 
      } 
     } 
     else { 
      this.mTouchDirection = NOT_MOVING; 
     }    
    } 
    else if (action == MotionEvent.ACTION_UP) { 
     this.mTouchDirection = NOT_MOVING; 
    }  
} 

Ý tưởng là khi có bất kỳ chuyển động , Tôi kiểm tra vị trí trước đó của ngón tay người dùng và sau đó tìm ra hướng di chuyển người chơi.

Điều này không hoạt động tốt, tôi thấy có một số nhà phát triển iPhone/Android ở đây đã tìm ra cách thực hiện điều khiển tốt qua màn hình cảm ứng và có thể đưa ra một số lời khuyên.

+0

Bạn có thể xác định "không hoạt động tốt" và "quá chậm hoặc quá nhạy cảm" hay không. Một mô tả về cách hoạt động này sẽ hữu ích –

+0

Hai phương tiện nhạy cảm mà tôi di chuyển ngón tay của tôi một giây một inch và người chơi đang ở trên màn hình .. độ trễ có nghĩa là tôi phải di chuyển ngón tay trên toàn bộ màn hình để di chuyển trình phát một inch. :) – FlySwat

Trả lời

2

Bạn có thể thử một cái gì đó tương tự như "kéo hình chữ nhật" trên Windows. Khi bạn giữ nút chuột trên thứ gì đó, bạn không bắt đầu thao tác kéo cho đến khi con chuột di chuyển ra ngoài một vùng nhỏ xung quanh vị trí chuột xuống. Lý do là rất khó để giữ con trỏ trên cùng một pixel trong khi nhấp chuột.

Vì vậy, lần thử đầu tiên có thể là (int)e.getX() >= this.mTouchX + DEAD_ZONE và tương tự cho trường hợp khác, trong đó DEAD_ZONE là một số nguyên nhỏ.

Điều này không giải quyết được việc quay vòng trong cùng một đột quỵ. Bạn có thể giải quyết bằng cách chỉ rẽ trái khi vị trí hiện tại ít nhất là DEAD_ZONE pixel ở bên trái của vị trí cuối cùng sau khi rẽ phải và ngược lại.

2

Một vấn đề rõ ràng là bạn không tính đến thời gian từ lần chạm cuối cùng.

Tôi khuyên bạn nên xử lý các liên lạc của người chơi dưới dạng biểu thức chuyển động mong muốn trên dải tương tự từ -x/+x-y/+y, sau đó thực hiện chuyển động thực tế ở nơi khác dựa trên thời gian.

Ví dụ:

objectPos += objectPos + (joyPos * timeDelta * maxSpeed); 

Vì vậy, nếu tốc độ tối đa của đối tượng là 10ms-1 và ngón tay là 0,5 trên bàn điều khiển thì vật thể sẽ di chuyển 5 mét mỗi giây. Nếu trò chơi của bạn đang chạy ở tốc độ 10 khung hình/giây thì mỗi khung hình đối tượng sẽ di chuyển 0,5 mét.

Những con số này là hư cấu, nhưng hy vọng chứng minh sự cần thiết phải tách kiểm soát khỏi chuyển động và sau đó là yếu tố trong thời gian.

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