Du bist nicht angemeldet.

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

1

03.07.2011, 19:49

ImageManager als Singleton sinnvoll?..

Hallooo :),

zurzeit arbeit an einem Asteroids-Klon mit der SFML, damit ich mich in das Framework einprogrammiere..

Nun steh ich vor nehm Problem, ich will die Schüsse implementieren, jedoch scheitert es an der Entscheidung,
ob ich den Image Manager vielleicht nicht als Singleton "reinhaue"...
Ansonsten müsste ich für neue Schüsse immer wieder den Image Manager übergeben, da nur mein Schifflein von der Klasse CShot weiß, müsste ich den Image Manager über die Klasse CSpaceship übergeben, find eich ehrlich gesagt nicht ganz so toll..

Ansonsten hätte ich die Idee einen static zeiger auf den Manager in der Klasse CShot anzulegen.. Was sollte ich machen?.. bzw hat wer ganz andere Ideen dazu?...

Danke schon mal im vor raus :).

Viele Grüße,
Tschu.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

03.07.2011, 20:12

Riecht nach schlechtem Design.

Nein zu Singleton.
Ja zu Refactoring.

Ich sehe nicht so ganz wieso eine der Modell-Klassen die Verwaltung (Image-Manager) kennen sollte.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

03.07.2011, 20:53

Vergiss den Singleton Pattern. Du wirst sicher noch sehr viele Singletons sehen aber sei dir sicher dass jeder Einzelne davon ein Designfehler ist. Alle Welt verwendet Singleton. Und alle Welt verwendet ihn falsch. Singleton wird ständig eingesetzt als "Ersatz" für eine globale Variable. Denn das ist angenehm, dann braucht man sich nämlich keine richtigen Gedanken ums Design machen. Frag dich mal selbst: Wenn ich meine globale Variable in buntes Geschenkpapier einwickel, wird dadurch irgendwas besser? Ich denk die Antwort sollte ziemlich offensichtlich sein. Singleton ist kein Ersatz für eine globale Variable und war auch nie dafür gedacht. Das Problem ist dass all diese Leute die heute "Singleton" verwenden den Pattern nicht verstanden haben. Anfänger lassen sich leicht dazu verführen zu denken dass so ein "Singleton" eine gute Idee ist weil es für manch ungeschultes Auge auf den ersten Blick vielleicht einfach und elegant wirken mag. Ist es nicht. Es gibt extrem wenige wirkliche Anwendungsfälle für ein Singleton und selbst dann gibt es in jedem dieser Fälle meiner Erfahrung nach immer mindestens eine bessere Alternative.

Ich seh in deiner Beschreibung ein ganz anderes Problem:
Ansonsten müsste ich für neue Schüsse immer wieder den Image Manager übergeben [...]

[...] da nur mein Schifflein von der Klasse CShot weiß [...]

Sollte das Konzept von einem Projektil nicht eigentlich von fundamentaler Bedeutung für die ganze Spielmechanik sein? Wieso weiß nur eine einzelne Klasse davon? Beschreib mal ein wenig was genau du so vor hast. Ich bin mir sicher wir können dir helfen eine gute Lösung zu finden ;)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (03.07.2011, 21:00)


4

03.07.2011, 21:19

Refactoring? :)..

Ich denke mein Problem ist eher, das ich wegen zu wenig Erfahrung nicht weiß, wie ich die Klassen gestalten soll,
damit sie auch gut zusammen arbeiten bzw sich auch gut erweitern lassen..

Ich leg meinen bisherigen Code mal in den Anhang..

Ich weiß definitiv das ich ein schlechtes Design habe..
Ich weiß aber leidern nicht, wie ich es verbessern kann bzw wie ich denken sollte?
Ob ihr mir dabei helfen könnt? ^^

EDIT:
Erstmal wollte ich nur drauf los programmieren und gucken wie die Bibliothek so funktioniert.
Mir ist dann halt schnell schlecht geworden, da ich bemerkt habe das es immer unsauberer wird..

Jedenfalls wollte ich nen Flieger haben das sich rotiert und überall hinschießen kann, natürlich kommen noch Meteore hinzu.
Später halt noch ein paar Waffen hinzufügen und ne Lebensanzeige oder ähnliches..

Ich hab dann beim Schuss aufgehört und dachte das wird jetzt total umständlich und unsauber..
Ich hab mir schon gedacht das Singletons usw nicht das wahre sind, deswegen hab ich ja auch gefragt nach anderen Ideen^^..

Ich mag auch keine Globalen Variablen ..^^

Gruß,
Tschu.
»Tschu« hat folgende Datei angehängt:
  • Asteroids.rar (4,92 kB - 58 mal heruntergeladen - zuletzt: 01.05.2024, 02:31)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

03.07.2011, 21:49

Refactoring? :)..

Darunter versteht man einfach nur das Umstrukturieren von Code.

Erstmal wollte ich nur drauf los programmieren und gucken wie die Bibliothek so funktioniert.
Mir ist dann halt schnell schlecht geworden, da ich bemerkt habe das es immer unsauberer wird..

Es gibt keinen besseren Weg um Erfahrung zu sammeln ;)

Ich hab mir den Code mal ganz flüchtig angeschaut. Prinzipiell schaut das imo eigentlich ziemlich gut aus.

