Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 28.12.2005, 22: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? |
|