nackermann / Voozix.SpriteKit

2D Tablet game: Collect stars and try to survive as long as possible!
0 stars 2 forks source link

Networking #7

Closed mreinfurt closed 10 years ago

mreinfurt commented 11 years ago

Create a component that synchronizes 2 players. @Sebastian93

mreinfurt commented 10 years ago

@Sebastian93 @k-liu @Greek6 Das muss hier noch ordentlich spezifiziert werden. Es soll vermutlich einen Server geben, den eines der Geräte hostet? Ansonsten müssen nur die Positionsinformationen übertragen werden.

Sebastian93 commented 10 years ago

@Greek6 @k-liu Wie wollen wir Nachrichten übertragen? Ich hab nun erstmal ein neues Objekt "Message" erstellt. dadrin kann man dann angeben was die Nachricht enthält und n Objekt mitsenden (z.B. Koordinaten des Spielers), oder n neues Objekt welches gespawnt wurde. Momentan hängts aber auch noch generell am Verbinden... Doku is veraltet von Apple und Tutorials für iOS 7 gibts auch noch nich -.-

nackermann commented 10 years ago

@Sebastian93

Ich hab keine Ahnung was man da am besten mitschickt, müsste man mal paar Tutorials lesen

http://gafferongames.com/networking-for-game-programmers/ etc

Sebastian93 commented 10 years ago

Das liegt an uns. Du kannst alles senden, was du lustig bist. Lässt sich, soweit ich weiß, ja alles in nen NSData umwandeln. Reine "Design" Entscheidung. Die Daten sollten aber denk ich klein sein damit sie schnell übertragen werden können. Also zB. nicht die ganze Scene rüber schicken. Hab mir evtl gedacht 2 Message-Types zu verwenden:

mreinfurt commented 10 years ago

@Sebastian93 PlayerMoved klingt auf jeden Fall sehr gut, muss man halt zwischen Positionen vielleicht teilweise interpolieren, falls das nicht schnell genug geschieht. Sollte ja nicht ruckelig aussehen.

ObjectSpawned klingt auch gut, muss eben der Typ des Objektes und die Velocity übergeben werden, dann ist das Paket sehr klein und man hat alle nötigen Informationen.

Ich weiß nicht, ob man vielleicht eventuell ab und zu alle Objekte synchronisieren sollte, falls es mal dazu kommt, dass die ungleiche Positionen haben.

Zum Star: Entweder entscheidet man über PlayerMoved, dass der "gegnerische" Spieler ihn aufgesammelt hat, oder wir haben dafür noch eine Nachricht.

Sebastian93 commented 10 years ago

@Bitbridge Zum synchronisieren evtl. Timestamp mitschicken und dann beim Empfänger berrechnen, wieviel weg ein Objekt in dieser Zeit zurück gelegt hat? Der Star muss auch über Object Spawned übergeben werden, da er ja Random gespawnt wird. @Greek6 @k-liu @Bitbridge GameCenter an sich scheint entweder nicht zu funktionieren, ist verbuggt oder uns fehlt noch iTunes Connect. Er findet Beispielsweise nicht 2 Geräte bzw. Spieler, obwohl diese vorhanden sind. Ich werde nun Peer to Peer Verbindung seperat nochmal implementieren (übernimmt auch eigentlich das GameCenter).

mreinfurt commented 10 years ago

@Sebastian93 Weiß jetzt nicht genau, was Du meinst. Das wird nämlich wahrscheinlich nicht reichen, um zu erkennen, ob sie asynchron sind, weil sie in der Zwischenzeit ja auch an Ecken stoßen können (+ Invertieren der Richtung).

