MAV bei ReadString()

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

ToeB

Betreff: MAV bei ReadString()

BeitragMi, März 12, 2008 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bekomme bei meinem programm immer einen MAV (beim Joinen..)
Code: [AUSKLAPPEN]
Graphics 800,600,16,1
SetBuffer BackBuffer()

Global p_anz = 5
Global Port = 8000
Global max_p

Dim name$(p_anz) ;Name der Spieler
Dim IP(p_anz)    ;IP der Spieler
Dim acc(p_anz)    ;Ob eingeklinkt
Dim acc2(p_anz)    ;ob Bereit
Dim ch$(p_anz)   ;Chat der Spieler

Dim txt$(5)
Dim txtCol$(5)

Dim cl$(30)
Dim cc$(30)

For i = 1 To 5:Read txt(i):Next
For i = 1 To 5:Read txtcol(i):Next

Global stream = CreateUDPStream(Port)
Global send_ms = MilliSecs()
Global ID = 1,server
Global G,Chat$

;Global loop = LoadSound("amiga_deluxe.mp3"):LoopSound loop
;Global Channel = PlaySound(loop)

Print "Name ?"
name_$ = Input(">")
If name_ = "" Then name_ = "[NoName]"

Print "HOST (1) oder JOIN (2) ?"
Repeat
Server = Input(">")
Until Server > 0 And Server < 3

If Server = 2 Then
   Print "IP des Hosts ?"
   IP(1) = INT_IP(Input(">"))
   WriteByte(stream,2)
   WriteString(stream,name_)
   SendUDPMsg(stream,IP(1),Port)
   msms = MilliSecs()
   Print "Verbinde..."
   Repeat
   If RecvUDPMsg(stream)
      byte = ReadByte(stream)
      If byte = 2
         ID = ReadInt(stream)
         name(1) = ReadString(stream)
         name(ID) = name_
         acc(ID) = 1
         acc(1) = 1
         Exit   
      ElseIf byte = 3
         Print "Kein Platz mehr vorhanden in der Server-Liste !"
         Print "Beende..."
         Delay 2000
         End
      EndIf    
   EndIf
   If msms <= MilliSecs() - 10000 Then
      Print "Konnte keine Verbindung zum angegebenen Server errichten !"
      Print "Programm wird beendet..."
      Delay 2000
      End
   EndIf
   Forever   
ElseIf Server = 1
   name(1) = name_
   acc(1) = 1
EndIf

FlushKeys()

