Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Hey,
mir ist nicht ganz klar wo dein Problem liegt. Du hast dein Raster mit den jeweiligen Daten. Wenn du weißt wo sich der Spieler hinbewegen wird kannst du genau diese Zellen im Raster kontrollieren. Da dein Spieler nicht nur ein einzelner Punkt ist wird es nicht ausreichen nur eine einzelne Zelle zu prüfen. Du kennst ja die Größe des Spielers und kannst dadurch berechnen welche umliegenden Zellen du prüfen möchtest. Jetzt musst du einfach checken ob der Spieler kollidiert und/oder irgendein Trigger ausgelöst wird. Alle anderen Felder betrachtest du zu diesem Zeitpunkt gar nicht. Dadurch erübrigen sich deine Probleme doch oder nicht? Mal vereinfacht betrachtet ist deine Welt ein Raster und dein Spieler kann sich nur genau auf diesem Raster bewegen. In dieser Version kann dein Spieler also immer nur genau auf einer Zelle sein. Du musst jetzt lediglich die Ziel-Zelle des Spielers prüfen. Das macht pro Schritt eine Überprüfung auf Kollision und eine Überprüfung auf ein Event. Das klingt für mich völlig in Ordnung.
Gegenfrage, wie willst du dir denn merken ob du die Brücke schon überprüft hast? Du würdest einfach die eine gegen eine andere Abfrage tauschen. Und was genau meinst du mit jeder einzelnen Koordinate der Brücke? Wenn der Spieler sich von Kachel zu kachel bewegt dann musst du natürlich auch prüfen ob er das überhaupt darf.
Ich glaube wir reden stark aneinander vorbei. Wenn ich dich richtig verstehe hast du doch eine Art von Tilemap. Sagen wir mal deine Kollisionseben sieht in etwa so aus:
1111111111
1000000001
1000000001
1000110011
1000010011
1111111111
Hierbei steht 1 für Kollision und 0 für eine freie Fläche.
Dein Spieler befindet sich jetzt an irgendeiner Stelle auf der Karte. Du musst die Kollision natürlich nur bei den Kacheln abfragen die der Spieler aktuell auch erreicht. Befindet sich der Spieler am unteren Rand der Karte prüfst du natürlich nicht auf Kollision mit Flächen die sich oben befinden. Ist meine Annahme hier schon falsch?
Die Verwaltung der Liste ist aber schon ein ganz schöner overhead und am Ende ist vor allem wichtig dass dein Code einfach und verständlich ist. Wenn du zwei Monate später da rein guckst willst du möglichst direkt verstehen was da passiert. Und zusätzlich zum Verständnis hast du bei einfachem Code weniger Potenzial Fehler zu machen. Die paar Überprüfungen pro Frame werden schon schnell genug laufen, mach dir da mal keine Sorgen. Und solltest du am Ende tatsächlich Probleme mit der Performance haben ist es sinnvoller gezielt nach den Bottlenecks in deinem Code zu suchen. Du versuchst hier Dinge zu optimieren die das vermutlich gar nicht nötig haben.
Du kannst eher den Radius verkleinern. Dein Spieler hat die Größe einer Kachel. Dadurch kann er maximal auf vier Kacheln gleichzeitig stehen. Welche Kacheln das sind kannst du ja relativ simpel berechnen. Du kennst die Position des Spielers und die Größe der Kacheln und kannst damit die Indizes der Kacheln auf denen der Spieler steht berechnen. Das ist am Ende viel schneller als Kacheln auf Listen zu schieben, zu prüfen wie aktuell die Liste ist und diese wieder zu löschen.
Ich frage mich halt nur wie es z.B. Openworld Spiele wie Zelda Breath of the Wild machen
Werbeanzeige