Internet - krieg keine Verbindung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Till P.

Betreff: Internet - krieg keine Verbindung

BeitragDo, Nov 03, 2005 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo !

Ich habe das "Tutorial zu einem Mini-Online Game" von cyby gestartet.
Wenn ich das auf einem Rechner ausführe (Hostip: 127.0.0.1) funktioniert das einwandfrei. Wenn ich das aber mit einem Freund über Internet probiere (ip von www.whatismyip.de), klappt das nicht, denn die Datenpakete kommen nicht an, und das Programm beendet sich dann (wie im Code vorgesehen, wenn keine Verbindung zustande kommt.)

ich hoffe ich hab mich einigermaßen verständlich ausgedrückt...

hier mal (Tutorial-)Code:

Code: [AUSKLAPPEN]
;###########################################################################
;
; Tutorial zu einem MINI-Online-Game
;
; by cyby
; www.selobrain.de
; cyby-online@web.de
;
;###########################################################################
;
;----------------------- 2 Tutorial --------------------------------------
;In der 2ten Tutorial werden wir lernen wie man das Spielfeld zeichnet und
;beide ihre Panzer bewegen . Wenn sie sich bewegen wird dies auch beim
;anderen angezeigt !
;
;
; Let's go...
;
;-----------> Daten laden .... <----------
;hier werden Bilder geladen, Variablen ect. deklariert
;
Graphics 640,480,16,2
SetBuffer BackBuffer()

Global stream ;stream als global deklarieren damit man ihn auch in Funktionen verwenden kann, hiermit kann man dann  später nachrichten empfangen
Global sendeport ;ist der Port womit man dann Daten senden kann
Global empfangsport ;ist der Port womit man dann Daten empfangen kann
;
;bevor wir weiter machen brauchen wir noch ein paar variablen
Global ip ;diese Variable braucht wir um dann später in den Funktionen die IP vom Gegner zu nutzen
;
Global mapx = 10 ;ist die X größe der karte wo wir später drauf kämpfen
Global mapy = 10 ;ist die Y größe der karte wo wir später drauf kämpfen

Global tilex = 32 ;die X größe der Tiles wo wir später brauchen...
Global tiley = 32 ;die Y größe der Tiles wo wir später brauchen...
 
;nun legen wir ein Dim feld an indem wir später die Map speichern
Dim map(mapx,mapy)

Global player1x = 32*1;die x possition von einem
Global player1y = 32*1;die y possition von einem
Global player1_2x = 1;ist die possition für die kollision
Global player1_2y = 1;ist die possition für die kollision
Global player1_move = 0 ;gibt an in welche richtung sich der player bewegt
Global player1_draw = 1 ;diese variable braucht um zu bestimmen welches bild vom panzer gezeichnet werden soll
Global xo1 = 0 ;brauchen wir später damit der panzer sich nicht immer um 1tile bewegt sondern langsamer...

Global player2x ;die x possition vom gegner
Global player2y ;die y possition vom gegner
Global player2_2x ;ist die possition für die kollision
Global player2_2y ;ist die possition für die kollision
Global player2_move = 0;gibt an in welche richtung sich der player bewegt
Global player2_draw = 1;diese variable braucht um zu bestimmen welches bild vom panzer gezeichnet werden soll
Global xo2 = 0 ;brauchen wir später damit der panzer sich nicht immer um 1tile bewegt sondern langsamer...

Global player_speed = 1;der speed wo ein panzer läuft

;jetzte wird die map bestückt mit nummern der Tiles
; 0 = Graß ->  keine Kollision
; 1 = Mauer -> kollision
Data 1,1,1,1,1,1,1,1,1,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,1,1,1,1,1,1,1,1,1
;nun das data feld auslesen
For y = 0 To mapy-1 ;-1 da ein dimfeld bei 0 anfängt
 For x = 0 To mapx-1
  Read map(x,y)
 Next
Next

