Mini-Online-Game Tutorial +++NEU Teil2 +++

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

 

cyby

Betreff: Mini-Online-Game Tutorial +++NEU Teil2 +++

BeitragMo, Jul 05, 2004 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
hi,

ich habe mal eine Tutorial angefangen wie man ein Mini-Online-Game macht. Wie findet ihr den 1te Teil ?
Code: [AUSKLAPPEN]

;###########################################################################
;
; Tutorial zu einem MINI-Online-Game
;
; by cyby
; www.selobrain.de
; cyby-online@web.de
;
;################################### TUTORIAL-1
;
;
;Dieses Tutorial könnte ihr nach belieben verwenden und verändern. Falls
;ihr es auf eure Seite stellen wollt bitte ich euch mich kurz zu
;benachrichtigen!
;
;###########################################################################
;
;Willkommen, dies ist mein ERSTES Tutorial wo ich schreibe .
;Es geht darum wie die GrundEngine für ein einfaches Onlinespiel aussehen
;könnte . Die Idee stammt hauptsächlich von Hubsi aus dem BB-Forum
;(www.blitzforum.de) . Ihr sollte Grundkenntnisse über BB haben welche man
;durch Tutorials von www.robsite.de oder durch das Buch "Jetzt lerne ich
;Spiele programmieren mit BlitzBasic" vom Verlag Mark&Technik . Falls ihr
;Befehle nicht kennt dann könnt ihr in der OnlineHilfe nachschauen
;(www.blitzbase.de) !
;
;Es geht darum das jeder der Spieler einen Panzer steuern kann mit welchem
;man den anderen abschießen muss . Sobald man abgeschossen ist, wird dieser
;an einer neuen Stelle platziert und der Kampf geht weiter.Jede Spielrunde
;geht 5 Minuten. (könnt ihr aber im Code auch umstellen auf z.b. 3min)

;Um die Daten auszutauschen nehmen wir das UserDatenProtokoll oder kurz
;UDP, es ist nicht sicher ob die Daten ankommen (habe es aber noch nie
;erlebt) es geht aber hauptsächlich darum das es sehr schnell ist !
;
;Info:
;Host nennt man auch Server !
;
; Let's go...
;
;-----------> Daten laden .... <----------
;hier werden Bilder geladen, Variablen ect. deklariert
;
Global stream ;stream als global deklarieren damit man ihn auch in Funktionen verwenden kann, hiermit kann man dann  später nachrichten empfangen
Global sendeport = 8001 ;ist der Port womit man dann Daten senden kann
Global empfangsport = 8000;ist der Port womit man dann Daten empfangen kann
;
;-----------> 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
             game() ;wenn
      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"
              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()

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 1ten Tutorial !
;Um das ganze zu testen müsste ihr einfach das Programm 2mal starten,
;einmal Host[1] und einmal Client[2] wählen! Als erstes den Host starten,
;dann den Client mit der LocalenIP 127.0.0.1 !Wenn alles geht müssten alle
;beiden Programme automatisch game() starten , da noch nichts da ist
;gehen beide Programme aus .
;Ich entschludige mich für Rechtschreibfehler, bin halt auch nur ein Mensch
;und keine Maschienen!
;
;Falls ihr noch Fragen habt dann schickt mir eine PN oder eine E-Mail
;(findet ihr oben) .


falls ihr sie gut findet , dann mache ich weiter ....
  • Zuletzt bearbeitet von cyby am Mi, Jul 07, 2004 14:25, insgesamt einmal bearbeitet

Michi1988

BeitragDi, Jul 06, 2004 11:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Tutorials sind immer gut, weiter so.

Mr.Keks

BeitragDi, Jul 06, 2004 11:20
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm. naja, es erklärt etwas, wie man verbindet, aber das kann man auch einfach auf blitzbase nachlesen. interessanter ist es wohl, wie du mehrere spieler ermöglichst und verwaltest usw.
MrKeks.net
 

cyby

BeitragMi, Jul 07, 2004 14:23
Antworten mit Zitat
Benutzer-Profile anzeigen
so , nun die 2te Tutorial , hoffe das es verständlich ist und man was lernen kann !
http://home.arcor.de/24web4free/mog_tut.rar
hier ist Tutorial1+Tutorial2+Bilder drinne
und hier noch der Code vom Tut2
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) .


MfG
cyby Smile

ps. je nach Feedback gibt es den 3ten Teil !
 

sven123

BeitragSa, Jul 24, 2004 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde das Tut richtig gut,denn ich habe den Entschluss gefasst ein Onlineschachgme zu proggen,da habe ich erfreut festgestellt dass es hier ein so gutes und umfangreiches Tutorial zu Onlinegames gibt.


Ps:Ich freue mich schon auf Teil3
Amd Athlon 2200+,Saphire Atlantis Radeon9800pro,1024 MB DDR RAm,40 Gb Festblatte.
'in shâ'a llâh=so Gott will
Fertiges Projekt:Invasion der Heuschrecken

Markus2

BeitragSa, Jul 31, 2004 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
ich bin gerade auch dabei ein UPD Netzwerk aufzubauen und sah
bei dir das du die IP des Servers selbst umwandelst und
ich habe mich gefragt warum Mark das nicht eingebaut und
habe dann wieder heraus gefunden das es auch einfacher geht .

Also einfach aus den Settings den Server Namen lesen und eintragen und
der Rest geht von selbst Smile

Code: [AUSKLAPPEN]


.Network

Global NetServer=0
Global NetServerIP=0
Global NetServerName$="DeinServerName"
Global NetServerPort=8000
Global NetStreamIn=0
Global NetStreamOut=0

