Progger_X Mr. Lagg
 
  Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
  | 
		
			
				 Verfasst am: 28.12.2005, 21:41    Titel: Netzwerkübertragung die nicht funktioniert | 
				     | 
			 
			
				
  | 
			 
			
				Hallo!
 
 
Ich habe folgendes programmiert:
 
 
 	  | Code: | 	 		  '$INCLUDE: "SDL/SDL_NET.bi" 
 
DECLARE SUB Connect(socket AS tcpsocket,nummer) 
 
DECLARE SUB Net(BYVAL param AS integer)
 
OPTION EXPLICIT
 
TYPE schusstyp
 
    x AS integer
 
    y AS integer
 
    ex AS integer
 
    xr AS integer
 
    yr AS integer
 
END TYPE
 
TYPE spieler
 
    xpos AS integer
 
    ypos AS integer
 
    leben AS integer
 
    schuss(6) AS schusstyp
 
    schussnr AS integer
 
    xr AS integer
 
    yr AS integer
 
END TYPE
 
 
SCREEN 18,8,3,0 
 
DIM SHARED gamer(2) AS spieler
 
DIM SHARED gamer2(2) AS spieler
 
DIM SHARED sock AS tcpsocket
 
DIM SHARED gegi, nr
 
CALL connect(sock, nr)
 
IF nr=1 THEN gegi=2
 
IF nr=2 THEN gegi=1
 
gamer(1).xpos=10
 
gamer(1).ypos=10
 
gamer(2).xpos=400
 
gamer(2).ypos=400
 
gamer(1).leben=5
 
gamer(2).leben=5
 
DIM SHARED bg AS integer'Globale Variable: bereits geschossen
 
DIM e AS integer
 
DIM spielerzahl, zahler, x AS integer
 
DIM t#, t2#,vzeit#
 
DIM dummy$ 
 
e=0
 
t#=TIMER
 
t2#=TIMER
 
DIM SHARED muthandle AS integer
 
muthandle=MUTEXCREATE
 
DIM thread_nets AS integer
 
DIM thread_netc AS integer
 
'DIM dumdummy AS integer
 
'dumdummy=0
 
thread_nets=THREADCREATE(@Net, 0)
 
WHILE e=0
 
    MUTEXLOCK muthandle
 
    IF MULTIKEY(&h39) AND bg=0 THEN 
 
       FOR zahler=1 TO 5
 
          WITH gamer(nr).schuss(zahler)
 
           IF .ex<5 AND bg=0 THEN
 
               .ex=50
 
               .xr=gamer(nr).xr
 
               .yr=gamer(nr).yr
 
               .x=gamer(nr).xpos+gamer(nr).schuss(zahler).xr*2
 
               .y=gamer(nr).ypos+gamer(nr).schuss(zahler).yr*2
 
               gamer(nr).schussnr=zahler
 
               bg=bg+1
 
               EXIT FOR
 
            END IF
 
           END WITH
 
       NEXT
 
    END IF
 
    IF MULTIKEY(&h4B) AND gamer(nr).xr>-50 THEN 
 
       gamer(nr).xr=gamer(nr).xr-3
 
    ELSEIF MULTIKEY(&h4D) AND gamer(nr).xr<50 THEN 
 
       gamer(nr).xr=gamer(nr).xr+3
 
    END IF
 
    gamer(nr).xr=gamer(nr).xr*0.96
 
    IF MULTIKEY(&h48) AND gamer(nr).yr>-50 THEN 
 
       gamer(nr).yr=gamer(nr).yr-3
 
    ELSEIF MULTIKEY(&h50) AND gamer(nr).yr<50 THEN 
 
       gamer(nr).yr=gamer(nr).yr+3
 
    END IF
 
    gamer(nr).yr=gamer(nr).yr*0.96
 
    MUTEXUNLOCK muthandle
 
    vzeit#=TIMER-t2#
 
    t2#=TIMER
 
    MUTEXLOCK muthandle
 
    gamer(nr).xpos+=gamer(nr).xr*vzeit#*7
 
    gamer(nr).ypos+=gamer(nr).yr*vzeit#*7
 
    gamer(gegi).xpos+=gamer(gegi).xr*vzeit#*7
 
    gamer(gegi).ypos+=gamer(gegi).yr*vzeit#*7
 
    FOR x=1 TO 2
 
     FOR zahler=1 TO 5
 
      WITH gamer(x).schuss(zahler)
 
       IF .ex>0 THEN
 
        .x+=.xr*vzeit#*7
 
        .x+=.yr*vzeit#*7
 
        .ex-=vzeit#*ABS(.xr)
 
       END IF
 
      END WITH
 
     NEXT
 
    NEXT
 
    IF gamer(1).xpos<1 THEN gamer(1).xpos=1
 
    IF gamer(2).xpos<1 THEN gamer(2).xpos=1
 
    IF gamer(1).ypos<1 THEN gamer(1).ypos=1
 
    IF gamer(2).ypos<1 THEN gamer(2).ypos=1
 
    
 
    MUTEXUNLOCK muthandle
 
    IF MULTIKEY(&H01) THEN e=1
 
    dummy$=INKEY$
 
    
 
    SCREENLOCK
 
    CLS
 
    MUTEXLOCK muthandle
 
    
 
    PRINT "Punkte Spieler 1: "+STR$(gamer(1).leben)
 
    PRINT "Punkte Spieler 2: "+STR$(gamer(2).leben)
 
    PRINT gamer(1).schuss(1).ex
 
    CIRCLE (gamer(1).xpos, gamer(1).ypos),15,2,,,,F
 
    CIRCLE (gamer(2).xpos, gamer(2).ypos),15,3,,,,F
 
    FOR x=1 TO 2
 
      FOR zahler=1 TO 5
 
         WITH gamer(x).schuss(zahler)
 
          IF .ex>0 THEN
 
              LINE (.x, .y)-(.x+.xr,.y+.yr),1,,65535
 
              LINE (.x+1, .y)-(.x+1+.xr,.y+.yr),1,,65535
 
          END IF
 
         END WITH
 
      NEXT
 
     NEXT
 
    SCREENUNLOCK
 
    MUTEXUNLOCK MUTHANDLE
 
    SLEEP 10
 
