Touchevents und Spritekollision
Dieses Touchevent erreichen wir indem wir in unserer GameView Klasse den folgenden Code einfügen:
@Override
public boolean onTouchEvent(MotionEvent event) {
synchronized (getHolder()) {
for (int i = spriteList.size() - 1; i >= 0; i--) {
Sprite sprite = spriteList.get(i);
if (sprite.isTouched(event.getX(), event.getY())) {
rndCreateSprite();
removeSprite(i);
break;
}
}
}
}
Diese Methode gibt einen Wert true zurück, wenn der Bildschirm berührt wurde. Außerdem Fragen wir in dieser Methode mit einer for- Schleife ab, ob diese Berührung einen unserer Sprites erwischt hat. Dabei gehen wir die ArrayList von oben nach unten durch. Das ist wichtig, damit nur der oberste Sprite enternt wird und nicht mehrere, wenn sich weitere Sprites unter dem Sprite befinden den wir berührt haben. Dafür sorgt außerdem das break.
Synchronized (getHolder()) benötigen wir um keine Probleme mit unserem Thread zu bekommen, wenn wir im gleichen Moment klicken wie gezeichnet wird. Dann könnte nämlich ein Konflikt auftreten.
Die Methode removeSprite() soll den Sprite der berührt wurde aus der Liste der Sprites, und außerdem die zugeordnete Nummer, die wir später noch brauchen werden, löschen .
private void removeSprite(int index) {
spriteList.remove(index);
spriteListNum.remove(index);
}
Anschließen müssen wir noch die Methode isTouched() in der Sprite Klasse erstellen:
public boolean isTouched(float x2, float y2) {
return x2 > x && x2 < x + width && y2 > y && y2 < y + height;
}
Diese Methode bekommt einen x, und einen y-Wert übergeben, also die Position auf der der Spieler den Bildschirm berührt hat und gibt zurück wo sich der Sprite befindet. Also welchen Bereich der Sprite auf dem Bildschirm abdeckt.
Und da nun durch Swipen über den Screen mehrere Sprites entfernt werden, ohne dass wir einen neuen Click machen müssen, müssen wir noch etwas in unseren onTouchEvent einfügen.
if (System.currentTimeMillis() - lastClick > 300) {
lastClick = System.currentTimeMillis();
}
Wenn die Zeit die zwischen zwei Clicks vergangen ist, unter 300ms liegt, soll nichts passieren, wenn sie darüber liegt, soll das passieren was wir bisher in unserer onTouchEvent() – Methode hatten.
@Override
public boolean onTouchEvent(MotionEvent event) {
if (System.currentTimeMillis() - lastClick > 300) {
lastClick = System.currentTimeMillis();
synchronized (getHolder()) {
for (int i = spriteList.size() - 1; i >= 0; i--) {
Sprite sprite = spriteList.get(i);
if (sprite.isTouched(event.getX(), event.getY())) {
rndCreateSprite();
removeSprite(i);
break;
}
}
}
}
return true;
}