# Tickbasiertes Spiel



## Gauo (19. Dez 2007)

Hi, ich will eine art Kreuzung zwischen Echtzeit und Rundenbasiertem Netzwerk- Strategiespiel verwirklichen.
Mit Kreuzung mein ich eine Art Tick system wie bei browsergames.
Es soll innerhalb eines Ticks z.B 5minuten alle bauaufträge flotten befehle etc.  gegeben werden die dann im nächsten Tick starten und dann irgendwann mit einem anderen Tick enden.
Soweit zur Idee, aber wie setzt man das um?...kann man das irgendwie mit einer Runnaable bzw einem Timer machen der der alle 5minuten ausgeführt wird und sich alle Task ansammeln bzw hinzugefügt werden  und sobald der timer x mal aufgerufen wurde dieses ausführt?...kann mir das als code gar net vorstellen, bzw wie ich das möglichst geschickt umsetze(u.a. Ressourcen sparend)

ich hoffe ihr könnt mir helfen bzw ich konnt mich gut genug ausdrücken ^^


----------



## Campino (19. Dez 2007)

Du brauchst eine List mit neuen Tasks und einen Timer, der den Tick auslöst. 

Für die Netzwerkarchitektur würde ich empfehlen, dass einer der Rechner den Tick auslöst und ein Signal an die anderen sendet, damit das synchron läuft. 

Ressourcensparender wird es kaum gehen.


----------



## Gauo (19. Dez 2007)

ah, k....ich fasse deine Idee so auf
ich mach eine doppelte Liste<Liste<Task>> sozusagen in der der index i der ersten Liste den nächsten iten Tick beschreibt und die ansammlungs an Task die ausgeführt werden soll wenn der Timer das nächste mal seine dings methode aufruft...
noch ne frage.
Ich hab eigentlich keine Ahnung von Netzwerk programmierung und hab das Spiel bisher(Konzept und Game Klassen struktur von ingame Objekten) nicht darauf ausgelegt. Gibt es Tutorials die mir verklickern was ich zu beachten hab und sowas?


----------



## Campino (19. Dez 2007)

ähm...warum brauchst du den eine doppelte Liste? Die Liste enthält alle Tasks, die noch zu tun sind, dabei speichert jeder Task, wann er ausgeführt werden soll, z.B. nach 5 Ticks. Bei jedem Tick wird der Task nun "angetippt", woraufhin er seinen Zähler um eins runtersetzt, wenn der Zähler 0 ist, wird der Task ausgeführt. Dazu brauchst du noch eine Liste. 

Performanter geht es, wenn du mit System.currentTimeMillis() die Systemzeit nimmst, was dazuaddierst und nach dieser Zeit feststellst, wann der Task ausgeführt werden soll.  

Was das Netzwerk betrifft: 
Am einfachsten ist eine Client- Server- Architektur. Dabei kann die Server- Applikation auch auf demselben Rechner wie ein Client laufen. 
Überleg dir, welcher Computer welche Informationen wie oft braucht. Informationen, die ständig von vielen Rechnern gebraucht werden, kommen auf den Server. Informationen, die für einzelne Rechner wichtig sind und nur selten von anderen gebraucht werden, bleiben im Client. Sie müssen im "Notfall" von den anderen Rechnern dort nachgefragt werden. 
Jetzt musst du nurnoch sicherstellen, dass alle Rechner immer dieselben Informationen haben. Die informationen, die auf dem Client selbst sind, aktualisiert der Client, die, die im Server sind, aktualisiert der Server. Jetzt muss nurnoch der Server geänderte Werte an die Clienten weitergeben und die Clienten geänderte Werte, die Server oder andere Clienten brauchen, dorthin geben. 

*Wichtig:* Achte darauf, dass Daten, die an mehreren Stellen gespeichert sind, wenn sie irgendwo geändert werden an ALLEN Stellen geändert werden. 
*Beispiel:* In einem Ego- Shooter bewegt sich ein Spieler. Stell dir vor, was passiert, wenn einer der Computer eines anderen Spielers das nicht erfährt und den Spieler noch an der alten Position vermutet und auch dort darstellt. 