;hier werden wir jetzte die Bilder geladen wie Tiles und Panzer
;jetzte die tiles laden, wir nehmen .bmp als Bildformat da einige von euch sicher nur die Demo von BlitzBasic haben, aber für größere spiele sollte ihre ein kleineres Format wie .png nehmen ...
Global tiles = LoadAnimImage("tiles.bmp",32,32,0,2)
;jetzte die panzer laden... wir nehmen vorerst mal welche ohne animation...
Global panzer1 = LoadAnimImage("panzer1.bmp",32,32,0,4) ;grüner panzer (eigener)
MaskImage panzer1,255,0,255 ;rosa als tranparenz nehmen
Global panzer2 = LoadAnimImage("panzer2.bmp",32,32,0,4) ;roter panzer (gegner)
MaskImage panzer2,255,0,255 ;rosa als tranparenz nehmen

;-----------> Hauptmenu <------------
;erster einmal ein paar Infos zum Spiel
Print "Willkommen zu einem MINI-Online-Game"
Print "   *Panzer-War - The Last Day* "
Print ""
Print "Wähle [1] um das Spiel als Host zu starten.";Host ist der PC wo das Spiel startet
Print "Wähle [2] um das Spiel als Client zu starten.";Client ist der PC wo sich mit einem Host verbindet
Print "Wähle [3] um das Spiel zu Verlassen."
wahl_nummer = Input("Ihre Wahl:") ;jetzte nach der Wahl des Players fragen

If wahl_nummer = 1;wenn man 1 gewählt hat [Host]

  sendeport = 8000 ;ist der Port womit man dann Daten senden kann
  empfangsport = 8001;ist der Port womit man dann Daten empfangen kann
    stream = CreateUDPStream(empfangsport) ;den UDP-Stream erstellen um Daten zu empfangen
      If stream = 0 ;wenn der Stream nicht erstellt worde konnte
        Print "Konnte Stream nicht erstellen !"
        Print "Weiter mit Taste!"
        WaitKey
        End
      Else ;wenn der Stream erstellt worde konnte
        Print "Spiel als Host gestartet"
        Print "Deine IP findest du unter *www.wasistmeineip.de*,"
        Print "diese braucht der Client um mit dir zu verbinden!"
        Print "Warten auf den Client..."
          Repeat ;solange warten bis der Client sich mit dem Host verbunden hat
             ip = RecvUDPMsg(stream);wenn eine nachricht empfangen wird...
           If KeyHit(1) Then ende()
         Until ip <> 0
             WriteByte stream,1;eine anwort senden
             SendUDPMsg stream,ip,sendeport
      
            ;nun noch die daten vom anderen player angeben
            player1x = 32*5;die x possition
            player1y = 32*5;die y possition
            player1_2x = 5;ist die possition für die kollision
            player1_2y = 5;ist die possition für die kollision

            player2x = 32*1;die x possition
            player2y = 32*1;die y possition
            player2_2x = 1;ist die possition für die kollision
            player2_2y = 1;ist die possition für die kollision
             
           game()
      EndIf

ElseIf wahl_nummer = 2;wenn man 2 gewählt hat [Client]

  ip_nummer$ = Input("Die IP vom Host: ") ;nach der IP fragen...
  ip = integerip(ip_nummer$)            ;IP umwandeln...

  sendeport = 8001 ;ist der Port womit man dann Daten senden kann
  empfangsport = 8000;ist der Port womit man dann Daten empfangen kann
    stream = CreateUDPStream(empfangsport) ;den UDP-Stream erstellen um Daten zu empfangen
      If stream = 0 ;wenn der Stream nicht erstellt worde konnte
        Print "Konnte Stream nicht erstellen !"
        Print "Weiter mit Taste!"
        WaitKey
        End
      Else ;wenn der Stream erstellt worde konnte
        WriteByte stream,1 ;1 senden damit der Host weis das ein Client da ist
        SendUDPMsg stream,ip,sendeport ;die nachricht senden
       
      Delay 1000;1sekunde lang warten und dann prüfen ob der host da ist
       
        If RecvUDPMsg(stream) Then
          empfangen = ReadByte(stream)
            If empfangen = 1;wenn es 1 ist dann hat man das spiel als client gestartet
              Print "Spiel als Client gestartet"

            ;nun noch die daten vom anderen player angeben
            player1x = 32*1;die x possition
            player1y = 32*1;die y possition
            player1_2x = 1;ist die possition für die kollision
            player1_2y = 1;ist die possition für die kollision

            player2x = 32*5;die x possition
            player2y = 32*5;die y possition
            player2_2x = 5;ist die possition für die kollision
            player2_2y = 5;ist die possition für die kollision
             
               game()
            Else
              Print "Konnte Spiel nicht als Client starten!"
            Print "Weiter mit Taste!"
           ende()
         EndIf
        EndIf
      EndIf

