Objektorientierte Spieleprogrammierung in Flash

timäää

Erfahrenes Mitglied
Hi!

Ich hab mir Großes vorgenommen! Und zwar will ich in Flash einen Klassischen Sidescrolling-Weltraum-Shooter programmieren. Ich hab mir natürlich schon mal dieses Tutorial angeguckt, allerdings soll mein Spiel wesentlich komplexer werden (im Konzept sind schon 6 verschiedene Waffen alleine für das Raumschiff des Spielers vorgesehen). Nach 1 ½ Jahren erfahrung mit Flash sollte das wohl möglich sein ;-) .

Im Endeffekt soll es dann so aussehen, dass jedes Objekt (Raumschiff, Gegner, usw.) über eine eigene as 2.0 Klasse verfügt, in der alle Variablen und Funktionen des Objektes aufgeführt und verarbeitet werden.

Nun ja... Ich hab vor längerer Zeit schon mal versucht meine Idee zu verwirklichen. Leider reichten 1 ½ Jahre Flash nicht aus.
Die meisten Probleme hatte ich bei der Verwaltung der Objekte. Da ja sehr viele Objekte dynamisch erzeugt, angesprochen und wieder gelöscht werden müssen (Gegner entsteht am rechten Rand des Bildschirms, wandert nach links und muss wieder gelöscht werden wenn er am linken Rand ist bzw. zerstört werden). Variablen und Objekte dynamisch zu erstellen und anzusprechen ist ja kein Problem, allerdings hab ich kein vernünftiges Konzept wie man diese ganzen Variablen verwalten soll...
Wär super wenn ihr mir da den richtigen Denkanstoß geben könntet...
 
Hallo,

du sprichst hier natürlich einen wichtigen Punkt an. Wie du selbst festgestellt hast, ist Übersicht über vorhandene Elemente bei einem Projekt, wie du es dir vorgenommen hast, evident wichtig.
Was ich dir empfehle:
Erst (aus)denken, dann coden!
Du solltest deine Objekte in möglichst genau kategorisieren. Als Beispiel:
Es gibt folgende Kategorien:
- Gegner
- Hintergrund-Elemente
- Effekt-Animationen (Explosionen, Sternenfunkeln, was weiss ich)
- Geschosse (Raketen, Laser-Strahlen etc.)
- Spieler

Nun erstellst du 5 Objekte, Arrays, einfach Datencontainer und jedesmal, wenn du ein Objekt instanzierst, speicherst du eine Referenz auf das Objekt im jeweiligen Kategorien-Container bzw. löschst die gespeicherte Referenz wieder. So kannst du bequem auf alle vorhandenen Objekte einer Kategorie zugreifen.

Wenn du z.B. als Spezialwaffe eine Streubombe hast, diese Streubombe aber den Gegnertyp "Zecke" nicht betrifft, alle andern aber explodieren sollen, kannst du wie eine Art Query auf den Gegner-Container anwenden, die überprüft, ob ein Element des Containers eine "Zecke" ist.

Ich hab mal eine ziemlich praktische Klasse für die Objekt-Verwaltung geschrieben, die genau etwa deinen Ansprüchen entsprechen sollte ;). Ich geh dann mal wühlen...

Das mal so als Denkanstoss.

gruss
 
Zuletzt bearbeitet:
Hi,

wie wäre es mit einer Klasse "SceneManager", die alle sichtbaren Objekte überwacht (bekommt Referenzen, die z.B. in Arrays abgelegt werden können), sich um Kollisionen und Sichtbarkeit der Objekte kümmert? So kann ein Objekt, das sich vorübergehend aus dem sichtbaren Bereich entfernt eine Benachrichtigung vom Manager erhalten, um in der Zwischenzeit z.B. die eigene Bewegung oder Kollisionsprüfung zu unterbrechen.

Gruß

EDIT: Argh! ^^
.
 
Tobias Menzel hat gesagt.:
Hi,