Und ja, der Star wird über ObjectSpawned übergeben, aber vielleicht wäre es noch sinnvoll, dass man auch ein "StarCollected"-Event hat und daraufhin der aktuelle Stern gelöscht wird. Du musst ja irgendwie feststellen, ob der gegnerische Spieler sich den geschnappt hat. Und wenn da die Positionen mal ungenau sind, könnte es ja vorkommen, dass der Stern beim Gegner aufgesammelt wurde, aber bei Dir nich nocht, weil bei Dir der Gegner nur 2 Pixel vor dem Stern war (von der Position her).

Sebastian93 commented 10 years ago

@Bitbridge Das mit dem StarCollect Event klingt sinnvoll und hab ich nicht berücksichtigt. Mit dem Berechnen durch den Timestamp habe ich so gemeint: Man empfängt ein Paket X. In diesem Paket steht drinne wann und wo genau ein Objekt (plus ObjektTyp) gespawnt wurde. Durch den Zeitpunkt wann dieses Objekt beim Host gespawnt wurde kann doch berechnet werden, welchen Weg dieses Objekt (inklusive Ecken) bis dato zurückgelegt hat und dann spawnen? Weiß nicht wie komplex solch eine Berrechnung ist...?

@Bitbridge @Greek6 @k-liu Wo soll gehandelt werden wenn Objekte spawnen. Derzeit besitzt der PeerToPeerManager (und der nicht funktionierende MultiplayerManager /GameCenterManager) n Delegate, welches folgende Funktionen hat:

Sollten selbst erklärend sein die Methoden. Wenn das Match gestartet wird, so wird initial derzeit das Hauptmenü als Delegate verwendet. Soll das ganze dort bleiben? Oder soll nun das delegate auf z.B. MyScene geändert werden, sobald ein Spiel startet und dort dann auf die entsprechenden Events reagiert werden? Bei PeerToPeer können auch mehr als 2 Spieler connecten, soweit ich gesehen hab lässt sich das nicht großartig beschränken... (außer durch das Framework an sich ist es soweit ich weiß beschränkt).

Senden von Nachrichten machen die Objekte denk ich selbst, bzw. wo sich was ändert, wird ne Message rausgeschickt. Jedes Objekt kann auf den Manager zugreifen, da es ein Singleton ist.

Wie sollen die Mitspieler dargstellt werden bzw. identifiziert werden? Einfach ne ID dem Player hinzufügen?

mreinfurt commented 10 years ago

@Sebastian93 1) Ja, das mit dem Timestamp klingt sinnvoll, so dürften die Objekte erstmal um einiges synchroner sein. Ich dachte aber auch generall einfach an eine "Gesamtsynchronisation" jede 30 Sekunden/Minute oder so etwas, falls doch mal etwas schief gehen sollte.

2) Eine ID dem Player hinzuzufügen klingt sinnvoll und dürfte reichen. Visuell kann man die Mitspieler ja blau zeichnen, dann erkennt man auch seinen eigenen Ball/Player

3) Für mich klingt es sinnvoll, das Delegate auf MyScene zu ändern, weil dort dann sowieso alle Events "gebraucht" werden. Aber dazu können ja @k-liu und @Greek6 noch was sagen.

By the way: Eine Kollision zwischen Mitspielern sollte es nicht geben, oder? Die sollten sich einfach ignorieren, nehme ich an.

Sebastian93 commented 10 years ago

@Bitbridge Eine Gesamtsynchronisation halt ich für Sinnlos. Da alle Pakete automatisch durchs Framework ankommen (dafür sorgt das Framework zumindest laut Beschreibung).

Kann ja schonmal generell es auf MyScene setzen und weiteres kann man ja dann noch ändern.

nackermann commented 10 years ago

öh @Bitbridge

"By the way: Eine Kollision zwischen Mitspielern sollte es nicht geben, oder? Die sollten sich einfach ignorieren, nehme ich an."

Ich würde sie eigentlich Kollidieren lassen, aber nicht wegschubsen sondern wie beim Background. Einfach das sie nicht durch sich durch können.

Sebastian93 commented 10 years ago