Repeat
   If Server = 1 And ID > 1
      Bereit_ = 0
      anzz = 0
      For i = 1 To p_anz
         If acc(i) = 1 Then anzz = anzz + 1
      Next
      For i = 1 To anzz
         If acc2(i) = 1 Then Bereit_ = Bereit_ + 1
      Next
      If Bereit_ = anzz Then Bereit = 1 Else Bereit = 0
      If Bereit = 1 Then
         Color 255,255,255:Rect 550,30,200,40,0:Text 650,42,"Spiel Starten",1
         If RectsOverlap(MouseX(),MouseY(),1,1,550,30,200,40) Then
            Color 255,0,0:Rect 552,32,196,36,0:Text 650,42,"Spiel Starten",1
            If MouseDown(1) Then
               For i = 2 To p_anz
                  If acc(i) = 1 Then
                     WriteByte(stream,4)
                     SendUDPMsg(stream,IP(i),Port)
                  EndIf
               Next
               Bereit2 = 1
            EndIf
         EndIf
      EndIf
   EndIf
   Color 100,100,100:Rect 100,150,400,400:Rect 100,560,400,20
   Color 255,255,255:Rect 100,150,400,400,0:Rect 100,560,400,20,0
   Color 255,255,255:Text 100,10,"NAME":Text 380,10,"STATUS"
   For i = 1 To 30
      If cl$(i) <> ""
         SetColor(cc$(i))
         Text 102,139+i*13,cl$(i)
      EndIf
   Next
   G = GetKey()
   If g <> 0 And g <> 13 And g <> 8 Then Chat$ = Chat$ + Chr(g)
   If g = 8 Or StringWidth(Chat$) > 396 Then Chat$ = Mid(Chat$,1,Len(Chat$)-1)
    Color 255,255,255:Text 102,563,Chat$:Rect 103+StringWidth(Chat$),563,1,13
   If g = 13 Then
      If Chat$ <> ""
         time$ = Left(CurrentTime(),5)
         If Server = 1
            SetChat("255,0,0","["+name(1)+"/"+Time$+"]")
            SetChat("255,255,255",Chat$)
            tmpc$ = Chat$
            Ch(1) = Chat$
            Chat$ = ""
         Else
            SetChat("0,0,255","["+name(ID)+"/"+Time$+"] :")
            SetChat("255,255,255",Chat$)
            ch(ID) = Chat$
            Chat$ = ""
         EndIf
      Else
         Chat$ = ""
      EndIf
   EndIf
   For i = 1 To p_anz
      Color 100,100,100:Rect 100,10+i*20,400,20
      Color 0,0,0:Rect 100,10+i*20,400,2
      If acc(i)
         SetText(110,14+i*20,1,name(i))
         If acc2(i) Then
            SetText(435,14+i*20,4,"",1)
         Else
            SetText(435,14+i*20,5,"",1)
         EndIf
      Else
         SetText(110,14+i*20,2)
         SetText(435,14+i*20,3,"",1)
      EndIf
   Next
   Color 0,0,0:Rect 370,10,2,20+p_anz*20
   If Server = 1 Then
      If send_ms <= MilliSecs() - 100 And ID > 1 Then
         For i = 2 To p_anz
            If acc(i) = 1 Then
               WriteByte(stream,1)
               For j = 1 To p_anz
                  If acc(j) = 1 And i<>j Then
                     WriteInt(stream,j)
                     WriteString(stream,name(j))
                     WriteByte(stream,acc2(j))
                     WriteString(stream,ch(j))
                  EndIf
               Next
               SendUDPMsg(stream,IP(i),Port)
            EndIf
         Next
         send_ms = MilliSecs()
      EndIf
      If RecvUDPMsg(stream)
         Select ReadByte(stream)
         Case 1
            ID = ReadInt(stream)
            name(ID) = ReadString(stream)
            acc2(ID) = ReadByte(stream)
            strr$ = ReadString(stream)
            If strr$ <> ch(ID) Then
               ch(ID) = strr
               time$ = Left(CurrentTime(),5)
               SetChat("0,0,255","["+name(ID)+"/"+Time$+"] :")
               SetChat("255,255,255",ch(ID))
            EndIf
         Case 2
            ID = ID + 1
            If ID <= p_anz Then
               name(ID) = ReadString(stream)
               IP(ID) = UDPMsgIP(stream)
               WriteByte(stream,2)
               WriteInt(stream,ID)
               WriteString(stream,name(1))   
               SendUDPMsg(stream,IP(ID),Port)
               acc(ID) = 1
            Else
               IPIP =UDPMsgIP(stream)
               WriteByte(stream,3)
               SendUDPMsg(stream,IPIP,Port)
            EndIf
         End Select
      EndIf
   ElseIf server = 2
      If RecvUDPMsg(stream) Then
         Select ReadByte(stream)
         Case 1
            For i = 1 To p_anz
               IDID = ReadInt(stream)
               name(IDID) = ReadString(stream)
               acc2(IDID) = ReadByte(stream)
               strr$ = ReadString(stream)
               If strr$ <> ch(IDID) Then      
                  ch(IDID) = strr$
                  time$ = Left(CurrentTime(),5)
                  If IDID = 1
                     SetChat("255,0,0","["+name(1)+"/"+Time$+"] :")
                  Else
                     SetChat("0,0,255","["+name(IDID)+"/"+Time$+"] :")
                  EndIf
                  SetChat("255,255,255",ch(IDID))
               EndIf 
               acc(IDID) = 1
            Next
            WriteByte(stream,1)
            WriteInt(stream,ID)
            WriteString(stream,name(ID))
            WriteByte(stream,acc2(ID))
            WriteString(stream,ch(ID))
            SendUDPMsg(stream,IP(1),Port)
         Case 4
            Bereit2 = 1
         End Select
      EndIf       
   EndIf
   If server = 1 Then       
      If RectsOverlap(MouseX(),MouseY(),1,1,370,30,130,20) Then
         Color 255,255,255:Rect 371,31,130,20,0
         If MouseHit(1) Then acc2(1) = 1 - acc2(1)
      EndIf
   ElseIf Server = 2
      If RectsOverlap(MouseX(),MouseY(),1,1,370,10+ID*20,130,20) Then
         Color 255,255,255:Rect 371,11+ID*20,130,20,0
         If MouseHit(1) Then acc2(ID) = 1 - acc2(ID)
      EndIf
   EndIf
   If KeyHit(1) Then End
   Color 255,255,0:Oval MouseX()-10,MouseY()-10,20,20,0:Plot MouseX(),MouseY()
   Flip
   Cls
