Zitat von
Diamondback2007:
wenn ich aber jetz für jedes rechteck einzeln überprüfe ob das object "ball"(ein quadrat) über meinem rechteck ist, passiert es das der ball zu schnell ist, d. h. das er durch das rechteck durchfliegt bevor das spiel merkt das der ball eig kollidiert. kann ich die kollision irgendwie anders lösen?
Hi,
und erstmal Herzlich Willkommen in der
DP
Zwar hast Du schon ein wenig zu deinem Problem geäussert, aber es fehlt auch noch eine wichtige Information, wie bewegt sich eigentlich Dein Ball? Wann genau berechnest Du die Bewegung/fragst Du Kollisionen ab/...?
Im einfachsten Fall würdest Du einfach die Kollision vor jeder Bewegung berechnen und somit wäre zwar ein langsamer Ball, aber eben nicht ein "Durchfliegen" möglich.
An sich solltest Du aber einfach schauen, was genau Du hast. Du hast eine Menge von Steinen (die eine feste Position und Ausdehnung haben) und einen Ball (der ebenfalls eine Position und eine Ausdehnung hat). Wichtig ist, dass sich nur der Ball frei bewegt. Die Steine werden immer in einem Raster platziert. Das ist in der Regel ein vielfaches ihrer Dimension (häufig z.B. eine ganze oder halbe Breite vom Stein).
Da das Überprüfen aller Steine auf eine mögliche Kollision zu langsam ist kannst Du einfach mal schauen, wie Du die Menge der zu überprüfenden Steine reduzierst. Hier kommt das Raster ins Spiel. Da sich die Steine immer in einem festen Raster bewegen kannst Du für jede Position des Balls einen großen Teil der Steine ausser Acht lassen. Der Ball kann nur solche Steine treffen, die im Raster in der selben Spalte sind, wie der Ball (X-Position). Bei einem max. gefüllten Feld kannst Du also (#Spalten - 1) * #Zeilen Steine unbetrachtet lassen, da diese unmöglich mit dem Ball kollidieren können. Andersherum wirst Du nie mehr als #Zeilen Steine prüfen müssen. Die Anzahl der Zeilen ist dabei wirklich der Worst-Case, es gibt wohl wenig Felder bei denen sich in jeder Zelle einer Spalte ein Stein befindet.
Ja, für die Zeilen sieht es aber eigentlich völlig analog aus. Hier kann der Ball natürlich (abhängig von der Y-Position) nur mit den Steinen kollidieren, die auf der selben Höhe sind wie der Ball.
Du siehst bestimmt schon worauf es hinaus läuft, hast Du die Spalte schon eingeschränkt und schränkst nun die Reihe ein, so hast Du eine eindeutige Koordinate (im Raster), die Du direkt überprüfen kannst. Solange Du die Steine also nur diskret (auf endlich vielen Positionen/in einem festen Raster) platzieren kannst (sollte üblich für ein Bricks-Clone sein), kommst Du mit einer Anfrage aus. Dazu musst Du das Raster nur geeignet speichern. Du benötigst eine Struktur, die Dir einen wahlfreien Zugriff erlaubt. Ein Array wäre genau so eine Struktur (Du kannst über den Index direkt auf eine Zelle zugreifen). Für ein Raster kannst Du einfach ein Array von Arrays verwenden. Abhängig von der Ball-Position musst Du dann nur noch eine Zelle abfragen (und das sollte sehr schnell gehen).
Natürlich hat ein Array einen gewissen Overhead (liegt daran, dass einige Felder nie gefüllt sein werden), aber der Speicherplatzbedarf dürfte sich in Grenzen halten. Alternativ kannst Du auch ein Array für die Spalten oder Zeilen anlegen und in jeder Zelle eine Liste (mit dyn. Größe) speichern. Dann kannst Du hier den Suchbereich auf eine Spalte/Zeile eingrenzen, musst aber über alle Elemente der Liste iterieren.
Ich denke allerdings, dass Dein Problem nicht im zu langsamen Suchen liegt als vielmehr in der Prüfung der Kollision bzw. dem Aufrufzeitpunkt dieser Überprüfung.
Ach ja, deinen Code hab ich mir ehrlich gesagt nicht angeschaut. Hoffe es hilft Dir weiter,
Gruß Der Unwissende
[Edit]
Wo war der rote Kasten?! (wie so oft in letzter Zeit)
[/Edit]