2012-04-27 4 views
1

Je développe une application multi-touch dans AndEngine. Pour obtenir les coordonnées des doigts, j'utilise pSceneTouchEvent.getMotionEvent().getX([pointer index]) parce que TouchEvent n'a pas de getter équivalent, seulement pSceneTouchEvent.getX().MotionEvent coordonne les coordonnées de la scène

Le problème est que MotionEvent renvoie les coordonnées à l'écran tandis que TouchEvent renvoie les coordonnées sur la scène. Lorsque je fais un zoom avant ou arrière, l'écran et les coordonnées de la scène ne correspondent pas, j'ai donc besoin de convertir les coordonnées de l'écran en coordonnées de la scène. Comment puis je faire ça?

Répondre

0

Solution trouvée. Andengine gère les événements tactiles d'une manière différente à Android, donc il n'y a pas d'historique des coordonnées tactiles. Je les stocker moi-même simplement des variables privées avant de manipuler l'événement:

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

Puis-je accéder simplement au lieu d'obtenir ces valeurs de la TouchEvent.

0

Vous pouvez accéder au MotionEvent d'origine à partir du TouchEvent.

+0

Je l'ai fait, voir la question. Le problème était que les coordonnées spécifiaient le point touché sur l'écran du téléphone, pas la scène. TouchEvent traduit les coordonnées de l'écran en coordonnées de scène, je cherchais une méthode qui ferait ça pour moi. – JohnEye

1

Face au même problème et solution de travail. Je vais d'abord l'expliquer et ensuite coller la méthode de conversion.

Le problème

coordonnées que vous voulez avoir est scène qui coordonne pertinentes sur votre scène commencent point (0,0) (dans mon cas en bas à gauche comme pour AndEngine anchorCenter) et les limites de (0,0) à [Camera.getSurfaceWidth(), Camera.getSurfaceHeight()].

coordonnées que vous obtenez de MotionEvent est écran les coordonnées avec des limites de (0,0) à [displayMetrix.widthPixels, displayMetrix.heightPixels] et ils sont toujours peu importe constante de zoom ou un appareil photo à la position scène .

explication Solution

Pour abscisse (en général x) calcul vous devrez traduire écran corrdinates à la scène pertinentes coordonnées (limitée avec une largeur de caméra) et l'ajouter à la caméra position de coin gauche sur la scène. Dans la formule, il ressemble à:

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 

Pour ordonnée (en général y), vous devez faire la même chose que pour abscisse mais rappelez-vous qu'il est (surtout) a une mauvaise orientation. Ainsi, la formule sera un peu changé:

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 

exemple de mise en œuvre de la méthode

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