PS: Am einfachsten ist es, wenn ALLES auf dem Server liegt, der Client nach jedem Tick alle für ihn relevanten Daten, die sich geändert haben, neu übertragen bekommt und ALLE Befehle des Spielers sofort an den Server überträgt. Dann läuft die ganze Spiellogik auf dem Server, du hast aber auch massig Datenverkehr im Netzwerk.


----------



## Gauo (19. Dez 2007)

Campino hat gesagt.:
			
		

> ähm...warum brauchst du den eine doppelte Liste? Die Liste enthält alle Tasks, die noch zu tun sind, dabei speichert jeder Task, wann er ausgeführt werden soll, z.B. nach 5 Ticks. Bei jedem Tick wird der Task nun "angetippt", woraufhin er seinen Zähler um eins runtersetzt, wenn der Zähler 0 ist, wird der Task ausgeführt. Dazu brauchst du noch eine Liste.
> 
> Performanter geht es, wenn du mit System.currentTimeMillis() die Systemzeit nimmst, was dazuaddierst und nach dieser Zeit feststellst, wann der Task ausgeführt werden soll.


thx fürs die Tipps fürs Netzwerk, aber hier schnall ich die Performantere variante nicht mehr -.-...
wär zum ersten vorschlag das ich das immer einen runtersetze meine nicht einfacher?...dann hab ich doch eine art Warteschlange, wo ich nicht am Ende des Ticks alle durchgehen brauch sondern nur die an Position 0 ausführe und dann "den Kopf abschlage"
...hm...ich frag mich nun aber ob das wirklich geschickter ist, da ich ja im spiel die prozesse auch anzeigen muss, da ja ein bauauftrag auch abgebrochen werden können sollte, bzw angezeigt werden sollte wann er endet. Genauso bei den Forschungen und Flotten befehlen -.-...
argh....verwirrend -.-


----------



## Campino (19. Dez 2007)

Ein Gebäude soll gebaut werden. Die Bauzeit beträgt 5 Ticks. Es muss also in die fünfte Liste in der Liste, dazu musst du aber erstmal fünf Listen reinpacken. Wenn in den vier Ticks dazwischen nichts passiert, schwirren da 4 leere Listen durch die Gegend, das ist absoluter Unsinn. Mit meiner Variante brauchst du die nicht. 
Außerdem sparst du dir den Code um festzustellen ob schon genug Listen in deiner Liste sind und um die Zusätzlichen einzufügen. Alles in allem ist das sogar einfacher. Wenn du sowieso anzeigen möchtest, wie lange der Bauauftrag noch braucht, kannst du da einfach den Tick- Zähler aus meiner Variante anzeigen, in deiner musst du noch herausfinden, in welcher Liste der Bauauftrag ist. 
Und EINE Liste nach Bauaufträgen oder was auch immer, die angezeigt werden sollen, zu durchsuchen ist auch einfacher, als in was weiß ich wievielen Listen zu suchen. 
Das Herauswerfen von ausgeführten Aufträgen, ist auch ganz einfach, in deiner Variante entfernst du mit der remove()- Methode die Java- Listen ja sowieso haben die erste Liste, in meiner mit derselben Methode die abgelaufenen Aufträge.


----------



## Gauo (21. Dez 2007)

hm....noch eine Frage.
Ich habs jetzt so Umgesetzt, aber wie komm ich in einer java.util.Timer Klasse an die Zeit die noch vergeht bis der Task wieder ausgeführt wird?...oder muss ich von dem Timer die frequenz höher stellen(also auf jede sekunde) und nur wenn Tickzeit vergangen ist wird run wirklich ausgeführt...anonsten passiert nichts, höchstens das ein Zähler hochgezählt wird...


----------