wie wäre es mit einer Klasse "SceneManager", die alle sichtbaren Objekte überwacht
Ja... sowas in der art hatte ich mir auch schon überlegt, allerdings hab ich da auch noch einige Probleme mit. Zum Beispiel hat ja (fast) jedes sichtbare Objekt auch noch eine dazugehörende as 2.0 Klasse, welche ja nun auch noch verwaltet werden will...

Tobias Menzel hat gesagt.:
So kann ein Objekt, das sich vorübergehend aus dem sichtbaren Bereich entfernt eine Benachrichtigung vom Manager erhalten, um in der Zwischenzeit z.B. die eigene Bewegung oder Kollisionsprüfung zu unterbrechen.
Mh. Also meiner Vorstellung nach müsste die Manager-Klasse nicht nur die Kollisionsprüfung und bewegung Unterbrechen, sondern das komplette Objekt sammt Grafik löschen.. Das Objekt kommt ja nicht wieder zurück, also wär es ja resourcen schonender das Objekt einfach kopmlett zu entfernen.
 
Hi,

Zum Beispiel hat ja (fast) jedes sichtbare Objekt auch noch eine dazugehörende as 2.0 Klasse, welche ja nun auch noch verwaltet werden will...
Ich verwende in so einem Fall MovieClips mit eigener Klasse (Verknüpfung -> AS2.0-Klasse), so dass ich bei einer Referenz auf den MC selbst, auch Zugriff auf alle öffentlichen Member der Klasse habe (die Klasse sollte von MovieClip abgeleitet sein).

Das Objekt kommt ja nicht wieder zurück, also wär es ja resourcen schonender das Objekt einfach kopmlett zu entfernen.
Ok, ich bin davon ausgegangen, dass es zurückkommt (z.B. nur mal kurz aus dem sichtbaren Bereich fliegt). In Deinem Fall könnte es natürlich gelöscht werden.

Gruß
.
 
> Nun erstellst du 5 Objekte, Arrays, einfach Datencontainer und jedesmal, wenn du ein
> Objekt instanzierst, speicherst du eine Referenz auf das Objekt im jeweiligen
> Kategorien-Container bzw. löschst die gespeicherte Referenz wieder. So kannst du
> bequem auf alle vorhandenen Objekte einer Kategorie zugreifen.

Warum statische Arrays? Damit sind Dir gerade bei der Spieleprogrammierung die Hände gebunden und Du verschwendest auch noch Ressourcen.

Für ein solches Spiel eignet sich wunderbar eine dynmaische Ringstruktur, in der jedes Objekt immer genau eine Aktion durchführen kann und dann das nächste Objekt an die Reihe kommt.
Durch dieses Kontrukt hast Du nahezu unbegrenzte Möglichkeiten was Objektanzahl angeht, Du mußt Dir keine Gedanken um den Typen des Objektes machen und Du hast jederzeit die Möglichkeit neue Objekte nachträglich hinzuzufügen...
 
Hallo,

Für ein solches Spiel eignet sich wunderbar eine dynmaische Ringstruktur
Das musst du nun aber ein wenig genauer erklären. Wie wird dann ein solcher "Ring" durchlaufen? Wie werden Objekte für diesen Ring registriert?

Warum statische Arrays?

Was ist denn an diesen Arrays statisch, wenn sie laufend den gegebenen Umständen angepasst werden? Was ist an Arrays an und für sich performance-intensiv?

gruss
 
Zuletzt bearbeitet:
Ok. Das mit der Ringstruktur würd mich jetz auch mal interessieren...

Und mit den Arrays hast du meiner Meinung nach auch recht, da ja auch referenzen hinzukommen und wieder gelöscht werden. Und wenn in einem Array z.B. das dritte Element gelöscht wär würde ja Array[3] auf "undefined" verweisen...
Aber da hab ich schon ne Lösung für. Ich werde eine sogenannte "Lineare Liste" verwenden, die genau dieses Problem umgeht.
 
Nuja... das ginge schon, aber Navy hat schon recht mit der Resourcenverschwendung. Bei Array.splice() müssen ja alle nachfolgend verschoben werden. Das wird sich zwar erst ab ein paar hundert Elementen bemerkbar machen, allerdings gehts hier ja ums Prinzip ;)
 

Neue Beiträge

Zurück