Ideen für eine Art Puzzlespiel aber mit Gleisen und Zügen
Übersicht

nathan7Betreff: Ideen für eine Art Puzzlespiel aber mit Gleisen und Zügen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also ich würde gern ein Spiel programmieren wo das Feld voll mit Teilen ist auf welchen Gleise abgebildet sind.
Diese gilt es so zu sortieren dass anschliessend ein Zug von A nach B fahren kann. Wie könnte ich dies umsetzen? Also mir geht es um das anschliessende befahren der Gleise. Ach und die Felder sollen einfach nur gedreht werden können. |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit einem simplen Array. Du legst ein Raster an in welchem gespeichert ist an welcher Position welches Gleis wie liegt und der Spieler kann (mit der Maus oder was Dir halt vorschwebt) die Dinger dann drehen. Zum prüfen der Strecke musst Du dann nur vom Startpunkt aus in Fahrrichtung durchgehen bis es nicht weitergeht oder eine Kurve kommt und entsprechend die Fahrrichtung ändern. Fertig ist die Laube ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
nathan7 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das Problem ist aber wie ich das mache dass der Zug mitsamt Hängern dort langfährt.
Die Teile über ein Array sind kein Problem. |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Meinst du sowas ähnliches wie der Spiel wo man Rohre verlegen muss damit Wasser durch kommt?
Du meinst also, der Spieler ist fertig und der Zug soll durchfahren, wie macht man den Zug? Oder meinst du, wie finde ich einen gültigen Weg durch so eine Bahn mit Verzweigungen? Falls ersteres: Auf jedem Tile gibt es ja nur zwei Möglichkeiten: Geradeaus fahren oder abbiegen. Im ersten Fall erhöhst/verringerst du x/y jedes Frame ein bisschen bis der Zug das Feld verlassen hat. Im zweiten Fall nimmst du eine Funktion die dir einen Kreis gibt (abgeleitet von r^2=x^2+y^2 wenn ich die Formel noch im Kopf hab) und lässt den Zug diese Formel nachfahren. Dabei behandelst du die Wagone gleich wie die Lok nur schickst du sie erst später los. Falls zweiteres brauchst du einen Path-Finding-Algo, wie den A* oder den Dijkstra (such einfach auf Wiki). Oder du kannst es einfach rekursiv bruteforcen, das sollte bei der vergleichsweise kleinen Anzahl an Feldern auch ohne weiteres möglich sein. Dafür machst du einfach einen rekursiven Algo bei dem ein Pfad abbricht, wenn es keine gültigen Ausgänge von dem momentanen Feld mehr gibt (=Sackgasse) oder wenn das momentane Feld schon besucht wurde (=Kreis). |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstmal:
Überlege, welche arten von Gleisen möglich sind. Da du es sehr wahrscheinlich erstmal simpel halten willst, gibt es wohl folgende möglichkeiten: 1) Pipe (grades stück). Fahrmöglichkeit von einer kante zur gegenüberliegenden. Drehmöglichkeiten: 2 Grafik: | 2) Kurve (gebogenes stück). Fahrmöglichkeiten von einerkante zur links oder rechtsliegenden kante. Drehmöglichkeiten: 4 (Himmelsrichtungen: NO SO SW NW) Grafik: |_ 3) Kreuzung. Fahrmöglichkeiten: Wie pipe, aber aus allen richtugen. Drehmöglichkeiten: 0 (egal wie man es dreht, die fahrmöglichkeiten sind immer gleich) Grafik: + T-Stücke sind auch denkbar, aber wird es schwer, die fahrrichtugn zu bestimmen ohne das der user dies irgendwo festlegen kann. Also lass ich die erstmal aussen vor ![]() Nun weist du jeder art von fahrmöglichkeit (zb von Norden nach Süden) eine zahl zu: Pipe1 = N <-> S = 1 Pipe2 = O <-> W = 2 Kurve1 = N <-> O = 4 Kurve2 = O <-> S = 8 Kurve3 = S <-> W = 16 Kurve4 = W <-> N = 32 Die sind alle möglichkeiten. Dein array oder raster kriegt nun kombinationen aus den zahlen. Zb hat ein Pipe stück entweder "Pipe1" oder "Pipe2". Beim "drehen" wechselst du sie entsprechend aus. Die kurven schalten der reihe durch: Linksrum: Kurze1, Kurve2, Kurve3, Kurve4 - Rechtsrum: Kurve1, Kurve4, Kurve3, Kurve2 Das kreuzungsstück ist Pipe1+Pipe2, dies bleibt unverändert. Damit kannst du nun recht einfach die art des Tiles bestimmen. Ausserdem wirst du wissen, in welche richtung sich dein zug bewegt. Ergo, du kannst zb über eine IF abfrage die bewegungsrichtung des aktuellen tiles unter dem Zug rausfinden. Je nachdem wie "frisch" du beim programmieren bist, kann das mehr oder minder schwieriger werden, aber ich rate dir mit einem ähnlichem anfang zu beginnen wie oben genannt. Wichtig ist vorallem, das du die Zahlen so vergibst, das sie immer doppelt soviel ist wie das vorherige tile (1,2,4,8..) Dies ermöglicht dir später bitwise operatioenn beim abfragen. Siehe hierzu: https://www.blitzforum.de/help/And oder auch: BlitzBasic: [AUSKLAPPEN] If (AktuellesTile And Pipe1) Then wenn das aktuelle tile zb eine Kreuzung ist, dann enhtält es eine kombination aus Pipe1 und Pipe2. Binär betrachtet: 00000001 für pipe 1 00000010 für pipe 2 00000011 für kreuzung. Die AND abfrage (ich hoffe es ist auch AND in blitzbasic, ich finde keinerlei übersicht über operatoren in der hilfe ![]() Dies hilft dir, wenn du die herkunft des zuges kennst die nächste richtung zu finden, ungeachtet dessen, welches tiles tatsächlich vorliegt. Schriftlich: Wenn nächstes teil Pipe1 dann richtung = 0 (grade aus) Ansonsten wenn nächstes teil Pipe2 dann problem (pipe 2 ist o<->w, zug kommt aber aus süden. problem) ansonsten wenn nächstes teil Kurve1 dann problem (s.o. falsches tile) Ansonsten wenn nächstes teil kurve2 dann richtung = 1 (rechts rum - ist eine kurve von s<->o) Ansonsten wenn nächstes teil kurve3 dann richtung = -1 (links rum - ist eine kurve von s <-> w) ansonsten wenn nächstes teil kurve4 dann problem (falsches tile) Merke: das ist eine sehr eifnache form der abfrage, in welche richtung dein zug als nächstes muss. Diesen wert kannst du zb beim betreten eines tiles überprüfen und dann solange anwenden, bis das tile unter dem zug ungleich dem letzten ist. Dann musst du die abfrage wiederholen, evtl aus einem anderen blickwinkel. Für die hänger kannst du exakt das selbe prinziip anwenden, nur das sie jedesmal ein tile hinter dem zug herhinken. Alternativ richtest du sie so aus, das sie den vom zug gewählten weg verfolgen. Als goodie kannst du, wenn alles steht, die drehrichtung des zuges interpolieren, wenn er auf einer kurve ist. Hierzu bietet sich lineare interpolation an - allerdings solltest du dann den "weg" auf dem akteuleln tile ebenfalls interpolieren. Lineare interpolation sieht im groben so aus: Code: [AUSKLAPPEN] output = (wert2 - wert1) * t + wert
Wert1 und Wert2 sind frei wählbar, zwischen ihnen wird interpoliert. t ist eine fließkommazahl zwischen 0 und 1. Beispiel1: Zug betritt pipe stück und fährt gradeaus nach oben weiter. wert1 ist die y höhe beim betreten des tiles, y höhe ist der punkt, wo das nächste tile beginnt. Zum bewegen zählst du eine variable t von 0 zu 1 hoch und interpolierst zum rendern des bildes nun über die lineare interpolation die Y höhe des zuges. Beispiel2: Zug betritt kurvenstück von unten und will links rum. hier hast du wiederrum einen wert t. Die XY koordinate berechnest du vom unteren linken punkt des tiles, hast zudem einen radius r und einen winkel w (w wird interpoliert zwischen 0° und 90°). Hierzu nimmst du noch Sin(w) * r für y und Cos(w) * r für die x koordinate - dein zug fährt einen viertelkreis ![]() PS: Du hast gefragt, wie du das machst - das kann dir keiner beantworten. Oben gennantes ist pur mein ansatz wie ich es beginnen würde und es gibt sicher noch 20 andere versionen, die richtig schön simpel sind. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich habe mal einen Algo geschrieben für zwei Jungs, die ein Tram-projekt hier machen wollten. Ist aber nie fertig gestellt worden.
https://www.blitzforum.de/worklogs/492/ Das ganze war sogar in BlitzBasic geschrieben. Der Algo kann aus einer Beschreibung als TXT-Datei eine Strecke aus Teilschienen (Geraden und Kurven) zusammensetzen. Der Algo kann anschließend einen Zug diese Strecke entlangfahren lassen. Dabei folgen die Drehgestelle (Räder) dem Streckenverlauf und die Waggons liegen auf den Drehgestellen. Hierzu gab es 2D Simulationen in Draufsicht. Könnte das was für Dich sein? Irgendwo müßte ich noch die Quellcodes haben.... |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group