J'ai passé d'innombrables heures à lire des tutoriels et à regarder toutes les questions liées à multiTouch d'ici et à Stackoverflow. Mais je n'arrive pas à comprendre comment le faire correctement. J'utilise une boucle pour obtenir mon pointerId
, je ne vois pas beaucoup de gens faire cela, mais c'est la seule façon que j'ai réussi à faire fonctionner quelque peu.
J'ai deux joysticks sur mon écran, un pour se déplacer et un pour contrôler la rotation de mes sprites et l'angle qu'il tire, comme dans Monster Shooter. Ces deux fonctionnent bien.
Mon problème est que lorsque je déplace mon sprite en même temps que la prise de vue Im, mon touchingPoint
pour mon mouvement est réglé sur celui touchingPoint
de ma prise de vue, car le x
et y
est plus haut sur la prise touchingPoint
de vue ( moving-stick
sur le côté gauche de l'écran, shooting-stick
sur le côté droit) , mon sprite accélère, cela crée un changement de vitesse indésirable pour mon sprite.
c'est ainsi que je l'ai résolu avec votre aide! c'est pour toute personne qui pourrait rencontrer un problème similaire:
public void update(MotionEvent event) {
if (event == null && lastEvent == null) {
return;
} else if (event == null && lastEvent != null) {
event = lastEvent;
} else {
lastEvent = event;
}
int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;
int pid = action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int x = (int) event.getX(pid);
int y = (int) event.getY(pid);
int index = event.getActionIndex();
int id = event.getPointerId(index);
String actionString = null;
switch (actionCode)
{
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
actionString = "DOWN";
try{
if(x > 0 && x < steeringxMesh + (joystick.get_joystickBg().getWidth() * 2)
&& y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){
movingPoint.x = x;
movingPoint.y = y;
dragging = true;
draggingId = id;
}
else if(x > shootingxMesh - (joystick.get_joystickBg().getWidth()) && x < panel.getWidth()
&& y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){
shootingPoint.x = x;
shootingPoint.y = y;
shooting=true;
shootingId=id;
}
}catch(Exception e){
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE:
if(id == draggingId)
dragging = false;
if(id == shootingId)
shooting = false;
actionString = "UP";
break;
case MotionEvent.ACTION_MOVE:
for(index=0; index<event.getPointerCount(); index++) {
id=event.getPointerId(index);
int xx = (int) event.getX(index); //pro naming of variable
int yy = (int) event.getY(index);
if(dragging && id == draggingId) {
if(xx > 0 && xx < (steeringxMesh + joystick.get_joystickBg().getWidth() * 2)
&& yy > yMesh - (joystick.get_joystickBg().getHeight()) && yy < panel.getHeight()) {
movingPoint.x = xx;
movingPoint.y = yy;
}
else
dragging = false;
}
if(shooting && id == shootingId){
if(xx > shootingxMesh - (joystick.get_joystickBg().getWidth()) && xx < panel.getWidth()
&& yy > yMesh - (joystick.get_joystickBg().getHeight()) && yy < panel.getHeight()) {
shootingPoint.x = xx;
shootingPoint.y = yy;
}
else
shooting = false;
}
}
actionString = "MOVE";
break;
}
Log.d(TAG, "actionsString: " + actionString + ", pid: " + pid + ", x: " + x + ", y: " + y);
Je ne posterais pas autant de code si je n'étais pas à une perte absolue de ce que je fais mal. Je n'arrive tout simplement pas à bien comprendre le fonctionnement du multi-touch.
movingPoint
change fondamentalement pour mon premier et mon deuxième doigt. Je le lie à une boîte, mais aussi longtemps que je tiens un doigt dans cette boîte, il change sa valeur en fonction de l'endroit où mon deuxième doigt touche. Il se déplace dans la bonne direction et rien ne donne d'erreur, le problème est le changement de vitesse, c'est presque comme s'il additionne les deux points de contact.