mein netzwerk spiel

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

MrJoney

Betreff: mein netzwerk spiel

BeitragSo, Okt 21, 2007 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo ich habe ein problemm ich habe ein kelines probespeil gebaut in dem mann mit einer figur in einem risigen raum durch die gegend sich bewegt

damm habe ich ein netzwerk spiel daraus geschriebn dan einigen code schnipseln die ich so hir udn da fand 8) funktionirt ganz gut soweit

jetzt habe ich es geschaft beim hosten das der host sich 1 von 2 maps laden kann aber wie kann ihc dem client sagen das der host die map gewält hat und der client dann auch die map gewählt hat ? könnt ihr mir mall bitte da wieter helfen

hir mein code 8) mehr oder wenniger
Code: [AUSKLAPPEN]

loca = Input("Local Game?(1 - Yes,0 - No) ")
host = Input("Hosting Or Joining:(0 = Join,1 = Host) ")
If host = 0 And loca  = 0
ip$ = Input("Select IP: ")
port = Input("Select Port: ")
ElseIf host = 0 And loca = 1
port = Input("Select Port: ")
ip = ""
ElseIf host = 1 And loca = 0
ip = ""
port = 80
ElseIf host = 1 And loca = 1
ip = ""
port = 80
EndIf

Include "nb.bb"
Global mainstream = startnbgame(port)
If mainstream = 0 Then RuntimeError("Port Occupied") : End

name$ = Input("Enter Name: ")

Graphics3D 800,600,0,2

If host = 1
Print "Welchen Spiel Modus möchtest du Spielen "
modus = Input("1 - Arena,2 - Derby,3 - Rennen) ")
EndIf

If modus = 1
Print "Welchen Level möchtest du ? "
Print "Arena 1 = 1 ,Arena 2 = 2,Arena 3 = 3 "
map = Input("Level nummer")
Print "Wieviel Zeit möchtest du  ? "
Print "10min = 1,20min = 2,30min = 3"
zeit = Input("zeit")
EndIf

If modus = 2
Print "Welchen Level möchtest du ? "
Print "Derby 1 = 1 ,Derby 2 = 2,Derby3 = 3,Derby4 =4,Derby5 = 5"
map1 = Input("Level nummer")
Print "Wieviel Zeit möchtest du  ? "
Print "endlos = 0,10min = 1,20min = 2,30min = 3"
zeit = Input("zeit")
EndIf

If modus = 3
Print "Welchen Level möchtest du ? "
Print "Rennen 1 = 1 ,Rennen 2 = 2,
map2 = Input("Level nummer")
Print "Wieviel Runden willst du ? "
Print "1 = 1,2 = 2,3 = 3,4 = 4,5 = 5,6 = 6
Runden = Input("Runden")
EndIf

Print "Welchen Fahrzeug möchtes du wählen"
auto = Input("1 - Buggy,2 - Motorad,3 - Panzer,4 - LKW) ")


If map = 1
level = LoadMesh("boden.b3d")
EntityFX level,1 : MoveEntity level,-120,-3,300 : ScaleMesh level,8,8,8
CreateLight()
EndIf

If map = 2
level = LoadMesh("boden1.b3d")
EntityFX level,1 : MoveEntity level,-120,-3,300 : ScaleMesh level,8,8,8
CreateLight()
EndIf

If map = 3
level = LoadMesh("boden2.b3d")
EntityFX level,1 : MoveEntity level,-120,-3,300 : ScaleMesh level,8,8,8
CreateLight()
EndIf

If map1 = 1
level = LoadMesh("boden.b3d")
EntityFX level,1 : MoveEntity level,-120,-3,300 : ScaleMesh level,8,8,8
CreateLight()
EndIf

If map1 = 2
level = LoadMesh("boden1.b3d")
EntityFX level,1 : MoveEntity level,-120,-3,300 : ScaleMesh level,8,8,8
CreateLight()
EndIf

If map1 = 3
level = LoadMesh("boden2.b3d")
EntityFX level,1 : MoveEntity level,-120,-3,300 : ScaleMesh level,8,8,8
CreateLight()
EndIf

If map1 = 4
level = LoadMesh("boden.b3d")
EntityFX level,1 : MoveEntity level,-120,-3,300 : ScaleMesh level,8,8,8
CreateLight()
EndIf

