# Spectator Modus für Spiel ähnlich zu Terraria



## IWillTry (1. Jun 2015)

Hi Leute,

Ich bin gerade an einem 2D-Side-Scrolling Programm ähnlich zu Terraria am arbeiten.
Nun soll ich den Netzwerkmodus implementieren, beginnend mit dem Zuschauer/Spectator Modus.
Server- und Client sind bisher zum Chatten implementiert und der Chat läuft auch.

Nur wie erstelle ich den Zuschauermodus? Wie teile ich beim connecten dem Server mit, in welchem Modus ich mich als Client verbinden will? Ich stehe dabei gerade total auf dem Schlauch... Hilfe bitte

Vielen Dank

IWillTry


----------



## Maggot (1. Jun 2015)

Ich würde beim Connecten als Client eine bestimmte Zeichenfolge schicken damit der Server weiß, dass ich ein Spactator bin. 

Wenn der Client ein Spectator ist, dann muss nurnoch das ganze Spielgeschehen gesynct werden. Also die ausgangs Map an den Client senden, die rendert er bei sich und dann sender der Server nurnoch die änderungen an den Client. 

So würde ich das implementieren,


----------



## IWillTry (1. Jun 2015)

Hi Maggot und danke schonmal für die Antwort,
also ich habe bereits einen Chat-Server und Client. Dem Client übergebe ich nun im Konstruktor einen int-Wert (oder ein enum), der den Modus bestimmt (Chat, Spectator, Participant,...).
Nur wie soll der Server das auslesen? 

Die Chunks der Welt werden als Arrays in ner Textdatei gespeichert. Die werden zu Beginn verschickt und während des Spiels sollen dann nur die Operationen des Spielers übermittelt und beim Client umgesetzt werden.

Nur wie? Also wie sieht der Code für sowas aus?


----------



## Major_Sauce (1. Jun 2015)

Im Endeffekt hast du folgende Möglichkeiten: 

1. Du legst die Textdateien auf einem Server ab, und lädst sie dann mit dem Client, in diesem Fall zuschauer runter, und öffnest sie dann nach deinem Bestimmten Verfahren.

2. "Streaming", d.h. du Sendest beim connten entweder alle, oder nur teilweise die Daten der Welt an den Zuschauer. Wenn du sie nur teilweise schicken willst, dann schick ihm die Daten aus seiner momentanen Umgebung. Wenn er sich bewegt dann schaust du wohin und lädst diese dann wieder auf den Client.

3. Seeds. Du generierst einen Seed, erstellst die Welt danach und schickst dann nur noch diesen Seed, normalerweise eine Zeichenfolge aus einigen Zeichen. Diese werden dann auf dem Client zerlegt, es werden die Weltdaten ausgelesen und falls sich die Blöcke ändern können, dann muss der Server noch die Daten der Blöcke schicken, die seit dem ersten Start geändert wurden.

Nun wähl dir einz aus, dann können wir dir zumindest mal die richtigen Links zuschicken, Code senden ist immer so ne Sache, da du dann meißt nichts draus lernst (bzw kaum was)

mfg Major


----------



## IWillTry (1. Jun 2015)

Hi Major_Sauce,

Danke für die Übersicht. Wegen der Art der Weltgenerierung werden wir wohl erstmal auf die erste Variante zurückgreifen müssen.
Der Server ist in diesem Fall erstmal immer der PC des SPielers, der sein Spiel teilt.
Weiß halt nur nicht, wie ich das verschicken kann.

Viele Grüße


----------



## Major_Sauce (1. Jun 2015)

Na dann leg die welt doch in nem ordner an, der außerhalb liegt, appdata zum Bleistift, und dann liest du die einfach...


----------



## IWillTry (1. Jun 2015)

Ich möchte doch wissen, wie ich diese Chunkdateien verschicken kann..


----------



## IWillTry (1. Jun 2015)

BIsher kann mein Server nur Texte empfangen, diese ausgeben und an alle Clients zurücksenden, wo diese wiederrum im Chatfenster ausgegeben werden.
Nun brauche ich einen Server, der vom Client zunächst die Daten Name, Gamemode, etc. empfängt, diese abspeichert (Userlist) und der die Spieldatein verschicken kann an die Clients


----------



## Maggot (2. Jun 2015)

IWillTry hat gesagt.:


> BIsher kann mein Server *nur Texte empfangen*, diese ausgeben und an alle Clients zurücksenden, wo diese wiederrum im Chatfenster ausgegeben werden.
> Nun brauche ich einen Server, der vom Client zunächst die Daten Name, Gamemode, etc. empfängt, diese abspeichert (Userlist) und der die Spieldatein verschicken kann an die Clients



Du schickst die Texte als Bytes und wandelst die dann einfach zu nem String wieder um. Deshalb kommt es dir nur so vor als würdest du nur Texte empfangen können. Du kannst alles mögliche an den Client senden, hauptsache er weiß was er damit machen soll. 

z.B.:

Du sendest dem Client immer am Anfang 4 bytes mit, die die Daten beschreiben:


```
byte[] meineBytes = new byte[4];
meineBytes[0] = 0;
meineBytes[1] = 0;
meineBytes[2] = 0;
meineBytes[3] = 1;
```

das 0 0 0 1 könnte heißen das du dem Client den Gamemode schickst. Also schickst du vom Server die 0 0 0 1 Bytes mit und als String (der wieder zu Bytes zerlegt wird) den Gamemode. Jetzt musst du beim Client abfragen ob die ersten 4 bytes eben 0 0 0 1 sind, dann weißt du das jetzt der Gamemode empfangen wurde.

Um zum Beispiel die Welt an den Spieler zu schicken, liest du als bytes einfach die Textdatei ein, und sendest sie an den Client. Aber vergiss nicht wieder 4 bytes zuerst zuschicken, die dem Client sagen was er machen soll.


----------

