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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

08.08.2017, 19:13

Ich kenne kaum ein großes Projekt
Und wir reden hier von einem großen Projekt?
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]

Wirago

Alter Hase

  • »Wirago« ist der Autor dieses Themas

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

12

08.08.2017, 19:21

Ich kenne kaum ein großes Projekt
Und wir reden hier von einem großen Projekt?


Ein AAA Titel ist es nicht, aber es arbeiten immerhin 4 Leute daran.

13

08.08.2017, 19:22

Wie TGGC es vorgeschlagen hat, finde ich es am Besten. Ein Objekt registriert sich für die Keydown/up-Aktion mit einem Handler, der dann aufgerufen wird. In C++ mache ich das oft mit std::function, wie das in C# aussieht, weiß ich nicht. Kann man dann auch praktisch mit Lambdaobjekten füttern. Ist mir eindeutig lieber als ständig irgendwelche Commandklassen definieren zu müssen, das ist hier einfach unhandlich und entspricht auch nicht der Idee dieses Patterns.

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

14

08.08.2017, 19:26

Und wir reden hier von einem großen Projekt?

Dein Beitrag ist aus dem Kontext gerissen, in dem ich diese Aussage getroffen habe. Ob es sinnvoll und wie es einzusetzen ist, bleibt schlussendlich Wirago überlassen. Es bleibt eine Empfehlung basierend auf Erfahrungswerten, genau so wie die anderen Empfehlungen auch. Der Bezug zur Aussage, dass das Command Pattern in einem echten Projekt um die Ohren fliegt ist trotz dessen nicht haltbar, denn "echte" Projekte beweisen in einer Vielzahl das komplette Gegenteil.
Liebe Grüße,
René

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Renegade« (08.08.2017, 19:35)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

08.08.2017, 19:36

Dein Beitrag ist aus dem Kontext gerissen, in dem ich diese Aussage getroffen habe.
Ganz und gar nicht. Ich habe deine Aussage zurück in den Kontext dieses Topics hier gebracht. Denn nur in diesem Kontext sind Argumente sinnvoll. Rein theoretische Betrachtungen sind ziemlich irrelevant.

Der Bezug zur Aussage, dass das Command Pattern in einem echten Projekt um die Ohren fliegt
Hier zitierst du selbst fern ab des Kontextes. TGGC sagte, dass in dem verlinkten Beispiel eine Limitierung enthalten ist, die einem in einem "echten Projekt" um die Ohren fliegen würde. Und genau das war der Kernpunkt der Aussage. Nicht dass das Pattern an sich in keinem Projekt jemals funktioniert! Wichtiger Unterschied.
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]

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

16

08.08.2017, 20:45

eigentlich ist es hier eher ein Syntax- bzw. Designthema, da die gewünschte Funktionalität gegeben ist. Allerdings gefällt mir der Aufbau des Codes nicht, habe aber keine wirklich gute Idee wie das besser umzusetzen ist.

Das ist die Prämise für dieses Thema. Und damit der Kontext: Syntax und Design.
Das Command Pattern scheint mir totaler Schwachsinn für diese Aufgabe[, speziell so wie auf der Seite erklärt.] Die if Kaskade, die man aufwendig pflegen muss hat man so trotzdem noch. Plus zig Klassen mit Ableitungen rundrum. Und dann baut man sich auch noch eine Einschränkung ein, die einem in einem echten Projekt wahrscheinlich sofort um die Ohren fliegt.