If map1 = 5
level = LoadMesh("boden1.b3d")
EntityFX level,1 : MoveEntity level,-120,-3,300 : ScaleMesh level,8,8,8
CreateLight()
EndIf

If map2 = 1
level = LoadMesh("boden.b3d")
EntityFX level,1 : MoveEntity level,-120,-3,300 : ScaleMesh level,8,8,8
CreateLight()
EndIf

If map2 = 2
level = LoadMesh("boden1.b3d")
EntityFX level,1 : MoveEntity level,-120,-3,300 : ScaleMesh level,8,8,8
CreateLight()
EndIf


und die nb.bb
Code: [AUSKLAPPEN]
 Type nbplayer
Field name$,id$
Field host,ip,port
End Type

Global serverip,nbmessage$,nbname$,serverport,nbuserid$

Function StartNBGame(port=80)
c = CreateUDPStream(port)
dport = UDPStreamPort(c)
If dport <> port Then CloseUDPStream(c):c = 0
DebugLog "Created New NetBlitz Game"
Return c
End Function

Function CreateNBPlayer$(name$,sip$,udpstream,hosting=0)
DebugLog "Created NetBlitz Player: "+name
go = CountHostIPs(sip)
ip = HostIP(1)
nbname = name
n.nbplayer = New nbplayer
n\name = name:n\port=nbgameport(udpstream)
If hosting = 1
serverip = ip:n\host= 1
serverport = nbgameport(udpstream)
EndIf
If hosting = 0
serverip = ip
WriteString(udpstream,"100:"+name)
SendUDPMsg(udpstream,ip,80)
;Delay 1000
CheckNBDataBase(udpstream,0)
EndIf
CountHostIPs("")
n\id= converttoid(HostIP(1),nbgameport(udpstream))
n\ip=HostIP(1)
nbuserid = converttoid(HostIP(1),nbgameport(udpstream))
Return nbuserid
End Function

Function DeleteNBPlayer(udpstream)
DebugLog "Deleted NetBlitz Player"
For i.nbplayer = Each nbplayer
If i\id <> nbuserid
WriteString(udpstream,"101:")
SendUDPMsg(udpstream,i\ip,i\port)
EndIf
Next
End Function

Function StopNBGame(udpstream)
DebugLog "NetBlitz Game Stopped"
CloseUDPStream(udpstream)
End Function

Function NBPlayerName$(id$)
For n.nbplayer= Each nbplayer
If n\id = id Then Return n\name
Next
End Function

Function NBPlayerLocal(ip)
CountHostIPs("")
If HostIP(1) = ip
Return 1
Else
Return HostIP(1)
EndIf
End Function

Function RecvNBMsg(udpstream,readm=1)
g = RecvUDPMsg(udpstream)
If g <> 0
DebugLog "Recieved NetBlitz Message"
If readm = 1
nbmessage = ReadString(udpstream)
EndIf
Return 1
EndIf
Return 0
End Function

Function NBMsgType(udpstream)
typ = Left(nbmessage,3)
Return typ
End Function

Function NBMsgFrom$(udpstream)
ip = UDPMsgIP(udpstream)
port = UDPMsgPort(udpstream)
tempid$=converttoid(ip,port)
For n.nbplayer = Each nbplayer
If n\id = tempid Then Return n\id
Next
End Function

Function NBMsgData$(udpstream)
msg$ = nbmessage
index=Instr( msg,":" )
msg = Mid(msg$,index+1)
Return msg
End Function

Function SendNBMsg(typ,msg$,idto$,udpstream)
If idto = 0
For i.nbplayer = Each nbplayer
If i\id <> nbuserid
WriteString(udpstream,typ+":"+msg)
SendUDPMsg(udpstream,i\ip,i\port)
EndIf
Next
Else
For i.nbplayer = Each nbplayer
If i\id = idto
WriteString(udpstream,typ+":"+msg)
SendUDPMsg(udpstream,i\ip,i\port)
EndIf
Next
EndIf
DebugLog "Sent Message: "+msg
End Function

;Extra NetBlitz Commands To Make The Internet Easier
Function NBMsgTimeOut(milliseconds)
UDPTimeouts(milliseconds)
End Function

Function WriteNBString(typ,texts$,udpstream)
WriteString(udpstream,typ+":"+texts)
End Function

