UDP Problem -> Bei Schuss blinkender Player an 0,0

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

The_Nici

Betreff: UDP Problem -> Bei Schuss blinkender Player an 0,0

BeitragDo, März 13, 2008 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag,
zwecks meiner kleinen UDP-Überei um wieder reinzukommen habe ich ein uraltes Projekt wieder ausgegraben um den UDP-Bug zu beheben. Nun, habe ich geschafft. Einen. Also nicht ganz.
Schiesst ein Player, blinkt er auf der anderen Playerseite. Schiesst man selber, sieht man den anderen Player garnicht mehr, also ist er nach 0,0.

Codeausschnitt:
Code: [AUSKLAPPEN]

            WriteInt outstrm, p1\x
            WriteInt outstrm, p1\y
            WriteInt outstrm, p1\hp
            WriteInt outstrm, p1\sicht
            SendUDPMsg outstrm, MasterIP, 7555
            empfang=RecvUDPMsg(instrm)
            If newshot=True Then
               WriteByte outstrm, 14
               SendUDPMsg outstrm, MasterIP, 7555
               recv=ReadByte(instrm)
               If recv=13 Then newshot=False
            EndIf
            If empfang <> 0 Then
               p2\x=ReadInt(instrm)
               p2\y=ReadInt(instrm)
               p2\hp=ReadInt(instrm)
               p2\sicht=ReadInt(instrm)
            EndIf
            If ReadByte(instrm)=14 Then
               a.schuss=New schuss
               a\x=p2\x
               a\y=p2\y
               a\richtung=p2\sicht
               a\player=1
               WriteByte outstrm, 13
               SendUDPMsg outstrm, MasterIP, 7555
            EndIf


Ich denke ich hab das Empfangen irgendwie verkehrt gemacht.
Wäre sehr hilfreich wenn sich jemand Zeit nehmen würde und den Code überprüfen würde, wäre ich sehr froh. Danke. Smile

ChaosCoder

BeitragDo, März 13, 2008 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Sei gegrüßt,

also es sieht so aus als hättest du sehr große Hoffnungen an einen Computer und an das Internet.
Ein neuer Schuss wird generiert und das Byte "14" an den anderen gesendet, und sofort wird überprüft was geantwortet wurde o_O. Das heißt es sind von Anfrage senden bis Antwort erwarten ein paar Nanosekunden vergangen. In der Zeit soll das Byte in die Internetleitung kommen, beim anderen wieder raus, verarbeitet werden und dann beantwortet werden... ähm, ja... naja... nicht wirklich. Zudem können UDP Nachrichten, die so kurz hintereinander abgeschickt werden, gerne mal falschrum bei dem anderen ankommen, du müsstest dir also solche Timestamps basteln und sir vor das Byte hängen und dazu noch was das überhaupt für ne Nachricht sein soll, dafür kannst du Zahlen nehmen, oder auch Strings, so dass eine UDP Message folgendermaßen aussehen könnte:

Nr. des Pakets zur Sortierung|Was übertragen wird|Daten
243|POSITION|51,321

Statt die Nummer könnte man auch Millisecs mitschicken, das ist willkürlich, allerdings kannst du mit der Nummer auch checken, ob ein Paket nicht angekommen ist (was bei UDP auch vorkommen kann)

Auf der anderen Seite musst du einen Parser schreiben der dir die ganze Arbeit abnimmt. Gleichzeitig fällt das Problem weg, dass du im Moment verschiedene Datentypen schickst/ausliest, denn mit Timestamp und so wird das ganze eh zu einem String.

Wenn du das gemacht hast und immernoch Probleme hast helf ich gern, soweit ich kann, allerdings hab ich von BlitzBasic auch nicht mehr soooo die Ahnung Razz
Projekte: Geolaria | aNemy
Webseite: chaosspace.de

ToeB

BeitragFr, März 14, 2008 9:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Man kann das auch anders machen ...

Code: [AUSKLAPPEN]
1. Auf schuss überprüfen -> Shoot_Variable = 1
2. Prüfen ob neue Nachricht -> x,y usw Position auslesen + Shoot_variable
3. Schicke deine Daten (x,y usw) + deine Shoot_variable
4. Wenn du geschossen hasst dann wieder auf Null setzten (wichtig : Nach Senden schreiben, damit der anedere Spieler auch weiß das du überhabt geschossen hatts (Shoot_Variable = 0)
Fertig ^^


So einfach ist das und die Nachricht kommt auch richtig beim anderen an Wink

mfg Crack93
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

ChaosCoder

BeitragFr, März 14, 2008 13:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Jaaa, aber wenn er nun nicht nur mehr Position und Schuss übertragen will? Es gehört schließlich ein wenig mehr zu einem Netzwerkspiel.
Zum Beispiel das einloggen(wenns server/client mäßig ist) oder aber das gemeinsame verbinden/synchronisieren, und da ist es tausendmal besser wenn man eine ordentliche Struktur hat und alles übersichtlich hält!
Projekte: Geolaria | aNemy
Webseite: chaosspace.de
 

Dreamora

BeitragFr, März 14, 2008 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Definitiv ...
Die basis jeden Netzwerk Spiels ist ein gescheit aufgebautes Message System und Funktionen die alle "zu sendenden Daten" in pakete umwandeln und verschicken sowie alle seit dem letzten check angekommenen nachrichten überprüft, parst und so die lokalen daten aktualisiert.
Das setzt voraus das man sich üeberlegt was man schicken will und das möglichst sinnvoll aufbaut (ChaosCoder hat ja ein beispiel gemacht mit 243|POSITION|51,321 ... in PaketForm wären das 9 Byte, nämlich 1 Byte für die MessageID 243 (-> Position Message) sowie 2x 4 byte für die 2 Ints 51 und 321. was man noch einfügen könnte wäre direkt nach der MessageID die PlayerID. Vorteil dieses Aufbaus: Man kann ein Select nehmen um das erste Byte zu checken und direkt darauf zu reagieren)

Dann funktionierts auch mit dem Onlinespass
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

The_Nici

BeitragFr, März 14, 2008 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke ChaosCoder und Dreamora, werds mir dann mal anschauen! Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group