Ich habe unzählige Stunden damit verbracht, Tutorials zu lesen und mir alle Fragen zu multiTouch von hier und Stackoverflow anzuschauen. Aber ich kann einfach nicht herausfinden, wie ich das richtig machen soll. Ich benutze eine Schleife, um meine zu bekommen pointerId
, ich sehe nicht viele Leute, die dies tun, aber es ist die einzige Möglichkeit, es irgendwie zum Laufen zu bringen.
Ich habe zwei Joysticks auf meinem Bildschirm, einen zum Bewegen und einen zum Steuern der Sprites-Rotation und des Winkels, den er schießt, wie in Monster Shooter. Beide funktionieren gut.
Mein Problem ist, dass, wenn ich mein Sprite gleichzeitig mit dem Schießen bewege, touchingPoint
meine Bewegung auf das touchingPoint
Schießen eingestellt ist, da das x
und y
höher auf dem touchingPoint
Schießen liegt ( moving-stick
auf der linken Seite des Bildschirms, shooting-stick
auf der rechten Seite). Wenn mein Sprite schneller wird, führt dies zu einer unerwünschten Geschwindigkeitsänderung für mein Sprite.
So habe ich es mit Ihrer Hilfe gelöst! Dies ist für alle, die auf ein ähnliches Problem stoßen könnten:
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);
Ich würde nicht so viel Code posten, wenn ich nicht den absoluten Verlust dessen hätte, was ich falsch mache. Ich kann einfach nicht gut verstehen, wie MultiTouching funktioniert.
Grundlegende movingPoint
Änderungen für meinen ersten und zweiten Finger. Ich binde es an eine Box, aber solange ich einen Finger in dieser Box halte, ändert sich sein Wert je nachdem, wo mein zweiter Finger berührt. Es bewegt sich in die richtige Richtung und nichts gibt einen Fehler aus. Das Problem ist die Geschwindigkeitsänderung. Es ist fast so, als würde es die beiden Berührungspunkte addieren.