Function SendNBPacket(idto$,udpstream)
If idto = 0
For i.nbplayer = Each nbplayer
If i\id <> nbuserid
SendUDPMsg(udpstream,i\ip,i\port)
EndIf
Next
Else
For i.nbplayer = Each nbplayer
If i\id = idto
SendUDPMsg(udpstream,i\ip,i\port)
EndIf
Next
EndIf
DebugLog "Sent Message Packet"
End Function

Function NBCopyPacket(udpstream,deststream,buffer)
CopyStream udpstream,deststream,buffer
End Function

Function CheckNBDatabase(udpstream,msgtype=1)
If msgtype = 0
time = MilliSecs()
Repeat
x = recvnbmsg(udpstream,1)
If x > 0
If nbmsgtype(udpstream) <> 102
x = 0
EndIf
EndIf
If MilliSecs() - time > 10000
RuntimeError "Timeout Error"+Chr(10)+"Could Not Connect To Server"
EndIf
Until x > 0
If nbmsgtype(udpstream) = 102
serverport = nbmsgport(udpstream)
serverip = nbmsgip(udpstream)
;i.nbplayer = New nbplayer
;i\ip = nbmsgfrom(udpstream)
;i\port = nbmsgport(udpstream)
;readnbpacket(udpstream)
;i\name = nbmsgdata(udpstream)
;i\id = Int(Str$(serverip)+Str$(serverport))
serverid$=converttoid(serverip,serverport)

n.nbplayer = New nbplayer
n\name = nbmsgdata(udpstream)
n\ip = ReadInt(udpstream)
n\port = ReadInt(udpstream)
n\id = converttoid(n\ip,n\port)
While Not Eof(udpstream)
n.nbplayer = New nbplayer
msg$ = ReadString(udpstream)
index=Instr( msg,":" )
msg = Mid(msg$,index+1)
n\name = msg
n\ip = ReadInt(udpstream)
n\port = ReadInt(udpstream)
n\id = converttoid(n\ip,n\port)
Wend

For i.nbplayer = Each nbplayer
If i\id = serverid Then i\host=1 : Exit
Next

For n.nbplayer = Each nbplayer
If n\host = 0 And n\id <> nbuserid
WriteString(udpstream,"100:"+nbname)
SendUDPMsg(udpstream,n\ip,n\port)
EndIf
Next

DebugLog countnbplayers()+" Playing"
Return 1
EndIf
ElseIf msgtype = 1
;WriteString(udpstream,"102:TempMessage")
;WriteString(udpstream,"102:"+nbplayerlocal()) Experimenting
;WriteString(udpstream,"102:"+nbname)
;WriteString(udpstream,"102:"+nbgameport(udpstream))
For i.nbplayer = Each nbplayer
WriteString(udpstream,"102:"+i\name)
WriteInt(udpstream,i\ip)
WriteInt(udpstream,i\port)
Next
i.nbplayer = New nbplayer
i\name = nbmsgdata(udpstream)
i\ip = nbmsgip(udpstream)
i\port = nbmsgport(udpstream)
i\id = converttoid(i\ip,i\port)
sendnbpacket(i\id,udpstream)
Return 1
EndIf
End Function

Function CountNBPlayers()
For i.nbplayer = Each nbplayer
bcount = bcount + 1
Next
Return bcount
End Function

Function ReadNBPacket(udpstream)
nbmessage = ReadString(udpstream)
Return nbmessage
End Function

Function NBGamePort(udpstream)
port = UDPStreamPort(udpstream)
Return port
End Function

Function NBMsgPort(udpstream)
port = UDPMsgPort(udpstream)
Return port
End Function

Function NBMsgIP(udpstream)
ip = UDPMsgIP(udpstream)
Return ip
End Function

Function CheckAvailPorts()
For br = 1 To 10000
c = CreateUDPStream(br)
If c <> 0
Exit
EndIf
Next
CloseUDPStream(c)
Return br
End Function

Function NBPlayerPort(id$)
For i.nbplayer = Each nbplayer
If i\id = id
Return i\port
EndIf
Next
End Function

Function NBPlayerIP(id$)
For i.nbplayer = Each nbplayer
If i\id = id
Return i\ip
EndIf
Next
End Function

Function ConvertToID$(ip,port)
s$ = Str$(ip)+"-"+Str$(port)
Return s
End Function
 

DerSatan

Gast

