2012-04-27 6 views
1

AndEngine에서 멀티 터치를 사용하는 응용 프로그램을 개발 중입니다. TouchEvent에 동일한 getter가 없기 때문에 손가락을 만지는 좌표를 얻으려면 pSceneTouchEvent.getMotionEvent().getX([pointer index])을 사용합니다 (pSceneTouchEvent.getX()).MotionEvent를 Scene 좌표에 맞 춥니 다

문제는 TouchEvent가 장면에서 좌표를 반환하는 동안 MotionEvent가 화면에서 좌표를 반환한다는 것입니다. 확대 또는 축소 할 때 화면과 장면 좌표가 일치하지 않으므로 화면 좌표를 장면 좌표로 변환해야합니다. 어떻게해야합니까?

답변

0

해결책을 찾았습니다. Andengine은 Android와 다른 방식으로 터치 이벤트를 처리하므로 터치 좌표의 기록이 없습니다. 이벤트를 처리하기 전에 개인 변수에 직접 저장하기 만하면됩니다.

if (pSceneTouchEvent.getPointerID() == 0) { 
    pointer0LastX = pSceneTouchEvent.getX(); 
    pointer0LastY = pSceneTouchEvent.getY(); 
} 
if (pSceneTouchEvent.getPointerID() == 1) { 
    pointer1LastX = pSceneTouchEvent.getX(); 
    pointer1LastY = pSceneTouchEvent.getY(); 
} 

그런 다음 TouchEvent에서 값을 가져 오는 대신 액세스합니다.

0

TouchEvent에서 원래 MotionEvent에 액세스 할 수 있습니다.

+0

내가 질문을 참조 것을했다. 문제는 좌표가 장면이 아닌 전화 화면에서 터치 된 지점을 지정했기 때문입니다. TouchEvent는 스크린 좌표를 씬 좌표로 변환합니다. 나는 그것을위한 방법을 찾고있었습니다. – JohnEye

1

같은 문제에 직면하여 해결 방법을 찾았습니다. 먼저 설명을 한 다음 convert 메소드를 붙여 넣습니다.

당신이 갖고 싶어 좌표 문제는 장면에서 장면과 관련이 (0,0) 점을 시작하는 좌표 (내 경우에 AndEngine anchorCenter에 관해서는 왼쪽 아래)과 범위입니다 (0,0)을 [Camera.getSurfaceWidth(), Camera.getSurfaceHeight()]로 변경합니다.

는 MotionEvent에서 얻을 좌표 화면에 (0,0)에서 경계로 좌표이다 displayMetrix.widthPixels, displayMetrix.heightPixels] 그들은 항상 줌이나 카메라로 장면 - 위치에 상관없이 일정한있어 .

솔루션 설명

를 들어 가로 좌표 계산 (X 일반적으로) 당신이 관련 장면에 화면 corrdinates을 번역해야합니다 좌표 (카메라 폭 경계) 카메라에 추가 장면의 왼쪽 모서리 위치.

x = cameraStartX + screenX * camera.width/display.width 

cameraStartX - camera left corner x position on the scene 
screenX - x you get from MotionEvent 
camera.width - just getWidth() from your camera method 
display.width - display width from DisplayMetrics 

(일반 Y에서) 좌표 당신은 가로 좌표의 경우와 동일한 기능을 수행하지만이 있다고 (무엇보다도)를 기억 잘못된 방향을 가지고해야합니다 : 같은 식 같습니다. 그래서 공식은 약간 변경 될 것입니다 :

y = cameraStartY+(display.heigth-screenY)*camera.height/display.heigth 

cameraStartY - camera left corner y position on the scene 
screenX - y you get from MotionEvent 
camera.height - just getHeight() from your camera method 
display.height - display height from DisplayMetrics 

방법 구현 예

public static void convertScreenToSurfaceCoordinates(
     final Camera camera, 
     final Context context, 
     final float[] screenCoordinates, 
     final float[] surfaceCoordinates) { 
    //you may want to have separate method and fields for display metrics 
    //and no Context as a method param 
    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
    Display display = windowManager.getDefaultDisplay(); 
    DisplayMetrics metrics = new DisplayMetrics(); 
    display.getMetrics(metrics); 
    float displayWidth = Math.max(metrics.widthPixels, metrics.heightPixels); 
    loat displayHeight = Math.min(metrics.widthPixels, metrics.heightPixels); 

    //abscissa 
    surfaceCoordinates[Constants.VERTEX_INDEX_X] = camera.getXMin() 
      + screenCoordinates[Constants.VERTEX_INDEX_X] * camera.getWidth() 
      /displayWidth; 
    //ordinate 
    surfaceCoordinates[Constants.VERTEX_INDEX_Y] = camera.getYMin() 
      + (displayHeight - screenCoordinates[Constants.VERTEX_INDEX_Y]) 
      * camera.getHeight()/displayHeight; 
} 
관련 문제