Function NetRun()

 Local n=0,IP1=0,IP2=0

 NetServerIP=0

 n = CountHostIPs(NetServerName$) ;hier den Server Namen eingeben
 If n=>1 Then IP1 = HostIP(1)
 n = CountHostIPs("") ;wenn leer dann bekommt man den lokalen Rechner
 If n=>1 Then IP2 = HostIP(1)

 If IP1=IP2 Then NetServer=1 Else NetServer=0

 If NetServer=1 Then
  n = CountHostIPs("") ;wenn leer dann bekommt man den lokalen Rechner
  If n=>1 Then NetServerIP = HostIP(1)
  DebugLog "Network UDP Server"
  DebugLog "Server IP " + DottedIP(NetServerIP)
  NetStreamIn=CreateUDPStream(NetServerPort) ;auf dem hört der immer
  NetStreamOut=CreateUDPStream(NetServerPort+1) ;spricht
 Else
  n = CountHostIPs(NetServerName$) ;hier den Server Namen eingeben
  If n=>1 Then NetServerIP = HostIP(1)
  DebugLog "Network UDP Client"
  DebugLog "Server IP " + DottedIP(NetServerIP)
  NetStreamIn=CreateUDPStream(NetServerPort+1) ;hört
  NetStreamOut=CreateUDPStream(NetServerPort) ;sendet dahin wo der Server hört
 EndIf

End Function

Function NetStop()

 If NetStreamIn  Then CloseUDPStream NetStreamIn  :NetStreamIn =0
 If NetStreamOut Then CloseUDPStream NetStreamOut :NetStreamOut=0

End Function

Function NetInput()

 Local St=NetStreamIn
 Local i
 Local i1,i2,i3
 Local f1#,f2#,f3#
 Local cmd$
 Local IP
 Local Port

 IP=RecvUDPMsg(St)
 If IP=0 Then Return 0
 Port=UDPMsgPort(St)

 DebugLog "RecvUDPMsg von "+DottedIP(IP)+":"+Port

  Local buf=ReadAvail (St)
  If buf>0 Then DebugLog "Net Input Buffer Len = "+buf

  Port=UDPMsgPort(St)
  i=ReadInt(St)
  Select i
  Case 0
   cmd$=ReadString(St)
   DebugLog cmd$
  Case 1
   i1=ReadInt( St)
   i2=ReadInt( St)
   i3=ReadInt( St)
  Case 2
   f1#=ReadFloat( St)
   f2#=ReadFloat( St)
   f3#=ReadFloat( St)
  End Select

 Return 1

End Function

 

sven123

BeitragSo, Aug 01, 2004 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich nerven sollte oder so dann einfach ignorieren.Hier habe ich mal deinen Code und in mal so umgebaut das die Panzer ohne Tile Engine fahren sie werden wenn eine der seiltlichen Pfeiltasten gedrückt werden um 2 Grad per rotateimage gedreht.Doch nun zu meinem Problem die verbindung klappt net obwohl ich alles richtig eingegeben habe und den Netzwerk code eigntlich unveränderet gelassen habe.
Code: [AUSKLAPPEN]

Graphics 640,480,16,1
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
;
panzers1=LoadImage("panzer1.bmp")
panzers2=LoadImage("panzer2.bmp")
Global winkel1
Global player1x=0
Global player1y=0
;
Global player2x=640
Global player2y=480
Global winkel2



;-----------> Hauptmenu <------------
;erster einmal ein paar Infos zum Spiel
Print "Fuzzy intelligence Game production presents"
Print "              Splater War Arena "
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 = 0
            player1y = 0
            ;
            player2x =640
            player2y =480
            
             
           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 =0
            player1y =0
         
            player2x =640
            player2y =480
         
             
               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
;hier läuft später mal das ganze Game ab
Function game()

Repeat ;neue hauptschleife vom game
Cls

;steuern des eigenen panzerns
;nur prüfen wenn der player sich nicht bewegt !

 
  If player1_move = 0 Then ;damit das ganze nur einmal gesendet wird
  If KeyDown(205) Then
   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)
 
  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(200)
 
  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)
 
  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
;Bewegung des Eigenen Spielers
If winkel1 > 179 Then winkel1 = -180
If winkel1 < -180 Then winkel1 = 179
If player1_move=1 Then
winkel1=winkel1+2
RotateImage panzers1,winkel1
EndIf
If player1_move=3 Then
winkel1=winkel1-2
RotateImage panzers1,winkel1
EndIf
If player1_move=4 Then 
player1x=player1x-Sin(winkel1)*2
player1y=player1y+Cos(winkel1)*2
EndIf
If player1_move=2 Then
player1x=player1x+Sin(winkel1)*2
player1y=player1y-Cos(winkel1)*2
EndIf
DrawImage panzers1,player1x,player1y

;
If winkel2 > 179 Then winkel2 = -180
If winkel2 < -180 Then winkel2 = 179
If player2_move=1 Then
winkel2=winkel2+2
RotateImage panzers2,winkel2
EndIf
If player2_move=3 Then
winkel2=winkel2-2
RotateImage panzers2,winkel2
EndIf
If player2_move=4 Then 
player2x=player2x-Sin(winkel2)*2
player2y=player2y+Cos(winkel2)*2
EndIf
If player2_move=2 Then
player2x=player2x+Sin(winkel2)*2
player2y=player2y-Cos(winkel2)*2
EndIf
DrawImage panzers2,player2x,player2y

;############################# 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
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
Amd Athlon 2200+,Saphire Atlantis Radeon9800pro,1024 MB DDR RAm,40 Gb Festblatte.
'in shâ'a llâh=so Gott will
Fertiges Projekt:Invasion der Heuschrecken

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group