Prob Mit Direct PLay
Übersicht

xXThunderXxBetreff: Prob Mit Direct PLay |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
If RecvNetMsg() = 1 Then
fragt ab OB eine Netmsg angekommen ist. Nicht welche. Nutze dazu NetMsgType ![]() |
||
xXThunderXx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ahh thx für die Hilfe | ||
xXThunderXx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ah thx
sry wenn euch nerv aber ich hab mich bis jetzt immer von Netztwerk fern gehalten. |
||
![]() |
Starwar |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey thx ich werde jetzt ma mit dem was ich wies so lange rum experimentieren bis ich was gescheides zusammen bekommen habe. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group