Klassenstruktur



  • Guten Morgen Community,

    ich habe ein Problem(?) mit meiner Klassenstruktur, bzw. ein Designfehler.
    Hier erstmal ein Bild.

    Vierecke stellen Interfaces dar (ich benutze C# XNA 4.0), Kreise eine Klasse. Die Pfeile zeigen an, wer von wem erbt (im Beispiel Enemy erbt von Sprite).

    Nun zu meinem Problem.
    Meine Tower Klasse hat Zugriff auf alle Gegner, die sich momentan auf meinem Spielfeld befinden, um zu wissen, ob ein Gegner in Reichweite ist und ihm gegebenenfalls Schaden zu zu fügen. Wenn jetzt ein Gegner in Reichweite ist, schießt der Tower eine Kugel. Dabei wird ein neues Objekt von Projectile erstellt. Bei dem Erstellen kriegt der Projectile Konstruktor ein Objekt von dem Gegner. Dabei handelt es sich aber um ein Sprite Objekt.

    public Projectile(Texture2D texture, Vector2 position, Sprite target, float speed)
    

    Wenn das Projectile sein Ziel erreicht hat, wird eine bool Variable auf true gesetzt.
    Diese Variable prüfe ich in der Tower Klasse. Wenn sie true ist, soll das Target der Projectile Klasse Schaden bekommen. Dabei greife ich über die Projectile Klasse auf das Target zu.
    Mein Problem ist aber, dass ein Sprite eigentlich kein Schaden bekommen soll. Das wäre ja auch unlogisch. Deswegen hab ich eigentlich ein Interface erstellt, welches IDamageable heißt. Das hilft mir aber nicht weiter, da ich dann in der Projectile Klasse aus dem Sprite ein Enemy machen muss. Wenn ich aber später z.B. noch angreifbare Kisten auf dem Spielfeld haben will, ist die Projectile Klasse unbrauchbar.

    Daher habe ich jetzt 2 Ideen.
    Entweder, ich habe in meiner Tower Klasse ein Dictionary, welches Projectile und Target zusammen mapt,
    oder ich erstelle eine weitere Klasse, die zwischen Sprite und Enemy ist. Quasi ein Sprite, welches aber z.B. bewegbar ist und Schaden nehmen kann, welches IDamageable implementiert und davon erbt die Enemy Klasse.

    Über Hilfe wäre ich erfreut.
    Mit freundlichen Grüßen,
    Freaky



  • Warum gibst du überhaupt ein Sprite als Target, wenn der Tower sowieso nur Enemys angreifen kann?
    Mache doch einfach direkt Enemey als Parameter und fertig.



  • Deswegen:

    FreakY<3Cpp schrieb:

    Das hilft mir aber nicht weiter, da ich dann in der Projectile Klasse aus dem Sprite ein Enemy machen muss. Wenn ich aber später z.B. noch angreifbare Kisten auf dem Spielfeld haben will, ist die Projectile Klasse unbrauchbar.

    Eine Kiste ist nämlich kein Enemy.


  • Mod

    wenn enemy von sprite erbt, koennte genau so sprite von enemy erben, aber logisch ist beides nicht. das ist als ob tuer von hund erben wuerde, nur weil beides braun ist.
    entsprechend, wie Nathan sagte, greifen tower doch keine sprites an.

    das klingt ein wenig als ob du zulange ueber die hierarchy nachgedacht hast und deswegen nicht siehst, dass eigentlich keine besteht.

    das sprite bzw ein pointer darauf sollte member von enemy sein.

    ich schlage dir eine basisklasse "unit" vor. da kannst du "tower" "enemy" "projectile" und "neutral" vererben, die kiste erbt dann von "neutral" und....
    "unit" hat dann, weil alle einheiten sicherlich sichbar sein sollen, den pointer auf das sprite.



  • Das klingt vernünftig. Danke.


Anmelden zum Antworten