Das ist TGGCs Aussage. Unabhängig vom Beispiel wird hier ganz klar das Pattern für sich als Schwachsinn für diese Aufgabe benannt. Es lässt sich natürlich streiten, ob das Command nun syntaktisch oder vom Aufbau schöner ist, aber deine Argumentation das ich mich außerhalb des Kontextes bewege verstehe ich nicht. Durch das Pattern muss keine if Kaskade aufwendig gepflegt werden und eine Vielzahl von Klassen für verschiedense Inputs sind sogar ein Vorteil des Patterns. Auch die Aufteilung in Klassen und die Möglichkeit diese abzuleiten. Man baut sich deshalb keine Einschränkungen ein, die einem bei "echten" Projekten um die Ohren fliegt. Ich denke nicht das sich die Aussage ausschließlich auf das Beispiel bezog. Zumindest lese ich eine Kritik ganz allgemein über das Pattern in Bezug auf das vorgestellte Problem. Wenn du da anderer Meinung bist, dann müssen wir uns darüber einigen das die Aussage unterschiedlich verstanden werden kann.
Liebe Grüße,
René

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

08.08.2017, 21:18

Den wichtigen Teil auszuklammern ist natürlich Käse. Das hast du ja selbst schon erkannt ;) Du bist schließlich clever genug. Also können wir jetzt aufhören über belanglosen Bullshit zu diskutieren?
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]

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

18

08.08.2017, 23:49

Ich kenne kaum ein großes Projekt welches den Input (jeglicher Art, ob Remote/Network/Proxy, KI etc. pp.) nicht in Commands kapselt. Es gehört zu einen der wichtigsten Patterns in der Spieleentwicklung und ist super flexibel.
Ok, wenn wir auf dem Level argumentieren: Ich habe 26 Jahre an hunderten Projekten verschiedenster Größenordnungen gearbeitet und nie das Command Pattern benutzt um Tasten oder Tastenkombinationen dynamisch Funktionen der Spiels zu zuordnen.

Aber die Argumentation, dass das Command in einem echten Projekt um die Ohren fliegt ist absolut nicht haltbar.
Na hier mal ein paar Beispiele, wo genau das passieren wird:

C-/C++-Quelltext

1
2
3
4
5
private:
  Command* buttonX_;
  Command* buttonY_;
  Command* buttonA_;
  Command* buttonB_;

Schoen, wenn ich weiss, das ich alles mitm SNes Controller bedienen werde. Aber was passiert, wenn ich die gesamte Tastatur auch frei belegbar hab? Und noch jeden Controller, der angeschlossen wird. Und wenn ich noch Tastenkombinationen hab? Dann lege ich eine Klassenvariable für jede von diesen Fällen an und fast alles sind Nullpointer weil aktuell die Taste nicht belegt ist oder der Controller wieder abgezogen wurde? Realistisch nur sehr begrenzt einsetzbar.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
Command* InputHandler::handleInput()
{
  if (isPressed(BUTTON_X)) return buttonX_;
  if (isPressed(BUTTON_Y)) return buttonY_;
  if (isPressed(BUTTON_A)) return buttonA_;
  if (isPressed(BUTTON_B)) return buttonB_;

  // Nothing pressed, so do nothing.
  return NULL;
}
Und wie erweitere ich diese Funktion sinnvoll? Ist auch ein Haufen Tipparbeit, sobald ich mehr als 10 Buttons unterstützen will. Abgesehen vom Problem, das es immer nur das erste Command zurückgeben kann, und die anderen gar nicht mehr durchgeht. Ok dann geb ich eben ein Array mit allen ausgelösten Commands zurück. Trotzdem dumm: ich hab keine Kontrolle über die Reihenfolge, die könnte aber wichtig sein. Ein umbelegen der Tasten für dann evtl. dazu Commands die Positionen tauschen. Und falls Sachen zusammenspielen, dann muss ich doch wieder in dem execute des Commands wieder was Zwischenspeichern und kann das nicht direkt ausführen. Beispiel ist das mit der Bewegung von vorhin, wenn in CommandMoveLeft execute aufgerufen wird, dann weiss ich nicht wie weit ich nach rechts gehen muss, weil wenn im Array davor und danach noch das CommandMoveUp steht, dann geh ich nur 0.7 * speed zur Seite. Und in Commands wie switchWeapon hab ich dann auch noch extra Arbeit um nicht staendig zu switchen, muss dafür also auch noch ein extra System basteln.