Until Bereit2 = 1

ms = MilliSecs()
cd = 5000

Repeat
   Text 400,1,"Spielvorbereitung...",1
   Text 400,300,((cd - (MilliSecs()-ms))/1000),1,1
   Flip
   Cls
Until ms <= MilliSecs() - cd
FlushKeys()
;####################################################################################################################
;################################################### GAME ###########################################################
;####################################################################################################################

Repeat
   Text 1,1,"Hier soll einmal das Spiel enstehen..."
   Flip
   Cls
Until KeyHit(1)
End

Function SetChat(tc$,tt$)
   If tt$ <> ""
      c = 0
      For i = 1 To 30
         If cl(i) = "" Then
            c = 1
            cl(i) = tt$
            cc(i) = tc$
            Exit
         EndIf
      Next
      If c = 0
         For i = 1 To 29
            cl(i) = cl(i+1)
            cc(i) = cc(i+1)
         Next
         cl(30) = tt$
         cc(30) = tc$
      EndIf
   EndIf
End Function
   

Function SetColor(ColorString$)
Local r,g,b
r = Int(Mid(ColorString$,1,Instr(ColorString$,",")-1)):ColorString$=Mid(ColorString,Instr(ColorString$,",")+1,12)
g = Int(Mid(ColorString$,1,Instr(ColorString$,",")-1)):ColorString$=Mid(ColorString,Instr(ColorString$,",")+1,12)
b = Int(Mid(ColorString$,1,Instr(ColorString$,",")-1)):ColorString$=Mid(ColorString,Instr(ColorString$,",")+1,12)
Color r,g,b
End Function

Function SetText(x,y,num,Text$="",xmid=0,ymid=0)
SetColor(txtCol(num))
If Text$ = ""
Text x,y,txt(num),xmid,ymid
Else
Text x,y,Text$,xmid,ymid
EndIf
End Function

Function INT_IP(IP$)
   If Instr(IP$,".") <> 0 a1=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
   If Instr(IP$,".") <> 0 a2=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
   If Instr(IP$,".") <> 0 a3=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
   a4=Int(IP$)
   Return (a1 Shl 24) + (a2 Shl 16) + (a3 Shl 8 ) +a4
End Function


Data "","[LEER]","[X]","[BEREIT]","[NICHT BEREIT]"
Data "255,255,255","150,150,150","150,150,150","0,255,0","255,0,0"


Hier kommt er :

Debug hat Folgendes geschrieben:
Code: [AUSKLAPPEN]
If RecvUDPMsg(stream)
      byte = ReadByte(stream)
      If byte = 2
         ID = ReadInt(stream)
         name(1) = ReadString(stream) ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
         name(ID) = name_
         acc(ID) = 1
         acc(1) = 1
         Exit   
      ElseIf byte = 3
         Print "Kein Platz mehr vorhanden in der Server-Liste !"
         Print "Beende..."
         Delay 2000
         End
      EndIf    
   EndIf


Also es liegt wirklich am ReadString(stream).... Warum funzt das nicht ? Ich blick da net mehr durch...

thx und 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!

Silver_Knee

BeitragMi, März 12, 2008 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
mach mal den debugger an damit ne gescheite fehlermeldung kommt.... und auf den ersten blick würd' ich sagen: Stream ist alle und du liest übers ende.

ToeB

BeitragDo, März 13, 2008 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm... Hab ich nicht geschrieben "Debug hat Folgendes geschrieben:" ?

Nein, falls du dir den code mal angeguckt hasst, schikt der Server immer erst einen Byte (2) dann die ID und dann den Namen...

[EDIT] Sry, ich habe grad gemerkt, das die IP des anderen Rechners gar nicht mehr stimmte, seit ich die mal ausversehen vertauscht hatte. Also hatter jetzt der HOST stat 192.168.10.2 jetzt 192.168.10.3 und dadurch konnten dann auch keine Nachrichten mehr empfangen werden Embarassed

Deshalb war deine Vermutungschon sehr richtig, Silver_Knee, deshalb danke Wink

[/EDIT]

thx und mfg Crack93

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group