Frage zum Codedesign

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Pokoyo

Betreff: Frage zum Codedesign

BeitragSa, Okt 21, 2017 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Schönen Abend Allerseits,
ich hätte da mal eine Fräge. Bin ja noch ziemlicher BMax Neuling und noch nicht so fit mit all den Möglichkeiten.
Programmiere nun schon seit einigen Wochen an einem Sidescroller in dem man einen Heli steuert.
Nun bin ich an dem Punkt angelangt wo man doch bequem mal ein Level erstellen können müsste. Bisher sind die Gegner immer zufällig gespawnt.
Da in meinem Programm Alles zerstörbar ist (auch Vegetation, Gebäude, Straßen etc.), gibt es natürlich Unmengen von Objekten in so einem Level.
Unmengen von Objekten bedeutet natürlich auch Unmengen von Kollisionsabfragen und Objekt-Updates.
Ich habe mich dann dafür entschieden meine Levels in Landschaftsabschnitte (a 512px in der Breite) zu unterteilen und dann nur die Objekte in den Sichtbaren +-1 Abschnitten zu berechnen, soweit so gut.
Nun sind die Landschaftstiles selbst Objekte welche über eine TList verfügen in der die aktuell auf ihm befindlichen Objekte gespeichert sind.
Das heißt, eine Liste für ganz unterschiedliche Objekte als da wären :
Gegner-Fahrzeuge, Flugobjekte, Vegetation, Gebäude, Straßen, Schüsse bzw. Raketen. Aber auch Objekte des Spielers. Der Player selbst, Bomben, Raketen, Projektile.
Das System ist nun so aufgebaut Dass es einen Basistypen(entity) gibt von dem Alle erben. In diesem Basistypen ist die Pseudomethode .update enthalten die in den abgeleiteten types jeweils überladen wird.
Das Globale Update sieht also wie folgt aus :

BlitzMax: [AUSKLAPPEN]

For Local i:Int = Cluster_Von To Cluster_Bis
TLandschaft(LandschaftLink[i].value()).ClusterUpdate()
Next

Die Updateroutine der einzelnen LandschaftsTiles sieht so aus:

For Local t:TEntity = EachIn Self.Clusterliste
t.ObjektUpdate()
Next



Da seht Ihr nun dass alle Objekte in nur einer Liste gehalten werden, nämlich in der vom Basistypen TEntity.
Nun kommen die Fragen:
Nun werden alle Objekte der Reihenfolge nach, wie sie in der Liste stehen, geupdatet. Das ist aber schlecht weil eine Zeichenreihenfolge eingehalten werden muss. Sonst überlappen die Grafiken sich unterschiedlich. Mal vor einem objekt gezeichnet, mal dahinter.

Jetzt war mein Gedanke in den Landschaftsabschnitten für jeden typen eine eigene schleife zu durchlaufen. Das hätte dann aber zufolge das Eachin jedes Mal die ganze Liste durchgeht um sich die paar Objekte des types da rauszusuchen, was bei mehreren 100 Objekten denk ich mal doch ziemlich viel Zeit beanspruchen würde.
Wie würdet Ihr das lösen ?
Oder ist mein Ansatz gänzlich falsch ?
Bin für jeden Tipp dankbar Very Happy

Gruß Poko
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax|

Xeres

Moderator

BeitragSa, Okt 21, 2017 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du Zeit, eine kleine visuelle Hilfe zu machen?
Ein Screenshot mit farbigen boxen um die Objekte, die in einer Liste sind, z.B.

Von dem was ich verstehe glaube ich, du machst dass schon ziemlich richtig so. Mein Hinweis wäre nur: Das gleiche Objekt kann sich durchaus in mehreren Listen befinden. Das erhöht vielleicht die Komplexität, aber bringt dir mehr Geschwindigkeit. Wenn du Logik und Anzeige trennst, iterierst du vielleicht über manche Objekte doppelt, kannst aber insgesamt an langsamen Operationen sparen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Mathias-Kwiatkowski

BeitragSa, Okt 21, 2017 22:24
Antworten mit Zitat
Benutzer-Profile anzeigen
genau das mache ich auch, das eine jeweilige objekt kannst du in verschiedenen listen unterbringen somit hat Xeres vollkommen recht. und dann kannst du anstelle deiner "kompletten" liste immer stück für stück die kleineren listen durchblättern, stellst du nun ein pbjekt auf null so sollte es meines wissen in allen listen null sein, also jede veränderung ist gleich, wenn du das anders möchtest müsstest du das objekt "klonen".
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Pokoyo

BeitragSa, Okt 21, 2017 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
hmmm. Mehrere Listen zu verwenden klingt sehr gut. Man könnte ja innerhalb der Lanschaftstiles(Cluster) für jeden Objekttypen eine eigene Liste erstellen. Die könnte man dann Alle nacheinander durchgehen und somit Einfluss auf die Zeichenreihenfolge nehmen.
Danke für den Tipp Very Happy

Ich habe das ganze mal schnell auf den Server geschaufelt : Heli-Game

Kurze Erklärung:

InGame :

WASD steuerung Heli wobei gezoomt wird wenn man nach oben fliegt.
Maustaste 3 Gegner anvisieren
Maustaste 2 Bombe werfen
Maustaste 1 Bordkanone
Wenn Ziel anvisiert Rakete feuern mit Space

EditorModus :
rechte Maustaste Objekt aus dem Pool auswählen
linke Maustaste Objekt setzen
mittlere Maustaste Objekt auswählen
entf Taste Objekt entfernen

WASD Durchs Level fahren bzw. Zoomen.

Oben Links sind n paar Buttons wo man die Modi umschalten kann.

Das Ganze ist natürlich noch Baustelle Extrem Confused
Benutzung auf Eigene Gefahr...

Vielen dank für Eure Denkanstöße.

@Matthias, bist du sicher dass ein Objekt automatisch aus Allen Listen gelöscht wird wenn man es NULLt ?
Ich dachte der GarbageClollector entfernt es erst wirklich aus dem Speicher wenn sämtliche Verweise sprich Links auf das Objekt entfernt wurden ?

Gruß Poko
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax|

Xeres

Moderator

BeitragSa, Okt 21, 2017 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ich dachte der GarbageClollector entfernt es erst wirklich aus dem Speicher wenn sämtliche Verweise sprich Links auf das Objekt entfernt wurden ?
Genau so ist es... Eine Referenz mit Null zu überschreiben tut nichts mit den übrigen Referenzen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group