C-/C++-Quelltext

1
2
3
4
5
Command* command = inputHandler.handleInput();
if (command)
{
  command->execute(actor);
}
Und wenn du lokalen Multiplayer einbaust? Schon wieder ist das System am Arsch.

Quasi jede Zeile Code in diesem Artikel ist für realistische Anwendung Schrott. Und auch die, welche da noch fehlen. Irgendwo muessen die ganzen Commands erzeugt werden, per new oder sonstwie. Wieder ein Haufen Code zu pflegen, wenn du mal 200 Funktionen hast (hat man locker mal in einem dicken Projekt, weil man während der Entwicklung nämlich noch lauter Cheats ueber das gleiche System abfrühstücken möchte). Und wie realisiert man die simple Abfrage, auf welcher Taste gerade die Funktion x liegt? Da musst du alle deine Pointer durchgehen, und schauen wo die grad hinpointen und was das für ein Typ ist. Brauch man aber fürs Optionsmenu oder Hilfstexte. Und schön wärs ja auch, wenn dein Inputhandlern am Ende wieder aufräumt. Also muss da sowas rein wie delete buttonX_; delete buttonY_;... delete keyboardA_;... delete keyboardZ_;... delete keyboardShiftZ_. Na was ein Spass...

Man könnte die Bewegungsrichtungen auch zusammenfassen zu einem MoveCommand und daraus einen Richtungsvektor berechnen (Wie sonst soll das klappen? 360 Commands erstellen für jeden Grad des Kreises?).
Ja eben! Wie soll das klappen? 360 Commands ist offensichtlich Quatsch. Man kann einem Command aber auch nicht so einfach noch einen Parameter wie die Gradzahl geben. Das muss dann naemlich entweder in die Basisklasse und bei allen Commands gemacht werden und man erschafft ein Supercommand, das kann alles und nutzt meist nur 1% davon. Oder der Inputhandler versteht das nicht alle Commands von aussen gleich sind und schwupp hat man die nächste if Kaskade wo bei den ganzen Sonderfällen nochn extra Parameter reinmuss...

Jar

Treue Seele

Beiträge: 197

Wohnort: Lübeck

Beruf: Softwareentwickler

  • Private Nachricht senden

19

09.08.2017, 10:40

Zitat

Aber was passiert, wenn ich die gesamte Tastatur auch frei belegbar hab? Und noch jeden Controller, der angeschlossen wird.

TGGC kannst du das gleiche Verhalten einmal ohne das Command Pattern beschreiben, wie würdest du es machen?

Der Code für das Verhalten kann auch in einer Datei geschrieben werden, oder in mehreren Klassen. Die Frage ist, was ist wartbar und erweiterbar.
Der Code muss auf jeden Fall irgendwo existieren, in welcher Form auch immer.

Das schöne am Command Pattern ist, das man damit auf einfachste Art und Weise ein Spiel nachstellen und testen kann. Man sieht sofort welche Eingaben gemacht worden sind und kann ganze Spielpartien erneut ablaufen lassen. Damit kann man gemeldete Bugs ausfindig machen oder einfach eine Aufnahmefunktionalität schaffen so das sich Spieler ihr Spiel im nachhinein nochmal anschauen können. Gleichzeitig können einzelne Commands vom Server validiert werden.

Zitat

Ich habe 26 Jahre an hunderten Projekten verschiedenster Größenordnungen gearbeitet

Wie viele diese Projekte waren dabei Games? Und in welchen Sprachen wurden diese umgesetzt?
Ich frage, weil das Command Pattern erst mit der objektorientierten Programmierung groß wurde und es zumeist in Games eingesetzt wird.

Die nächste Frage ist, hast du das Pattern schon mal ausprobiert?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

20

09.08.2017, 13:29

Wie viele diese Projekte waren dabei Games? Und in welchen Sprachen wurden diese umgesetzt?
Angesichts seines Arbeitgebers vermutlich alle ;)
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]

Werbeanzeige