Prob Mit Direct PLay

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

xXThunderXx

Betreff: Prob Mit Direct PLay

BeitragMo, Apr 06, 2009 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ich hab mich ma an netztwerk usw drangesetzt jedoch hab ich jetzt ein Problem. Ich übergebe X und y koordinaten und Leben aber die vermischen sich irgent wie mit einander. Ich weis nicht warum Hab schon alles versucht ich hoffe ihr könnte mir da helfe.


Code: [AUSKLAPPEN]

Type figur

   Field leben
   Field x
   Field y
End Type

Dim figurf.figur(2)

For i = 0 To 2
   figurf(i) = New figur
Next









Graphics 800,600,16,2
SetBuffer BackBuffer()

hbild = LoadImage (".\Figuren\Hgrund.PNG")
figur = LoadImage (".\Figuren\Harry05.BMP")

MaskImage hbild,255,255,255
DrawImage hbild,0,0

Print "Für host 1"
Print "für client 2"

wahl = Input(" ")
svrname$ = Input("Servername: ")
 If wahl = 2 Then  ip$ = "127.0.0.1"
 If wahl = 1 Then  spiel = HostNetGame(svrname$)
 If wahl = 2 Then  spiel = JoinNetGame(svrname$,ip$)

If spiel = 1 Then Print "Du bist Spiel " + svrname$ + " Beigetreten."
If spiel = 2 Then Print "Du bist host"
If spiel = 0 Then Print "probleme mit verbindung"

spieler$ = Input("dein name bitte: ")
spielernr = CreateNetPlayer(spieler$)

If RecvNetMsg() = 1 Then position$ = NetMsgData$()
If RecvNetMsg() = 1 Then gegner_leben$ = NetMsgData$()

For i = 0 To 1
   figurf(i)\leben = 100
   figurf(i)\x = 0
   figurf(i)\y = 0
Next


Repeat


Cls
MaskImage hbild,255,255,255
DrawImage hbild,0,0

If KeyDown(200) Then figurf(0)\y = figurf(0)\y - 10
If KeyDown(208) Then figurf(0)\y = figurf(0)\y + 10
If KeyDown(205) Then figurf(0)\x = figurf(0)\x + 10
If KeyDown(203) Then figurf(0)\x = figurf(0)\x - 10
If ImagesOverlap(figur,figurf(1)\x,figurf(1)\y,figur,figurf(0)\x,figurf(0)\y) And KeyHit(57) Then figurf(1)\leben = figurf(1)\leben - 10
If figurf(0)\x <= 0 Then figurf(0)\x = 0
If figurf(0)\y <= 0 Then figurf(0)\y = 0
If figurf(0)\x >= 720 Then figurf(0)\x = 720
If figurf(0)\y >= 490 Then figurf(0)\y = 490





If (figurf(0)\x <> x1 ) Or (figurf(0)\y <> y1) Then
   position$ = Str$(figurf(0)\x) + "," + Str$(figurf(0)\y)
   SendNetMsg 1,position$,spielernr,0   
   x1 = figurf(0)\x
   y1 = figurf(0)\y
EndIf

If RecvNetMsg() = 1 Then
   
   position$ = NetMsgData$()
   figurf(1)\x = Int(position$)
   figurf(1)\y = Int(Mid$(position$,Instr(position,",") + 1)) 
EndIf


If (figurf(1)\leben <> leben) Then
   gegner_leben$ = Str$(figurf(1)\leben)
   SendNetMsg 2,gegner_leben$,spielernr,0
   leben = figurf(1)\leben
EndIf
 

   
If RecvNetMsg() = 1 Then
   gegner_leben$ = NetMsgData$()
   figurf(0)\leben = Int(gegner_leben$)
EndIf


DrawImage figur,figurf(0)\x,figurf(0)\y
MaskImage figur,255,255,255
DrawImage figur,figurf(1)\x,figurf(1)\y    
Text 60,60, "Leben: " + figurf(0)\leben
Text 60,90, "Leben Gegener: " + figurf(1)\leben
Flip
Until KeyHit(1)






