Hallo zusammen,
ich würde gerne ein Slide Puzzle erstellen und habe mich vom Spielprinzip her von Slayaway Camp stark inspirieren lassen. Ich habe mal ein Gameplay Video rausgesucht
Ziel des Levels ist es, alle anderen Figuren auszuschalten und dabei selbst nicht von anderen NPCs ausgeschaltet zu werden. Das Spiel ist zwar ein Voxel Game, man kann es sich aber gut als 2D Grid vorstellen. Der Spieler gibt zu Beginn eines Zuges eine Bewegungsrichtung vor und danach ist der Input solange deaktiviert, bis alle Aktionen für diesen Zug abgehandelt sind.
Zunächst ist der logische Part von der Darstellung getrennt. Das heißt, wenn ein Haus eine bestimmte Anzahl von Zellen besetzt, sind diese Zellen (Grundriss) über ihre Außenseiten einfach nicht passierbar. Nun habe ich vom Code Design her mehrere Ansätze ausprobiert und immer wieder gemerkt, dass ich langfristig in Sackgassen rennen werde.
Eine Position (x|y) kann teilweise oder gar nicht passierbar sein. Das richtet sich danach, ob eine Außenseite ein Obstacle ist. Ein Beispiel wäre ein Zaun an einer der vier Außenseiten. Für diese kann ich mir die relative Position zum Zentrum merken, also (0|1) wäre die obere Außenseite.
Ebenso können auf einer Position NPCs stehen, die sich auf der Karte bewegen können. Wenn sich der Spieler auf einer Linie bewegt, agiert er immer mit dem Objekt vor sich, die beiden Objekte seitlich der Zielposition können auf den Spieler reagieren, der Spieler selbst tut aber nichts. Beispielsweise würde der Spieler den NPC vor sich töten, die beiden NPCs neben ihm würden aber wegrennen. Befindet sich beispielsweise ein Lichtschalter an der oberen Außenseite der Zelle hinter der Zielposition (Spieler kommt von unten nach oben) dann interagiert der Spieler damit natürlich nicht, er müsste sich direkt auf dieses Feld bewegen. Wichtig ist auch, ob sich zwischen den beiden Zellen ein Obstacle befindet, ein NPC hinter einer Wand interagiert ebenfalls nicht mit dem Spieler.
Auf den Zellen können sich nicht nur NPCs befinden. Es könnte sich dort beispielsweise auch ein Loch oder ein Feuer befinden, die andere Figuren töten, sobald diese drüberlaufen. Ich rechne damit, dass das Feuer nur zur Darstellung in der Mitte ist und sich an allen vier Außenseiten "Death-Trigger" befinden werden. Da diese die Bewegung der Figur stoppen werden, muss bei der Berechnung der Zielposition darauf geachtet werden. Andererseits gibt es auch Druckplatten, die zwar eine Aktion auslösen, die Bewegung der Figur aber nicht stoppen.
Nun zu meinem bisherigen Ansatz:
Den gesamten Zug kann man vorher berechnen und dann dementsprechend die Animationen laufen lassen. Prinzipiell ist ALLES erstmal ein Trigger, ob Feuer oder "Weglaufen", wenn der Spieler neben der Figur steht. Dementsprechend hat jede Position (x|y) an jeder Außenseite 0 - n Trigger. Da sich auch noch bewegliche Dinge auf der Zelle befinden können, gilt das Gleiche auch noch einmal für diese. Wenn sich eine Figur zu einer anderen Zelle bewegt, muss man ja irgendwie wissen, welche Trigger mit rübergehen und welche an der Position bleiben.
Bei den Obstacles kann man sich entscheiden, ob diese auch Trigger sind => Bewegung stoppen oder ob die Außenseiten einer Position oder eines Objektes ein Obstacle haben.
Bewegt sich der Spieler zu einem NPC, bleibt dieser vor ihm stehen und der Trigger des NPCs kümmert sich darum, dass der Spieler diesen tötet.
Irgendwie halte ich das aber für falsch, weil eigentlich sollte sich ja der Spieler selbst darum kümmern, dass er den NPC tötet. Ebenso gibt es das Problem, dass beispielsweise ein Feuer keine Obstacles hat. Man kann also nicht berechnen, dass der Spieler beim Feuer stehen bleibt. Man müsste explizit beim Trigger anfragen, ob dieser die Bewegung einer Figur stoppt.
Vielleicht hat ja jemand eine Idee, wie man die Logik so unter einen Hut bringt, dass man ein skalierbares System hat. Es muss nämlich nicht immer sein, dass der Spieler die NPCs sofort tötet, es ist auch möglich, dass manche NPCs eine undurchdringbare Rüstung haben und sich dann zum Spieler drehen und diesen töten...
Ich glaube die Information spielt hier keine Rolle, aber ich setze das Spiel mit Unity/C# um.
Vielen Dank schon einmal