# Zwei Threads miteinander laufen lassen



## Eichelhäer (31. Mrz 2016)

Hallo,

folgendes Problem:

Ich möchte eine Spielfigur so bewegen, dass sie einem Pfad aus A* folgt.

Zuerst dachte ich das wäre einfach, doch das ist nicht wirklich trivial.
Mittlerweile bin ich bei der Idee angelangt mit mehreren Threads (2) zu arbeiten, um die Spielfigur zu bewegen.

Meine Map besteht aus 32x32 großen Tiles. Wenn ich den Pfad via A* mit dieser Größe berechnen lasse ist der Algorithmus zur Laufzeit wesentlich schneller als mit 1x1 großen Knoten.
Außerdem ergibt sich mit 32x32 eine einfachere Kollisionsverarbeitung.
So, nun hab ich mir überlegt einen Thread im 2 Sekunden Takt jeweils den folgenden Knoten des Pfades berechnen zu lassen und einen zweiten Thread dafür zu nutzen den Spieler mit der üblichen Vorgehensweise solange zu nachzuziegen bis der Spieler in 2 Sekunden den vorübergehenden Zielknoten erreicht hat. Dieser zweite Thread läuft daher auf z.B. 60 frames, um eine flüssige Bewegung zu erzielen. Das ist zwar Hardcoding aber mir fällt nicht wirklich etwas anderes. effektiveres ein.

Meine Frage ist zuerst mal: Ist dieser Ansatz grundsätzlich machbar, oder kann ich diese Idee total in die Tonne treten, denn ich befürchte starke Performanceprobleme zur Laufzeit.

Ein anderer Ansatz, den ich verfolge ist mit zwei einfachen Timern zu arbeiten. 

Was ist besser, oder ist das Geschmackssache?

Gruß Eichelhaer


----------



## Jardcore (31. Mrz 2016)

Grundsätzlich benötigt man in den seltensten Fällen Multithreading. Ist bei mir schon etwas her, aber A* funktioniert wunderbar ohne Multithreading.

Meine Figur lief damals in einer Schleife, die abgebrochen wurde, wenn die Figur das Ende des Pfades erreicht hatte. In einem Spiel ist die Schleife dann natürlich der GameLoop und die Figur wird wie auch immer ein Update bekommen und ihren nächsten Knoten auf dem Pfad berechnen.

Je nachdem was genau du vorhast könnte deine Figur die ersten paar Zyklen das Update benutzten um den Pfad zu bauen und wenn dieser vollständig ist ihn abfahren / gehen / fliegen / schwimmen... usw.


----------



## Eichelhäer (31. Mrz 2016)

Aber wie????

Entweder ich hab ein riesiges Brett vorm Kopf oder mach irgendwas falsch, denn wenn ich den Pfad in einer erweiterten for-Schleife in der update Methode komplett berechne und anschließend die x-bzw y Werte zuweisen will springt der Spieler sofort zum zielpunkt. und wenn ich das pro frame mache dauert es ewig und drei tage bis der spieler am ziel ist. Grundsätzlich weiss ich wie man z.B. ein Rechteck bewegt, aber ein Rechteck nach einem vorgebenen x-bzw y wert flüssig zu bewegen, indem man die werte einzeln zuweist pro tick, ist doch da die einzige möglichkeit oder irre ich mich da total? 

Habe erklärungsbedarf.....

Gruß Eichelhaer


----------



## mrBrown (31. Mrz 2016)

Ja, je Zeiteinheit ein kleiner Teil der Bewegung, das ist dann der einzige Thread (=GameLoop von oben).
Den Pfad berechnet man einmal, und hat ihn ja dann, parallel muss da nichts laufen.


----------



## Jardcore (1. Apr 2016)

Du klickst, bekommst die Zielkoordinaten.
A* berechnet den Pfad und Packt die Knoten auf einen Stack.
Figur nimmt sich pro Zeiteinheit ein Knoten vom Stack und bewegt sich dorthin.
Wenn du in der Zeit irgendwo neu hinklickst wird der Stack neu berechnet.


----------



## Eichelhäer (1. Apr 2016)

HHHHHH!!!

Bin so ein Rindviech.

Habe es gestern bereits noch selbst rausgefunden meld mich heut aber trotzdem nochmal.
Sinnloses Thema von mir total unnötig. Entschuldigung. Ich glaub ich schlafe zu wenig.

Funktioniert jetzt alles.


Thema hiermit geschlossen.


----------



## jacques93 (22. Apr 2016)

Ich habe hier mal das Spiel Space Invaders programmiert.
Ich habe dafür gesorgt dass zwei Threads miteinder laufen.
Diese Funktion müsste sich in Game.java befinden .

EDIT (by Moderator): Es reicht ein Post um dein Spiel vorzustellen, du kannst in weiteren Threads aber ruhig auf diesen Post verweisen.
http://www.java-forum.org/thema/spielesammelthread.123839/#post-1087953


----------