mfg
Thunder

Silver_Knee

BeitragMo, Apr 06, 2009 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
If RecvNetMsg() = 1 Then

fragt ab OB eine Netmsg angekommen ist. Nicht welche. Nutze dazu NetMsgType
 

xXThunderXx

BeitragMo, Apr 06, 2009 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
ahh thx für die Hilfe
 

xXThunderXx

BeitragMo, Apr 06, 2009 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab jetzt noch ein problem, hab das jetzt hin bekommen mit dem NetmsgType jedoch laggt es sehr ich hab auch die abfrage bei Leben weg gemacht da es mir sonst immer nur Leben abgezogen hätte wenn ich mich bewegt hätte. Aber wenn ich jetzt eine Figur bewege und seis nur auf meinem eigen PC nicht mal im Netzwerk oder internet laggt es. Woran liegt das???? Hab mal die Abfragen bei der die X und y werte abgefragt werden weg gemacht aber dann ging gar nichts mehr. Kann es sein das es an dem Direct play liegt das es laggt.

Starwar

BeitragMo, Apr 06, 2009 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
DirectPlay ist veraltet. Es ist ab Version 8(?) nur noch emuliert und in 10 erst garnicht enthalten. Benutze UDP oder TCP.
Das ist ein gutes Beispiel: http://blitzbasic.com/codearcs...?code=2261
MFG
 

xXThunderXx

BeitragDi, Apr 07, 2009 13:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab jatzt ma mir UDP angefangen hab mir das TUT von Robsite angeschaut jedoch weis ich nicht wirlich wie man das jetzt benutzt hab mal was versucht so über zwi computer aber es funtionirt nicht


Code: [AUSKLAPPEN]
empfangs_stream = CreateUDPStream(8000)
sende_stream = CreateUDPStream(8001)

Repeat
 
nachricht$ = Input("Gib deine Nachricht ein: ")
ip_adresse = RecvUDPMsg(empfangs_stream)
ip$ = DottedIP(empfangs_stream)
Print ip$
If ip_adresse <> 0 Then empfangene_nachricht$ = ReadByte(empfangs_stream)
Print "Message: " + empfangene_nachricht$

WriteByte(sende_stream,nachricht$)
SendUDPMsg sende_stream,ip_adresse


Until KeyHit(1)

CloseUDPStream empfangs_stream
CloseUDPStream sende_stream


Weis jemand ob es es ein ausführliches Tut gibt als das von robsite oder eins mit kleine beispielen.

Starwar

BeitragDi, Apr 07, 2009 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
Oben das ist das Beste Beispiel. Du brauchst bei UDP immer nur einen Stream. In diesen kannst du schreiben und aus diesem kannst du lesen. Wenn du auf einem PC arbeitest, musst du das Programm beim Start nur anweisen einen andern Port zu benutzen als das zuerst gestartete... Bei Textnachrichten musst du Read/WriteLine statt Byte benutzen.
MFG
 

xXThunderXx

BeitragDi, Apr 07, 2009 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
ah thx
sry wenn euch nerv aber ich hab mich bis jetzt immer von Netztwerk fern gehalten.

Starwar

BeitragDi, Apr 07, 2009 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist auch nicht so einfach. Es hilft nur ausprobieren...
Guck dir das mal an. Ist für B+, aber du kannst es Leicht umschreiben. Mit der Leertaste sendest du Nachrichten. Es ist für 2 Spieler gedacht. Keinen mehr und keinen weniger. Zuerst natürlich den Serverstarten, sonst verbindet der Client sich mit sich selbst. Die IP hab ich auf die Lokale vom aktuellen PC eingestellt, sodass du das Programm auf einem PC starten kannst/musst. Ich habs jetzt nicht komenntiert...(sry)
Code: [AUSKLAPPEN]
;#001>Spieler (ANMELDUNG)
;#002>Spieler (Server) (ANMELDUNG ANGENOMMEN)
;#003>Grund (KICK)
;#004>Name (QUIT)
;#005>Nachricht (CHAT)