Else ;anonsten das Spiel Beenden

  End;beenden

EndIf

;#########################################################################
;############################# FUNCTIONEN ################################
;#########################################################################
;########################## game() #######################################
;hier läuft später mal das ganze Game ab
Function game()

Repeat ;neue hauptschleife vom game
Cls

;############################ map malen
;hier werden wir jetzte die map malen !
For x = 0 To mapx-1
 For y = 0 To mapy-1
  DrawImage tiles,x*tilex,y*tiley,map(x,y)
 Next
Next   

;#########################################################################
;############################### player1 (selber) ########################
;#########################################################################

;############################ steuer seines eigenen panzerns
;nur prüfen wenn der player sich nicht bewegt !
If player1_move = 0 Then
 If KeyDown(200) And map(player1_2x,player1_2y-1) = 0 Then ;hoch ;das -1 bei player1_2y damit das tile vor dem panzer geprüft wird und wenn dieses frei ist (0=graß) dann kann der panzer fahren , sonst nicht !
 
  If player1_move = 0 Then ;damit das ganze nur einmal gesendet wird
   ;nun die player1_2x und player1_2y senden
   WriteByte  stream,1;eine kennnummer womit man dann rausfiltern kann weche daten das sind
   WriteByte  stream,1 ;für player_move
   SendUDPMsg stream,ip,sendeport;nun werden die x und y possition gesendet !
  EndIf
  player1_move = 1

 ElseIf KeyDown(203) And map(player1_2x-1,player1_2y) = 0 ;links ;das -1 bei player1_2x damit das tile vor dem panzer geprüft wird und wenn dieses frei ist (0=graß) dann kann der panzer fahren , sonst nicht !
 
  If player1_move = 0 Then ;damit das ganze nur einmal gesendet wird
   ;nun die player1_2x und player1_2y senden
   WriteByte  stream,1;eine kennnummer womit man dann rausfiltern kann weche daten das sind
   WriteByte  stream,3 ;für player_move
   SendUDPMsg stream,ip,sendeport;nun werden die x und y possition gesendet !
  EndIf
  player1_move = 3

 ElseIf KeyDown(205) And map(player1_2x+1,player1_2y) = 0 ;rechts ;das +1 bei player1_2x damit das tile vor dem panzer geprüft wird und wenn dieses frei ist (0=graß) dann kann der panzer fahren , sonst nicht !
 
  If player1_move = 0 Then ;damit das ganze nur einmal gesendet wird
   ;nun die player1_2x und player1_2y senden
   WriteByte  stream,1;eine kennnummer womit man dann rausfiltern kann weche daten das sind
   WriteByte  stream,4 ;für player_move
   SendUDPMsg stream,ip,sendeport;nun werden die x und y possition gesendet !
  EndIf
  player1_move = 4

 ElseIf KeyDown(208) And map(player1_2x,player1_2y+1) = 0 ;runter ;das +1 bei player1_2y damit das tile vor dem panzer geprüft wird und wenn dieses frei ist (0=graß) dann kann der panzer fahren , sonst nicht !
 
  If player1_move = 0 Then ;damit das ganze nur einmal gesendet wird
   ;nun die player1_2x und player1_2y senden
   WriteByte  stream,1;eine kennnummer womit man dann rausfiltern kann weche daten das sind
   WriteByte  stream,2 ;für player_move
   SendUDPMsg stream,ip,sendeport;nun werden die x und y possition gesendet !
  EndIf
  player1_move = 2

 EndIf
EndIf

;############################ player bewegen
If player1_move = 1;hoch
 player1_draw = 1 ;damit der panzer nach oben gezeichnet wird
 player1y = player1y - player_speed ;die y possition vermindern
 xo1 = xo1 + player_speed ;xo1 immer um den player speed erhöhen
  If xo1 = 32 Then ;wenn xo1 32 ist (tile ende) wird gestoppt
   xo1 = 0 ;wieder auf 0 setzten
   player1_move = 0
   player1_2y = player1_2y - 1;die player possition welche wir für die kollision brauchen
  EndIf