@Greek6 @Bitbridge @k-liu Multiplayer funkioniert nun einigermaßen. Hab es nun noch nicht synchronisiert von dem ganzen aber für die Demo reicht das vorerst.

@k-liu Wo wird denn die Bewegung von nem Enemyball gesetzt. ?

Bei Bedarf muss nun noch die Message.h abgeändert werden (neue MessageTypen hinzugefügt werden) und die MyScene erweitert werden.

nackermann commented 10 years ago

@Sebastian93

Kann das jetzt @Bitbridge schon in den Master mergen?

Sebastian93 commented 10 years ago

@Greek6 Jaein. Es ist halt noch buggy. z.B. Wird ein Enemyball nur gespawnt bei der anderen Seite aber bewegt sich nicht (hab nicht rausgefunden wo ich die Bewegung finde, Velocity und Position is gesetzt) und dann kann gemergt werden. Muss dann noch ausgecodet werden, dass PowerUps spawnen (Message senden) bzw. despawnen (eingesammelt / Timer) Und sonstige Messages. Powerups waren bei mir noch nich drin.

nackermann commented 10 years ago

@Sebastian93

Achso ok, PowerUps kommen noch heute wenn Manuel merged, dann kannst du auf master rebasen.

k-liu commented 10 years ago

@Sebastian93 Die bewegung vom Enemyball wird bei der createEnemy-Methode gesetzt, danach jedes mal in update vom enemyBall

Sebastian93 commented 10 years ago

@k-liu Das hab ich gesehen und den ganzen Random Code da drin (is meineserachtens Sachen doppelt drin, z.B. wird anfangs n Enemy erzeugt, dessen Velocity gesetzt, Position berechnet und dann nochmal Velocity Random Erzeugt und nen neuer Enemy mit der Pos erstellt). Aber das tut nix zur Sache hier. Jedenfalls hab ich die Position und die Velocity genommen und übers Netz geschickt. Jedoch bewirkt das ganze gar nichts. Habe dann auf der Empfängerseite ein Enemyball erstellt mit der Position, der Velocity und es gespawnt. Er bleibt aber still stehen... Auch ist er in dem Array drin

Sebastian93 commented 10 years ago

@k-liu Okay, war ein Fehler meinerseits. Habe nicht den Konstruktor initWithPosition aufgerufen. Sondern normal init und dann die Position gesetzt. Behebe nun noch 1-2 Bugs dann kann das gemergt werden.

Sebastian93 commented 10 years ago

@Bitbridge Kann nun gemergt werden, oder gar getestet werden. Am besten evtl @Greek6 iPad Device mit Simulator? Hab es nun schon mit 2 VM's den ganzen Tag getestet, langsam is mein Laptop extrem heiß xD Fehlen nun dort noch PowerUps spawnen, doch is relativ simpel einzubauen...

mreinfurt commented 10 years ago

@Sebastian93 Kannst Du den Branch hier zum Master rebasen? Da gibt's relativ viele Konflikte und ich hab' mir jetzt keine Lust, alles anzusehen... Der GitHub-Mac Client suckt sowieso ziemlich, da kann man nichtmal mehrere Changes discarden. xD

Sebastian93 commented 10 years ago

@Bitbridge ich hab davon null Ahnung wie das geht xD. Und hab auch nur den Mac Client^^. Dadurch dass halt der Peer2Peer Manager nahezu überall sein muss gibt es ultra viele Konflikte, hab ich mir schon gedacht. Musste auch 1-2 Dinge ändern, z.B. den Star nicht weak usw. Aber ich weiß nun nicht wie man am besten alle Konflikte lösen kann? will auch nix am Master kaputt machen

mreinfurt commented 10 years ago

