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
C-/C++-Quelltext |
|
1 2 |
/* 1. */ Table[x,y] /* 2. */ Table[x][y] |
Zitat von »"drakon"«
Also das was du vorhast bringt dir überhaupt nix.
Im schlimmsten Fall hast du sogar Nachteile.
Zitat von »"drakon"«
Ich benutze für meine Tilemap einen std::vectro<std::vector<Tile>>
Und glaub mir. Das Problem von der Performance liegt ganz wo anders.
Zitat von »"drakon"«
Und wenn du lieb bist,gebe ich dir einen Tipp, wo der Zugriff auf ein Tile extreeem billig ist.
Zitat von »"drakon"«
Aber mal so am Rande wofür musst du deine Tilemap so extrem bearbeiten?
Also vergrössern/verkleiner musst du eigl. nie dynamisch. Spalten/Zeilen hinzufügen/entfernen?! :roll:
Zitat von »"drakon"«
Mach ein 2 dimensionalen vector und dann kannst du da drin einen Zeiger auf ein Tile speichern. Wenn dort nix sein soll, machst du hal einen Null Zeiger rein und prüfst dementsprechend. Bearbeiten musst du da nix, ausser das Tile, dass da ist, aber auf das kannst du leicht zugreifen.
Zitat von »"drakon"«
Also ich habe das so gemacht, dass ich sage, dass jedes Tile gleich gross ist auf einer Map.
Zitat
Dann, kannst du ganz einfach, wenn du z.B das Tile an Position 35.43:77.66 haben willst ganz einfach duch allfällige Multiplikation der Grösse direkt auf das Tile 35:78 kommen, wenn du dann noch abrundest. (und je nach Darstellung der Position musst du hald noch ein 50% dazurechnen bevor du abrundest, aber das kennst du ja wahrscheinlich schon).
Zitat von »"Nexus"«
Zitat von »"drakon"«
Aber mal so am Rande wofür musst du deine Tilemap so extrem bearbeiten?
Also vergrössern/verkleiner musst du eigl. nie dynamisch. Spalten/Zeilen hinzufügen/entfernen?! :roll:
Eben nicht extrem, aber es sollte trotzdem einigermassen konfortabel sein. Ich werde einen Level-Editor haben, bei dem ich die Ränder verändern oder die Dimension explizit angeben kann. Aber der Vector-Wrapper ist eine Überlegung wert.
Zitat von »"Nexus"«
Zitat von »"drakon"«
Mach ein 2 dimensionalen vector und dann kannst du da drin einen Zeiger auf ein Tile speichern. Wenn dort nix sein soll, machst du hal einen Null Zeiger rein und prüfst dementsprechend. Bearbeiten musst du da nix, ausser das Tile, dass da ist, aber auf das kannst du leicht zugreifen.
Bringt es mehr, es über einen Zeiger zu lösen? Ich hätte jetzt eher an direkten Zugriff auf die Tiles gedacht, sonst bringt mir ja die automatische Speicherverwaltung vom Vektor nicht viel. Oder kommt man ernsthaft in Probleme wegen der Grösse, wenn man nicht Zeiger verwendet?
Zitat von »"Nexus"«
Zitat von »"drakon"«
Also ich habe das so gemacht, dass ich sage, dass jedes Tile gleich gross ist auf einer Map.
Ja, das ist bei mir auch so.
Zitat
Dann, kannst du ganz einfach, wenn du z.B das Tile an Position 35.43:77.66 haben willst ganz einfach duch allfällige Multiplikation der Grösse direkt auf das Tile 35:78 kommen, wenn du dann noch abrundest. (und je nach Darstellung der Position musst du hald noch ein 50% dazurechnen bevor du abrundest, aber das kennst du ja wahrscheinlich schon).
Sorry, hier kann ich dir nicht ganz folgen. Wozu brauchst du Multiplikationen, um das auf das nächste Tile runden?
Damit wir uns nicht missverstehen: Ich hab es immer so gehandhabt, dass die Tiles rasterförmig angeordnet und quadratisch sind. Die einzelnen Tiles haben dann ganzzahlige Indizes, was meinst du mit 35.43:77.66? Oder wäre das nur ein Spezialfall (z.B. in der Kollisionsabfrage)? Und beim Zeichnen würde ich schauen, welche im Bild sind, und diese dann in zwei For-Schleifen durchgehen.
Zitat von »"drakon"«
Naja, wenn du sagen wir sagst, dass ein Tile 1x1 gross ist (nicht Pixel, sondern Relativ), und dann die ganze map auf 0.5 skalierst, dann müsstest du hald die Abstände auch noch skalieren.
Zitat
Ich dachte beim Rendern eher, dass linear geprüft wird, welche Tiles alle zu rendern sind. Also nichts mit Untermaps. Dazu schaut man, wo sich die Ränder des Fensters relativ zur linken oberen Ecke der gesamten Karte befinden. So kann man mit Ganzzahldivisionen herausfinden, welches das erste zu rendernde Tile ist (links oben im Bildschirm) und geht dann in zwei For-Schleifen alle Tiles von links oben nach rechts unten durch. Ist das irgendwie zu wenig performant? Der ganze Rendervorgang läuft ja (abgesehen von nicht zu rendernden Tiles) in konstanter Zeit.
Werbeanzeige