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
C#-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public string HandleKeyStroke(KeyboardState ks, KeyboardState oldks) { if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_0) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_0)) return UIManager.actionToBeTriggered("actionbar_0"); if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_1) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_1)) return UIManager.actionToBeTriggered("actionbar_1"); if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_2) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_2)) return UIManager.actionToBeTriggered("actionbar_2"); if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_3) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_3)) return UIManager.actionToBeTriggered("actionbar_3"); if (ks.IsKeyDown(GameplayButtons.CHARACTER) && oldks.IsKeyUp(GameplayButtons.CHARACTER)) UIManager.ToggleWindowById("button_Character"); if (ks.IsKeyDown(GameplayButtons.INVENTORY) && oldks.IsKeyUp(GameplayButtons.INVENTORY)) UIManager.ToggleWindowById("button_Inventory"); if (ks.IsKeyDown(GameplayButtons.QUESTLOG) && oldks.IsKeyUp(GameplayButtons.QUESTLOG)) UIManager.ToggleWindowById("button_Questlog"); if (ks.IsKeyDown(GameplayButtons.MAP) && oldks.IsKeyUp(GameplayButtons.MAP)) UIManager.ToggleWindowById("button_Map"); return ""; } |
C-/C++-Quelltext |
|
1 2 |
if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_0) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_0)) return UIManager.actionToBeTriggered("actionbar_0"); |
C-/C++-Quelltext |
|
1 2 |
if (IsKeyPressed(GameplayButtons.ACTIONBAR_0)) return UIManager.actionToBeTriggered("actionbar_0"); |
C-/C++-Quelltext |
|
1 2 3 |
vec moveXY((keyPressed(right)?1:0) - (keyPressed(left)?1:0), (keyPressed(up)?1:0) - (keyPressed(down)?1:0); moveXY.normalize(); pos += moveXY * maxspeed; |
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. Command* InputHandler::handleInput() kann genau ein Command zurueckgeben, was ist wenn ich schiessend nach links laufe und dann springen will. Dann baue ich ein Command das genau die 3 Sachen macht und dann auch noch eins für alle 2^n Kombinationen meiner n buttons?
Das Command kapselt einzelnes Verhalten und ermöglicht diese sequentiell zu verarbeiten. Ich zitiere: "Encapsulate a request as an object, thereby letting users parameterize clients with different requests, queue or log requests, and support undoable operations." Dafür benötigst du lediglich ein Command für jede Art des Inputs und nicht für jede Kombination. Sollten in einer Execute mehrere Inputs abgearbeitet werden, dann werden sie das eben in einer Queue.
Zitat
Sollten in einer Execute mehrere Inputs abgearbeitet werden, dann werden sie das eben in einer Queue.
Naja aber das ist doch genau der Punkt. Du hast jeweils ein Command um dich nach rechts, links, oben und unten zu bewegen. Wenn dein "inputHandler" nur ein einzelnes Command zurück gibt dann musst du eben auch Commands für die diagonalen Bewegungsrichtungen schaffen. Abhilfe kann man sich natürlich schaffen indem so ein Input Handler mehrere Commands zurück geben kann. Dann könnten die Abfragen die jeweiligen Commands generieren und würden diese zurück geben. Danach könnten sie in die Queue gestopft werden um am Ende irgendwo verarbeitet zu werden. Darauf möchtest du vermutlich auch hinaus. In dem Beispiel wird das aber so erst mal nicht umgesetzt. An sich ist Command ein schönes Pattern, man sollte sich aber überlegen ob man es am Ende wirklich benötigt. Vergleich einfach mal den kurzen Code den TGGC da zeigt mit dem Code den ein Command Pattern hier benötigen würde. Flexibilität ist natürlich ein Argument, wobei ich mir die auch mit anderen weniger aufwendigeren Mitteln schaffen kann. Man sollte halt erst nachdenken bevor man solche Patterns benutzt. Die können einem halt viel Arbeit einbringen.
Ich habe die Bewegung der Spielfigur extra ausgelagert um zu verhindern, dass sich Aktionen und Bewegung gegenseitig blockieren.
Dort wird im Prinzip nur auf die Bewegungstasten reagiert, die Bewegung berechnet und dann die Figur bewegt. Drückt man also Links und Rechts gleichzeitig, dann steht die Figur still.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Renegade« (08.08.2017, 18:57)
Werbeanzeige