Pixel Perfect Kollisionserkennung zwischen einer benutzerdefinierten Ansicht und einem ImageView

9

Ich habe eine CustomView- und eine Image-Ansicht. Der CustomView ist ein Ball, der sich um den Bildschirm bewegt und von den Wänden springt. Das Bild ist ein Viertelkreis, den Sie bei Berührung in einem Kreis drehen können. Ich versuche mein Spiel so zu gestalten, dass beim Überfahren der gefüllten Pixel aus der CustomView mit den gefüllten Pixeln aus dem ImageView eine Kollision erkannt wird. Das Problem, das ich habe, ist, ich weiß nicht, wo die gefüllten Pixel in jeder Ansicht sind.

Hier ist mein XML-Code

%Vor%

Meine MainActivity

%Vor%

MyOnTouchListener-Klasse:

%Vor%

Und mein AnimatedView

%Vor%

Meine Frage lautet: Wie kann ich die gefüllten Pixel aus diesen beiden Ansichten abrufen und sie durch eine Funktion leiten, die eine Kollision erkennt?

Vielen Dank im Voraus für die Hilfe !:)

    
Leyton 25.06.2017, 01:45
quelle

2 Antworten

1

Sie müssen wirklich "gefüllte Pixel" definieren. Ich nehme an, du meinst die nicht transparenten Pixel. Der einfachste Weg, diese zu finden, besteht darin, die gesamte Ansicht in eine Bitmap umzuwandeln und durch ihre Pixel zu iterieren. Sie können ein View in ein Bitmap wie folgt umwandeln:

%Vor%

Sie müssen auch die absolute Position der Ansichten abrufen:

%Vor%

Dann müssen Sie nur die Pixel jedes Bitmap durchlaufen, ihre Farben prüfen, um zu wissen, ob sie "gefüllt" sind, und überprüfen, ob sie sich aufgrund ihrer Koordination innerhalb der Bitmaps und der absoluten Position überlappen der Ansichten auf dem Bildschirm.

Das Iterieren durch eine Bitmap erfolgt folgendermaßen:

%Vor%

Aber ich muss sagen, ich denke nicht, dass es eine gute Idee ist, diese schweren Berechnungen auf dem UI-Thread durchzuführen. Es gibt Dutzende von viel besseren Möglichkeiten, Kollisionen zu erkennen als eine pixelgenaue Überprüfung. Dies wird wahrscheinlich extrem verzögert auftreten.

    
Iman Akbari 02.07.2017, 10:12
quelle
1

Sie könnten Ihre Bilder mit Array von Punkten einkapseln, die Ihre Grenzkoordinaten markieren (und sie beim Verschieben aktualisieren / basierend auf dem Ursprung berechnen), dann können Sie entscheiden, ob sich ein Objekt in Kontakt befindet oder nicht (falls eines von oposing ist) Arrays teilen sich den gleichen Punkt)

    
PanBrambor 29.06.2017 15:54
quelle