Rolf B: Problem mit Spritebewegung

Beitrag lesen

Hallo af2111,

da ist einiges im Argen.

  • wenn du 20 Münzen hast, musst Du auch die Positionen aller Münzen überprüfen. Deine coordinates() Funktion liefert aber nur die Position der zuletzt generierten Münze. Du hast dein coins Array. Das musst Du nach jeder Positionsveränderung des Sprite durchlaufen und prüfen, ob das Sprite eine Münze berührt.
  • Dein coords Array bringt deswegen nicht viel. Du kannst statt coords[3] und coords[4] genauso gut spritePosX und spritePosY updaten und das zum Vergleich verwenden.
  • Die Frage, ob das Sprite die Münze berührt, beantwortet sich nicht durch den Vergleich der Koordinaten einer Ecke. Vor allem deshalb nicht, weil dein Sprite in Zehnpixel-Schritten springt, deine Münzen aber pixelgenau verteilt werden. Das Sprite hat eine Fläche, eine Münze hat eine Fläche. Je nach Form von Münze und Sprite ist ein echter Berührtest relativ aufwändig. Die komplett richtige Lösung für beliebige Formen besteht in einem Pixel-für-Pixel Vergleich, ob sich an einer Koordinate die Pixel von Münze und Sprite überschneiden. In den meisten Fällen kann man vereinfachen.

Eine Münze dürfte ein Kreis sein, hat also einen Mittelpunkt und einen Radius $$r_M$$. Wenn dein Sprite ein Quadrat ist, kannst Du ihm einen Kreis einbeschreiben, der ebenfalls Mittelpunkt und Radius $$r_S$$ hat. Für einen Kollisionstest berechnest Du den Abstand der Mittelpunkte (siehe Pythagoras). Ist der kleiner als $$r_M+r_S$$, liegt eine Kollision vor bzw. das Sprite hat die Münze berührt. Wenn Sprite und Münze gleich groß sind, kannst Du Dir die Mittelpunktberechnung sogar schenken und einfach die Abstände von (spriteX,spriteY) und (coinX,coinY) - für alle Coins - berechnen.

Ist dein Sprite kein Quadrat, oder ist seine Form einem Kreis sehr unähnlich, musst Du entweder Ungenauigkeiten bei der Kollisionsberechnung hinnehmen oder Dir einen Algorithmus überlegen, wie Du eine Überlappung von Sprite und Münze berechnen kannst.

Rolf

--
sumpsi - posui - clusi