BeitragSo, Okt 21, 2007 22:07
Antworten mit Zitat
So ich habe eine Idee: der client schickt eine Anfrage nach spieldaten (kann ja irgendein wert u. typ von variable sein, sollte sich nur nicht mit anderen überschneiden). Der Host checkt in jedem Hauptschleifendurchlauf ob so eine Message angekommen ist und schickt dann seinerseits eine Message mit allen Infos zum laufenden Spiel (also Level, art des spiels usw...). Der Client lädt darauf die passenden meshes.

Meoqan

Betreff: mein vorschlag:

BeitragMo, Okt 22, 2007 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi! ich programiere zurzeit selber ein netzwerk spiel und habe das so gelöst:

der server läuft und checkt jedes mal ob eine nachricht vorhanden ist und wertet diese dann aus:


Code: [AUSKLAPPEN]

   ; nachrichten abrufen!
   If  RecvUDPMsg(udp_in)<>0 Then
      While Not Eof(udp_in)
         nachricht$=ReadLine$(udp_in)
         udip$=UDPMsgIP(udp_in)
         dip$=DottedIP$(udip$)
         ip=INT_IP(dip$)
         port=UDPMsgPort(udp_in)
         port=Int(port)-1
         g=0


;LOGIN ABARBEITEN
         If Left$(nachricht$,6)="&LOGIN" Then ;wichtig die zahl entspricht der zahl der buchtaben des befehls
            ergebnis2$=Right$(nachricht$,Len(nachricht$)-6)  ; und hier auch
            pos=Instr(ergebnis2$,"!") ;das trenn zeichen ist ! und kann geändert werden
            name$=Right$(ergebnis2$,Len(ergebnis2$)-pos)
            passw$=Left$(ergebnis2$,pos-1)
            Print "LOGON: NEW - IP: "+dip$+":"+port+" NAME: "+name$
            g=1
            l=1
               For player.Player = Each Player
                  If name$=player\system\name$ And passw$=player\system\passw$ Then
                     l=0
                     player\system\activ=6
                     player\system\ip=ip
                     player\system\port=port            
                     WriteLine udp_out,"&LOGINRIGHT"
                     SendUDPMsg udp_out,player\system\ip,player\system\port
                     Exit
                  EndIf
               Next
               If l=1 Then
            WriteLine udp_out,"&LOGINFAIL"
            SendUDPMsg udp_out,ip,port
            EndIf
         EndIf
         ;LOGIN ENDE

      ;nachrichten abrufen ende   
      Wend
   EndIf


die nachricht wäre: &LOGINname!passwort


die nachrichten werden abgerufen und solange nicht Eof erreicht wird verarbeitet. so könnte man folgenden aufbaunehmen:
WriteLine udp_out,"&LOGIN"+name$+"!"+passw$
WriteLine udp_out,"&GET"
SendUDPMsg udp_out,ip,port

so könnte man auch in einem rutsch alle spiel wichtigen daten übertragen:
WriteLine udp_out,"&MAP"+mapname$+"!"+playeronmap$
WriteLine udp_out,"&PLAYER"+playername$+"!"+playerID+"!"+playerX+"!"+playerY+"!"+playerZ+"!"+playerscore
SendUDPMsg udp_out,ip,port

nun ich hab einen code geschrieben dan man dan einfach in die schleife reinkopieren kann und dieser unterstützt bis zu 20 Variablen in einer nachricht, getrennt durch ein ! (das änderbar ist):

Code: [AUSKLAPPEN]



Dim inna$(20)
Dim anna$(20)

nachricht$="%BEFEHL"+"test1"+"!"+"test2"+"!"+"test3"+"!"+"test4"+"!"+"test5"+"!"+"test6"


               If Left$(nachricht$,7)="%BEFEHL" Then
                  g=1
                  inna(0)=Right$(nachricht$,Len(nachricht$)-7)
                  uno=-1
                  Repeat
                  uno=uno+1
                  pos=Instr(inna$(uno),"!")
                  inna$(uno+1)=Right$(inna$(uno),Len(inna$(uno))-pos)
                  anna$(uno)=Left$(inna$(uno),pos-1)
                  Until Not Instr(inna$(uno+1),"!")
                  name5$=inna$(uno+1)
                  ;int(): xxx=anna$(0) : xxx=anna$(1) :...: NAME5$  ist der letzte wert
                  For e=0 To 20
                     Print anna$(e)
                  Next
                  Print name5$
               EndIf
               
               WaitKey()



ich hoffe das bringt dich weiter...

MrJoney

BeitragMo, Okt 22, 2007 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
hi vielen dank ich teste es sofort aus

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group