;[Block]
;win=CreateWindow("",0,0,0,0,0)
;restorewindow (win)
;FreeGadget win
;Graphics 500,400,16,2
;SetBuffer BackBuffer()
;
;AppTitle("")
;[End Block]

SeedRnd MilliSecs()
Global udptimer=CreateTimer(15)
Global ChatMsg$
Global clientconnected%=False
Global spieler$="Spieler "+Rand(1,99)
Global gegner$=""
Global Status$
Global PortIn% = 25000
Global fntArialB = LoadFont("Arial",16)
Global RecMsg$
;Global SndMsg$
Global PType%
Global UDPstream
Global Join_IP$
Global Send_IP%
Global Serv_IP%
Global lastUDPerror$=""

server = Confirm("Server?")
;[Block]
If server = True Then
   ok=connect(True,"",PortIn)
Else
   ok=connect(False,"",PortIn)
EndIf
If ok <= 0 Then Notify lastUDPerror,1 : End
Status = lastUDPerror
;[End Block]

   
;[Block]
Graphics 800,600,32,2
SetBuffer BackBuffer()
Color 0,255,0
SetFont fntArialB

While Not KeyHit(1)
   ev=WaitEvent()
   es=EventSource()
   If ev=$4001 And es=udptimer Then
      maxanfragen=1000
      Repeat
         If UDPstream = 0 Then
            RuntimeError "Die Verbindung wurde beendet: "+Status
         EndIf
         Temp% = RecvUDPMsg(UDPstream)
         If Temp <> 0 Then
            RecMsg$ = ReadLine$(UDPstream)
            ok%=handleSTDcodes%(RecMsg$)
            If ok% = -1 Then
               Notify "Die Verbindung wurde beendet!"
               End
            EndIf
         EndIf
         anfragen = anfragen+1
      Until temp=0 Or anfragen > maxanfragen
      anfragen=0
      Text 10,20,"Status: "+Status
      If RecMsg <> "" Then Text 10,340,DottedIP(Serv_IP)+": "+RecMsg
      If ChatMsg <> "" Then Text 10,365,DottedIP(Serv_IP)+"(Chat): "+ChatMsg
      Flip
      Cls
      If KeyDown(57) Then
            For i=1 To 20000
               WriteLine(UDPstream,"#005>Naricht Nummer "+i)
               SendUDPMsg(UDPstream,Serv_IP,PortIn)
            Next
         EndIf
      EndIf
   Wend
   closeConnection()
   End()
   ;[End Block]
   
Function connect(server=True,toIP$="",port%=2500)
   PortIn%=port%
   ip_count = CountHostIPs(GetEnv("localhost"))
   For i = 1 To ip_count
      Local localip$=DottedIP(HostIP(1))
   Next
   If server=True Then
      UDPstream= CreateUDPStream(PortIn) ;Server listens on 25000
      If UDPstream <> 0 Then
         lastUDPerror$ = "Server bereit. Warte auf Gegner..."
      Else
         lastUDPerror$ = "Fehler beim starten des Servers."
         Return 0
      EndIf
      PType = 1 ;Is Player a host?
      Return 1
   Else
      Join_IP$ = Trim(toIP$)
      If Len(Join_IP) = 0 Then Join_IP = localip$
      Serv_IP = SL_DotToInt(Join_IP) ;need to change entered ip address to ip format so blitz can read
      startport%=PortIn%
      clientport%=PortIn%
      Repeat
         UDPstream = CreateUDPStream(clientport)
         If UDPstream <> 0 Then
            lastUDPerror$ = "Client verbunden mit: ???("+DottedIP(Serv_IP)+":"+PortIn+")"
            Exit
         Else
            lastUDPerror$ = "Verbindung konntenicht hergestellt werden."
            clientport%=clientport%+1
         EndIf
      Until clientport% > startPort%+2
      If clientport% > startPort%+2 Then
         Return 0
      EndIf
      PType = 2 ;Is Player a Client?
      WriteLine(UDPstream,"#001>"+spieler$)
      SendUDPMsg(UDPstream,Serv_IP,PortIn)
      Return 2
   EndIf