ElseIf player1_move = 2;runter
 player1_draw = 2 ;damit der panzer nach unten gezeichnet wird
 player1y = player1y + player_speed ;die y possition erhöhen
 xo1 = xo1 + player_speed ;xo1 immer um den player speed erhöhen
  If xo1 = 32 Then ;wenn xo1 32 ist (tile ende) wird gestoppt
   xo1 = 0 ;wieder auf 0 setzten
   player1_move = 0
   player1_2y = player1_2y + 1;die player possition welche wir für die kollision brauchen
  EndIf
ElseIf player1_move = 3;links
 player1_draw = 3 ;damit der panzer nach links gezeichnet wird
 player1x = player1x - player_speed ;die y possition vermindern
 xo1 = xo1 + player_speed ;xo1 immer um den player speed erhöhen
  If xo1 = 32 Then ;wenn xo1 32 ist (tile ende) wird gestoppt
   xo1 = 0 ;wieder auf 0 setzten
   player1_move = 0
   player1_2x = player1_2x - 1;die player possition welche wir für die kollision brauchen
  EndIf
ElseIf player1_move = 4;rechts
 player1_draw = 4 ;damit der panzer nach rechts gezeichnet wird
 player1x = player1x + player_speed ;die x possition erhöhen
 xo1 = xo1 + player_speed ;xo1 immer um den player speed erhöhen
  If xo1 = 32 Then ;wenn xo1 32 ist (tile ende) wird gestoppt
   xo1 = 0 ;wieder auf 0 setzten
   player1_move = 0
   player1_2x = player1_2x + 1;die player possition welche wir für die kollision brauchen
  EndIf

EndIf

;############################ player zeichnen
If player1_draw = 1;hoch
 DrawImage panzer1,player1x,player1y,0
ElseIf player1_draw = 2;runter
 DrawImage panzer1,player1x,player1y,1
ElseIf player1_draw = 3;links
 DrawImage panzer1,player1x,player1y,2
ElseIf player1_draw = 4;rechts
 DrawImage panzer1,player1x,player1y,3
EndIf

;#########################################################################
;############################### player1 (selber) ########################
;#########################################################################

;############################ player bewegen
If player2_move = 1;hoch
 player2_draw = 1 ;damit der panzer nach oben gezeichnet wird
 player2y = player2y - player_speed ;die y possition vermindern
 xo2 = xo2 + player_speed ;xo2 immer um den player speed erhöhen
  If xo2 = 32 Then ;wenn xo2 32 ist (tile ende) wird gestoppt
   xo2 = 0 ;wieder auf 0 setzten
   player2_move = 0
   player2_2y = player2_2y - 1;die player possition welche wir für die kollision brauchen
  EndIf
ElseIf player2_move = 2;runter
 player2_draw = 2 ;damit der panzer nach unten gezeichnet wird
 player2y = player2y + player_speed ;die y possition erhöhen
 xo2 = xo2 + player_speed ;xo2 immer um den player speed erhöhen
  If xo2 = 32 Then ;wenn xo2 32 ist (tile ende) wird gestoppt
   xo2 = 0 ;wieder auf 0 setzten
   player2_move = 0
   player2_2y = player2_2y + 1;die player possition welche wir für die kollision brauchen
  EndIf
ElseIf player2_move = 3;links
 player2_draw = 3 ;damit der panzer nach links gezeichnet wird
 player2x = player2x - player_speed ;die y possition vermindern
 xo2 = xo2 + player_speed ;xo2 immer um den player speed erhöhen
  If xo2 = 32 Then ;wenn xo2 32 ist (tile ende) wird gestoppt
   xo2 = 0 ;wieder auf 0 setzten
   player2_move = 0
   player2_2x = player2_2x - 1;die player possition welche wir für die kollision brauchen
  EndIf
