Konzeptfrage, Kommunikation zwischen Objekten.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DiHydrogenOxide
User
Beiträge: 5
Registriert: Dienstag 4. November 2014, 20:56
Kontaktdaten:

Hallo Zusammen,

mein Problem dreht sich nicht direkt darum, dass ich in der Programmierung nicht weiter komme, sondern darum wie ich eine bestimmte Angelegenheit am besten löse.
Ich bin dabei ein Spiel mit pygame zu programmieren, einen Klon von SpaceInvaders.
Nun stehe ich vor folgendem Problem:
Ich habe eine Klasse Spaceship und eine Klasse Invader. Beide sind in der Lage, Geschosse abzufeuern. DIe Geschosse werden durch eine Klasse verwaltet, welche von List erbt.

Code: Alles auswählen

class Spaceship(object):
    """[...]"""
    def __init__(self):
        DoSomeThing()

    def shoot(self, missile_list):
        """[...]"""
        DoSomeThing()
        missile_list.shoot(shot_position, 'up')

    def handle(self, missile_list):
        """[...]"""
        self.shoot(missile_list)
        DoSomeThing()

class Invader(object):
    """[...]"""
    def __init__(self):
        DoSomeThing()

    def shoot(self, missile_list):
        """[...]"""
        DoSomeThing()
        missile_list.shoot(position, 'up')

    def handle(self, missile_list):
        """[...]"""
        self.shoot(missile_list)
        DoSomeThing()

class MissileLise(list):
    """[...]"""
    def __init__(self):
        DoSomeThing()

    def shoot(self, position, direction):
        """[...]"""
        DoSomeThing()

    def handle(self):
        """[...]"""
        DoSomeThing()
Aufgrund dessen, dass ich im Forum öfters gelesen habe, dass globale Variablen schlecht sind, bin ich dazu übergegangen, eine Instanz der Klasse MissileList, welche alle Geschosse verwaltet zu übergeben.
Meine Frage lautet nun:
Ist dies die Ideallösung?, weil alle Gruppen in meinem Spiel von Listen verwaltet werden(Explosionen, Geschosse und Invader). Ich habe die Methode noch nicht bis zum Ende durchgezogen, aber bereits jetzt erscheint es mir ineffizient die Instanzen den Methoden zu übergeben, da diese auch teilweise über mehrere Funktionen weitergegeben werden müssen. (Im Spiel werden bei mir alle Objekte mit <Objekt>.handle() aufgerufen)

Dankend für alle Beiträge: DiHydrogenOxide
BlackJack

@DiHydrogenOxide: Ich sehe da irgendwie die eigentliche Frage nicht. Das ist alles etwas zu vage um etwas dazu sagen zu können. Wobei es komisch aussieht das alle die selbe API haben.

Von einer Liste würde ich nicht erben solange man nicht a) tatsächlich viel vom Verhalten einer Liste benötigt, und b) solange *alle anderen* Listenmethoden nicht unnütz sind.

PyGame hat Klassen für Sprites und welche um Sprites zu Gruppen zusammen zu fassen. Erfinde das nach Möglichkeit nicht noch einmal selbst.

Ich würde den Raumschiff-Exemplaren ein Spielobjekt übergeben an das es dann die Schüsse abgeben kann. Wie das dann die Schüsse verwaltet braucht das Raumschiff nicht weiter zu interessieren. Das würde ich einfach ein Missile-Objekt erzeugen lassen welches seine eigene Position und Richtung kennt und es dann dem Spiel zur weiteren Verwaltung übergeben.
DiHydrogenOxide
User
Beiträge: 5
Registriert: Dienstag 4. November 2014, 20:56
Kontaktdaten:

Also ersteinmal habe ich ihn meinem Codebeispiel sehr viel weggelassen.
BlackJack hat geschrieben: Ich würde den Raumschiff-Exemplaren ein Spielobjekt übergeben an das es dann die Schüsse abgeben kann. Wie das dann die Schüsse verwaltet braucht das Raumschiff nicht weiter zu interessieren. Das würde ich einfach ein Missile-Objekt erzeugen lassen welches seine eigene Position und Richtung kennt und es dann dem Spiel zur weiteren Verwaltung übergeben.
Das klingt interessant, aber die Verwaltung soll erstmal weiter über die Liste laufen, wie kommt das Spielobjekt jetzt an die Liste heran??
Die einzige (saubere) Möglichkeit die mir einfiele wäre, dem Spielobjekt bei Aufruf eine Instanz der Liste zu übergeben.
BlackJack

@DiHydrogenOxide: Entweder das oder das Spielobjekt erzeugt die ”Liste”. Warum genau muss das eine Liste sein? Benutzt Du denn irgend etwas davon ausser dass man darüber iterieren kann?
DiHydrogenOxide
User
Beiträge: 5
Registriert: Dienstag 4. November 2014, 20:56
Kontaktdaten:

@BackJack, ich benutze noch die append() Methode, aber nach dem ich mich jetzt in die Dokumentation von pygame.sprite eingelesen habe, werde ich doch die Liste durch pygame.sprite.Group ersetzen.
Nachdem das mit der weitergabe der Group-Instanz geklärt wäre, hätte ich noch eine Frage:
Konstanten, welche das gesamte Spiel betreffen sollten dann auch nicht global sein, sondern über die Funktionsaufrufe weitergegeben werden?, bsp.: eine Konstante names sound, welche bestimmt ob Ton abgespielt werden soll oder nicht sollte auch nicht globalisiert, sondern als Argument einer Funktion weitergegeben werden??
BlackJack

Konstanten können global sein, aber ob Ton abgespielt wird oder nicht erscheint mir nicht wirklich als Konstante. Das ist eher ein Konfigurationswert. Und würde IMHO gut zum Zustand des Objekts passen über das Töne abgespielt werden können. Dann braucht man dieses Flag nicht überall herumreichen und testen, sondern nur in der Methode die letztendlich das Abspielen erledigt, oder eben auch nicht, basierend auf dem Flag.
DiHydrogenOxide
User
Beiträge: 5
Registriert: Dienstag 4. November 2014, 20:56
Kontaktdaten:

Ok, ersteinmal vielen Dank für alle Hilfe, ich werde das genannte jetzt ersteinmal umsetzen und mich später nochmal melden.
Antworten