End Function
   
Function closeConnection()
   If UDPstream <> 0 Then
      WriteLine(UDPstream,"#004>"+spieler$)
      SendUDPMsg(UDPstream,Serv_IP,PortIn)
      CloseUDPStream(UDPstream)
   EndIf
   Notify "Du hast das Spiel verlassen!"
End Function

Function handleSTDcodes%(MSG$)
   ;Return: 0=Nichts; -1= Verbindung beendet
   If Left(MSG$,1) = "#" And Instr(MSG$,">")<>0 Then
      pos=Instr(MSG$,">")
      msgC%=Int(Mid(MSG$,2,pos-2))
      msgI$=Mid(MSG$,pos+1,-1)
   Else
      Return 0
   EndIf
   If msgC%=1 Then
      If PType=1 Then
         If clientconnected%=False Then
            clientconnected%=True
            gegner$=msgI$
            Serv_IP = UDPMsgIP(UDPstream) ;Get IP Address of Message Sender
            PortIn = UDPMsgPort(UDPstream)
            Status = "Server connected with "+gegner$+" ("+DottedIP(Serv_IP)+":"+PortIn+")"
            WriteLine(UDPstream,"#002>"+spieler$)
            SendUDPMsg(UDPstream,Serv_IP,PortIn)
         Else
            tmpIP=UDPMsgIP(UDPstream) ;Get IP Address of Message Sender
            tmpPort=UDPMsgPort(UDPstream)
            WriteLine(UDPstream,"#003>Sorry, "+msgI$+", aber das Spiel läuft bereits!")
            SendUDPMsg(UDPstream,tmpIP,tmpPort)
         EndIf
      EndIf
   ElseIf msgC%=2 Then
      If PType=2 Then
         gegner$=msgI$
         Status="Client connected with "+gegner$+" ("+DottedIP(Serv_IP)+":"+PortIn+")"
      EndIf
   ElseIf msgC%=3 Then
      If PType=2
         Status = mscI$
         If UDPstream <> 0 Then CloseUDPStream(UDPstream)
         Notify "Du musstest den Server verlassen."+Chr(10)+"Grund: "+msgI$
         Return -1
      EndIf
   ElseIf msgC%=4 Then
      tmpIP=UDPMsgIP(UDPstream) ;Get IP Address of Message Sender
      If tmpIP = Serv_IP Then
         Notify "Dein Gegner hat das Spiel verlassen!"
         Return -1
      EndIf
   ElseIf msgC%=5 Then
      ChatMsg$=msgI$
   EndIf
   Return 0
End Function

Function SL_DotToInt%(ip$)
   ;From Blitzbasic Forums 'Chroma'
   ;IP address must be converted to an integer
   off1=Instr(ip$,".")     :ip1=Left$(ip$,off1-1)
   off2=Instr(ip$,".",off1+1):ip2=Mid$(ip$,off1+1,off2-off1-1)
   off3=Instr(ip$,".",off2+1):ip3=Mid$(ip$,off2+1,off3-off2-1)
   off4=Instr(ip$," ",off3+1):ip4=Mid$(ip$,off3+1,off4-off3-1)
   Return ip1 Shl 24 + ip2 Shl 16 + ip3 Shl 8 + ip4
End Function

MFG
 

xXThunderXx

BeitragDi, Apr 07, 2009 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey thx ich werde jetzt ma mit dem was ich wies so lange rum experimentieren bis ich was gescheides zusammen bekommen habe.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group