ElseIf player2_move = 4;rechts
 player2_draw = 4 ;damit der panzer nach rechts gezeichnet wird
 player2x = player2x + player_speed ;die x possition erhöhen
 xo2 = xo2 + player_speed ;xo2 immer um den player speed erhöhen
  If xo2 = 32 Then ;wenn xo2 32 ist (tile ende) wird gestoppt
   xo2 = 0 ;wieder auf 0 setzten
   player2_move = 0
   player2_2x = player2_2x + 1;die player possition welche wir für die kollision brauchen
  EndIf

EndIf

;############################ player zeichnen
If player2_draw = 1;hoch
 DrawImage panzer2,player2x,player2y,0
ElseIf player2_draw = 2;runter
 DrawImage panzer2,player2x,player2y,1
ElseIf player2_draw = 3;links
 DrawImage panzer2,player2x,player2y,2
ElseIf player2_draw = 4;rechts
 DrawImage panzer2,player2x,player2y,3
EndIf



;############################# empfangen #################################
;nun die empfangen daten rausfiltern und die variablen aktualisieren
If RecvUDPMsg(stream)

 nummer = ReadByte(stream)
  Select nummer
    Case 1 ;die player_move nummer empfangen woraus dann der player bewegt wird
       player3_move = ReadByte(stream)
  End Select

EndIf
;nun müssen wir das empfangen player3_move verarbeiten
If player3_move > 0 Then;nur weiter verarbeiten wenn es größer ist als 0
 If player2_move = 0 Then;wenn sich der panzer nicht bewegt dann zuweisen , sonst darauf warten
  player2_move = player3_move ;zuweisen
  player3_move = 0 ;und wieder auf 0 sezten
 EndIf
;nun, warum machen wir das so ?
;ganz einfach wenn wir player2_move = readbyte(stream) gemacht hätten
;gäbe es einen kleinen fehler wodurch sich der panzer nicht richtig
;bewegt !
EndIf


Flip 0 ; flip 0 da es sonst sehr stark ruckelt !
Until KeyHit(1);wenn man ESCAPE drückt dann wird das game beendet
ende()
End Function
;########################## ende() #######################################
;wenn man das Spiel beendet wird die Funktion ende() aufgerufen
Function ende()

CloseUDPStream stream ;stream beenden
End                   ;alles schließen

End Function
;########################### integerip() #################################
;braucht man um die eingegebene IP zumzuwandeln
Function IntegerIP(IP$)
 A1 = Int(Left(IP$,Instr(IP$,".")-1)) : IP$ = Right(IP$,Len(IP$)-Instr(IP$,"."))
 A2 = Int(Left(IP$,Instr(IP$,".")-1)) : IP$ = Right(IP$,Len(IP$)-Instr(IP$,"."))
 A3 = Int(Left(IP$,Instr(IP$,".")-1)) : IP$ = Right(IP$,Len(IP$)-Instr(IP$,"."))
 A4 = Int(IP$)
 Return (A1 Shl 24) + (A2 Shl 16) + (A3 Shl 8 ) + A4
End Function




;So, das wars auch schon mit der 2ten Tutorial !
;
;Falls ihr noch Fragen habt dann schickt mir eine PN oder eine E-Mail
;(findet ihr oben) .


Bin dankbar für jedwede Art von Hilfe! Wink
mfg
Till

skey-z

BeitragDo, Nov 03, 2005 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe mir den code nicht durchgelesen, weil wenn es bei dir auf rechner über den localhost funktioniert, wird es denek ich eher nicht am Code liegen.

ich schätze mal mindestens einer von euch hat nen Router, stimmts?

der der das spiel eröffnet, muss auch die verwendeten Ports in dem Router freigeben, damit die pakete durchkommen.

wie das geht, ist von router zu router unterschiedlich, musst mal nach portforwarding oder im Handbuch schauen.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

Till P.

BeitragDo, Nov 03, 2005 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke erstmal, ich bin trotzdem noch nicht weiter gekommen.
Also,
es handelt sich um zwei PCs innerhalb eines Haushaltes, die über einen Switch gleichzeitig ins Internet gehen. Die Verbindung erfolgt also übers Internet (nicht Lan).
Ich weiß nicht ob euch die Information hilft mein Problem zu lösen....

Viel Glück Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group