@Sebastian93 Ok, dann schau' ich mir das einfach später nochmal an und geh' alles in Ruhe durch. Wenn ich irgendwo Fragen hab', poste ich die einfach hier rein. ^^ Ist bis heute Abend rebased inklusive Pull Request, eventuell müsste dann jemand von euch versuchen, den Multiplayer zu testen, weil ich hier nur 1x Mac habe. Und "blindes" Mergen nach den vielen Änderungen wegen der Konflikte will ich dann auch nicht.

Sebastian93 commented 10 years ago

@Bitbridge Kann mich dann zum testen anbieten (2 VM's laufen einigermassen). Evtl. aber auch noch jmd. andres, die eigenen Fehler sieht man manchmal ja schlechter^^.

Sebastian93 commented 10 years ago

Achso...Es ist immer noch nicht geklärt, ob die nun durch sich durch gehen oder apprallen. Also die Spieler unter sich. Der einfachheit halber habe ich das nun so gemacht, dass die durch sich durch gehen können. Falls die sich apprallen sollen, so muss beim starten des Spiels noch die Spawn Position der Spieler rumgesendet werden. (NSDictonary mit SpielerID -> Position, oder so ähnlich). Und irgendjmd. müsst dann noch ne Grafik für Gegner erstellen & setzen (Grafik bin ich nicht gut^^)

nackermann commented 10 years ago

@Sebastian93

Würde sagen apprallen, @Bitbridge und @k-liu fanden das auch gut.

resituation kann man dann sagen ob sie sich richtig hart abstoßen oder garnicht.

Hier musst du auch noch machen das man ins Hauptmenü zurück kommt. Wenn ein Spieler verliehrt, beendet sich die App auf der einen Seite

Sebastian93 commented 10 years ago

@Greek6 Häh? Bei beiden, bzw. allen, kommt n GameOver Screen? Da beendet sich nix, App läuft weiter. Zumindest in meinen Tests. Bezüglich apprallen kann man dann noch einführen. Spawnen geht eig. auch relativ simpel... Einfach Alphabetisch sortiert von Links nach Rechts in einer Reihe Spawnen.Somit muss auch nich das spawnen rum gesendet werden.

nackermann commented 10 years ago

@Sebastian93

Bei mir atm nicht, ich zeigs dir dann mal. Wenn du gestern nichts mehr gemacht hast, müsste meine App eigentlich noch up2date sein.

mreinfurt commented 10 years ago

@Greek6 Die App stürzt ab und beendet sich nicht normal. Ist wohl einfach auf die Konfiguration bei Dir (iPad + VM?) zurück zu führen. Muss natürlich debugged und gefixed werden.

nackermann commented 10 years ago

@Bitbridge @Sebastian93

Wir könnens ja dann mit 2 Simulatoren testen, dann sehen wir ja warum das so ist.

Sebastian93 commented 10 years ago

@Bitbridge solche Bugs hatte ich eigentlich gefixxt. Das macht natürlich mehr Sinn, denn "beenden" habe ich nicht explizit eingebaut. Eventuell, wie bei bei manchen anderen Fehlern die ich gefixxt habe, habe ich ausversehen auf der falschen VM entwickelt. Kann gleich in der Vorlesung mal schauen, denk ist ein relativ simpler Fehler.

Sebastian93 commented 10 years ago

@Bitbridge @Greek6 @k-liu

Hallo, kleines Update. Herr Schütte hat mich heute informiert, dass die h-da über den bestehenden University Account keinen Zugriff auf iTunes Connect hat. Das heisst im Gegenzug, entweder auf die Funktionalität (Leaderboard, etc.) verzichten oder aber den Multiplayer-Part mit Bonjour verwenden und etwas wie Leaderboard dann vielleicht lokal oder in iCloud speichern. Viele Grüße, Stephan Gimbel

Bonjour is soweit ich gesehen hab aber auch nur lokal.

nackermann commented 10 years ago

Networking fliegt komplett raus erstmal, vielleicht in Version 2.0 . Wird zu lange dauern bis das mal Fehlerfrei läuft.