Du könntest eine eigene Klasse Weapon einführen die die Schüsse erzeugt und deinen ImageManager kennt, das Schiff bekommt dann einfach im Konstruktor seine Weapon übergeben und benutzt die um zu schießen. Die Weapon könnte sich auch darum kümmern die Schüsse zu verwalten.
Ich denk CShot braucht nicht wirklich ein set_Rotation(). Die Richtung in die der Schuss gefeuert wird kann, denk ich, eigentlich schon im Konstruktor festgelegt werden und muss sich dann nichtmehr ändern.
Überleg dir für die Bezeichner deiner Include-Guards andere Namen. Auch wenn es in der Praxis kein Problem ist, Namen die mit einem _ gefolgt von einem Großbuchstaben sowie Namen die mit __ beginnen sind für den Compiler reserviert. Ich verwend z.B. sowas wie CENGINE_INCLUDED. Für Visual C++ wäre es ideal #pragma once zu verwenden. Damit merkt sich der Compiler dass er den Header schonmal geparsed hat und wird ihn im Fall eines Mehrfach-Include garkein zweites Mal öffnen.
Nur für den Fall dass du es machst weil du denkst dass man das so macht: Es gibt keine besondere Regel dass Klassennamen mit einem C beginnen müssen. Die Konvention war afaik ursprünglich als Präfix für die Klassen der MFC gedacht und stammt aus Zeiten wo es namespace noch nicht gab. Dass es so viele verwenden ist damit also eigentlich genau das Gegenteil wofür es gedacht war. Aber wenns dir gefällt darfst dus natürlich weiterhin verwenden, ist am Ende natürlich reine Geschmackssache ;9

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (03.07.2011, 21:56)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

03.07.2011, 21:53

Also meiner Meinung nach sollte weder die Waffe, noch der Schuss den ImageManager kennen. Oder wenn, dann nur als Parameter im Konstruktor, aber nicht als Attribut der Klasse.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

03.07.2011, 21:58

Prinzipiell geb ich dir recht, aber ich denk dann wird der Weg für unseren Anfänger ein wenig steil, denn dann bewegen wir uns wohl in Richtung Factory Method und Vererbung wird auch ins Spiel kommen. Ich denk für die ersten Schritte ist das schon ganz gut so wie ers macht, man muss es nicht gleich übertreiben ;)

Natürlich könnte man auch einfach der Engine eine Methode geben die einen neuen CShot erzeugt da die den ImageManager sowieso kennt, das wär vermutlich noch eine bessere Lösung als den ImageManager in der Weapon Klasse zu halten.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (03.07.2011, 22:06)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

03.07.2011, 22:09

Stimme dir bei beidem zu.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

9

03.07.2011, 22:23

Danke für die Tipps,

ich werde meinen Code noch einmal genauer unter die Lupe nehmen...

Ich wollt später sowieso noch ne Klasse machen für nen Objekt,
denn sowohl der Flieger als auch der Meteor später werden ähnliche Funktionen haben.
Vielleicht sogar Abstrakt?.. Vielleicht sollte ich sie sofort implementieren beim umstrukturieren.

Dieses C vor jeder Klasse, mache ich eigentlich nur damit ich weiß das es ne Klasse ist und nicht irgendein Enum etc..
Ist für mich besser zu lesen :)

Also wie ich es verstanden habe, sollte ich lieber die Engine die Erzeugung und die Verwaltung der Schüsse übernehmen und der Flieger hat eine Methode,
welche die Erzeugung eines solchen Schusses übernimmt?

Eine Frage die ich mich noch stelle, ich hab in meinem Code, die Tastaturabfrage für den Flieger in die Methoden der Flieger implementiert,
sollte ich diese Abfragen nicht lieber auch in die Engine integrieren, da so wie ich es sehe die Eigentlich nicht mit dem eigentlichen Flieger nichts
gemeinsam haben sondern nur nen Auslöser ist für die eigentliche Aktion, wie so ein Pilot in einem Helikopter!? :)

Grüße,
Tschu.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

03.07.2011, 22:30

Ich wollt später sowieso noch ne Klasse machen für nen Objekt,
denn sowohl der Flieger als auch der Meteor später werden ähnliche Funktionen haben.
Vielleicht sogar Abstrakt?.. Vielleicht sollte ich sie sofort implementieren beim umstrukturieren.

[...]

Also wie ich es verstanden habe, sollte ich lieber die Engine die Erzeugung und die Verwaltung der Schüsse übernehmen und der Flieger hat eine Methode,
welche die Erzeugung eines solchen Schusses übernimmt?

Klingt gut, vor allem wenn du alle Spielobjekte gleich behandeln willst wird es sinnvoll sein dass die Engine sich um die Erzeugung derselben kümmert, dann kann sie die auch gleich verwalten.

Eine Frage die ich mich noch stelle, ich hab in meinem Code, die Tastaturabfrage für den Flieger in die Methoden der Flieger implementiert,
sollte ich diese Abfragen nicht lieber auch in die Engine integrieren, da so wie ich es sehe die Eigentlich nicht mit dem eigentlichen Flieger nichts
gemeinsam haben sondern nur nen Auslöser ist für die eigentliche Aktion, wie so ein Pilot in einem Helikopter!? :)

Ja, das klingt sehr vernünftig.

Werbeanzeige