2009-03-15 3 views
8

밤과 주말 프로젝트로 Android 플랫폼 용 비디오 게임을 진행하고 있습니다.게임 제어용 TouchScreens 사용

잘 지내고 있지만, 나는 통제 감각에 매우 만족하지 않습니다.

이 게임에서는 화면에서 오브젝트를 좌우로 움직입니다. 화면 하단에는 손가락이 있어야하는 "터치 패드"가 있습니다.

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

I는 현재 "MOVING_LEFT, MOVING_RIGHT, NOT_MOVING"을 보유하는 상태 변수를 이용하고, 플레이어 오브젝트의 위치에 해당 변수에 기초하여 각각의 프레임을 갱신하고있다. 터치 스크린 입력을 읽고이 상태 변수가 설정 그러나

, 내 코드 중 하나를 너무 sensative, 또는 너무 랙이, 내가 그것을 조정할 방식에 따라

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

아이디어는 어떤 움직임이있을 때 그 , 나는 사용자 손가락의 이전 위치를 확인한 다음 플레이어를 움직일 방향을 결정합니다.

이것은 잘 작동하지 않습니다. 여기에 일부 IPhone/Android 개발자가 터치 스크린을 통해 올바른 컨트롤을 수행하는 방법을 알아 냈고 조언을 해줄 수 있다고 생각합니다.

+0

"너무 잘 작동하지 않습니다"와 "너무 지저분하거나 너무 민감합니다"를 정의 할 수 있습니까? 이 동작 방법에 대한 설명은 유용 할 것입니다 –

+0

2 개의 민감한 의미는 손가락을 10 분의 1 인치 이동시키고 플레이어가 화면을 가로 지르는 것을 의미합니다. 뒤떨어지면 플레이어를 움직이기 위해 전체 화면에서 손가락을 움직여야 함을 의미합니다 인치. :) – FlySwat

답변

2

Windows에서 "직사각형 드래그"와 비슷한 것을 시도해 볼 수 있습니다. 무언가에 마우스 버튼을 누르고 있으면 마우스가 마우스 다운 위치 주변의 작은 영역 밖으로 이동할 때까지 드래그 작업을 시작하지 않습니다. 클릭하는 동안 동일한 픽셀에 커서를 두는 것이 매우 어렵 기 때문에

첫 번째 시도는 (int)e.getX() >= this.mTouchX + DEAD_ZONE 일 수 있으며 다른 경우는 DEAD_ZONE이 작은 정수일 수 있습니다.

그러나 이것은 동일한 선에서 돌아서는 것을 다루지 않습니다. 현재 위치가 우회전 한 후 마지막 위치의 왼쪽에있는 최소 DEAD_ZONE 픽셀 이상일 때 왼쪽으로 돌아가거나 그 반대의 경우도 마찬가지입니다.

2

하나의 명백한 문제는 마지막 터치 이후의 시간을 아무데도 고려하지 않는다는 것입니다.

-x/+x-y/+y의 아날로그 범위에서 플레이어가 원하는 동작을 표현한 다음 시간을 기준으로 실제 이동을 수행하는 것이 좋습니다.

예.

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

개체의 최대 속도는 10ms의-1 선수의 손가락이 다음 개체가 5m 초마다 이동 될 제어 패드 0.5에서되도록합니다. 게임이 10fps에서 실행 중이면 각 프레임에서 개체가 0.5m 이동합니다.

이 수치는 허구이지만, 움직임을 제어하고 시간을 고려해야 할 필요성을 보여줍니다.

관련 문제