WEND
 
 
CLS
 
MUTEXDESTROY muthandle
 
THREADWAIT thread_NETs
 
THREADWAIT thread_NETc
 
 
END
 
 
SUB Net(BYVAL param AS integer)
 
 DIM var1, var2, var3, var4, var5, var6, var7, var8, var9, varA AS integer
 
 DIM x, zahler,spielerzahl AS integer
 
 WHILE param=0
 
   MUTEXLOCK muthandle
 
   var1=gamer(nr).xpos
 
   var2=gamer(nr).ypos
 
   var3=gamer(nr).xr+100
 
   var4=gamer(nr).yr+100
 
   var5=bg
 
   IF var5<>0 THEN
 
       var9=gamer(nr).schussnr
 
       var6=gamer(nr).schuss(var9).x
 
       var7=gamer(nr).schuss(var9).y
 
       var8=gamer(nr).schuss(var9).xr+100'x Richtung Schuss zwischenspeicher
 
       varA=gamer(nr).schuss(var9).yr+100'y Richtung Schuss zwischenspeicher
 
   END IF
 
   bg=0
 
   MUTEXUNLOCK muthandle
 
   SDLNet_TCP_Send(sock, @var1, LEN(var1) )
 
   SDLNet_TCP_Send(sock, @var2, LEN(var2) )
 
   SDLNet_TCP_Send(sock, @var3, LEN(var3) )
 
   SDLNet_TCP_Send(sock, @var4, LEN(var4) )
 
   SDLNet_TCP_Send(sock, @var5, LEN(var5) )
 
   IF var5<>0 THEN
 
       SDLNet_TCP_Send(sock, @var6, LEN(var6) )
 
       SDLNet_TCP_Send(sock, @var7, LEN(var7) )
 
       SDLNet_TCP_Send(sock, @var8, LEN(var8) )
 
       SDLNET_TCP_Send(sock, @var9, LEN(var9) )
 
       SDLNet_TCP_Send(sock, @varA, LEN(varA) )
 
   END IF
 
   var1=0:var2=0:var3=0:var4=0:var5=0:var6=0:var7=0:var8=0:var9=0:varA=0
 
   SDLNet_TCP_Recv(sock, @var1, LEN(var1) )
 
   SDLNet_TCP_Recv(sock, @var2, LEN(var2) )
 
   SDLNet_TCP_Recv(sock, @var3, LEN(var3) )
 
   SDLNet_TCP_Recv(sock, @var4, LEN(var4) )
 
   SDLNet_TCP_Recv(sock, @var5, LEN(var5) )
 
   IF var5<>0 THEN 
 
      SDLNet_TCP_Recv(sock, @var6, LEN(var6) )
 
      SDLNet_TCP_Recv(sock, @var7, LEN(var7) )
 
      SDLNet_TCP_Recv(sock, @var8, LEN(var8) )
 
      SDLNet_TCP_Recv(sock, @var9, LEN(var9) )
 
      SDLNet_TCP_Recv(sock, @varA, LEN(varA) )
 
   END IF
 
   MUTEXLOCK muthandle
 
   IF var5<>0 THEN
 
      gamer(gegi).schussnr=var9
 
      gamer(gegi).schuss(var9).ex=20
 
      gamer(gegi).schuss(var9).x=var6
 
      gamer(gegi).schuss(var9).y=var7
 
      gamer(gegi).schuss(var9).xr=var8-100
 
      gamer(gegi).schuss(var9).yr=varA-100
 
   END IF
 
   gamer(gegi).xpos=var1
 
   gamer(gegi).ypos=var2
 
   gamer(gegi).xr=var3-100
 
   gamer(gegi).yr=var4-100
 
   FOR x=1 TO 2
 
    FOR zahler=1 TO 5
 
     WITH gamer(x).schuss(zahler)
 
      IF .ex>0 THEN
 
        FOR spielerzahl=1 TO 2
 
         IF ABS(.x-gamer(spielerzahl).xpos)<20 AND ABS(.y-gamer(spielerzahl).ypos)<20 THEN
 
          gamer(spielerzahl).leben=gamer(spielerzahl).leben-1
 
          .ex=0
 
         END IF
 
        NEXT
 
      END IF
 
     END WITH
 
    NEXT
 
   NEXT
 
   MUTEXUNLOCK muthandle
 
   SLEEP 100
 
 WEND
 
END SUB
 
 
SUB Connect(socket as tcpsocket,nummer) 
 
 DIM dummy AS string
 
 IF SDLNet_Init() <> 0 THEN  
 
     PRINT "Fehler" 
 
     SLEEP 
 
     END 
 
 END IF 
 
 PRINT "Made by DGR!"
 
 PRINT "1-Server" 
 
 PRINT "2-Client" 
 
 DO 
 
     dummy$=INKEY$ 
 
     nummer=VAL(dummy$) 
 
     IF dummy$=CHR$(27) THEN END
 
 LOOP UNTIL nummer=1 OR nummer=2 
 
 DIM sock AS tcpsocket'Socket einstellen 
 
 DIM sockclient AS tcpsocket 
 
 DIM ip AS ipaddress'Variable IP vom Typ IP Addresse 
 
 DIM zahler AS integer
 
 IF nummer=1 THEN  
 
    'SDLNet_Write32( INADDR_ANY, @ip.host ) 
 
    'SDLNet_Write16( 5678, @ip.port ) 
 
    SDLNet_ResolveHost(@ip.host, NULL, 5678)
 
    sock = SDLNet_TCP_Open( @ip )'TCP Verbindung öffnen, in den Socket schreiben 
 
    zahler=1 
 
    PRINT "Warte auf Client..." 
 
    WHILE sockclient = NULL 
 
       IF INKEY$=CHR$(27) THEN END
 
       sockclient = SDLNet_TCP_Accept( sock ) 
 
       SLEEP 5
 
    WEND
 
 END IF
 
 IF nummer=2 THEN
 
    DIM host AS string
 
    INPUT "IP Addresse des Hostes: ", host$
 
    SDLNet_ResolveHost( @ip, host$, 5678 )
 
    sockclient = SDLNet_TCP_Open( @ip )
 
 END IF
 
 socket=sockclient
 
END SUB | 	  
 
 
Leider konnte mit den Threads mein Problem nicht beseitigt werden: das bei unterschiedlichen Spielern unterschiedliche Daten vorhanden sind.   Kann mir jemand sagen, wie ich den Code verändern muss, damit bei beiden Spielern die gleichen Daten vorhanden sind?
 
 
Ein zweites Problem sind die Schüsse, sie fliegen recht komisch, und außerdem fliegen sie nicht richtig. Eigentlich hatte ich mir gedacht, das sie immer in die Richtung fliegen, in die die Kugel auch fliegt. Leider funktioniert das nach unten links sehr schwer. Kann mir jemand sagen, was dort falsch ist? | 
			 
		  |