Networking GameNet Tutorial

Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Neue Antwort erstellen

maanee9

Betreff: Networking GameNet Tutorial

BeitragMi, Okt 13, 2010 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

hab ein kleines Tutorial für GameNet mit dieser Vorlage erstellt:
http://www.blitzmax.com/Commun...opic=51171

Hauptsächlich habe ich alles so angepasst das es mit der aktuellen Blitzmax Version 1.41 funktioniert.
Hinzukommen kommen sind noch ein paar Variablen und einiges an zusätzlichen deutschen Kommentaren.

Hauptsächlich vermittelt dieses Tutorial die Grundlegenden Kenntnisse um kleinere Netzwerkspiele zu realisieren. Der Quelltext ist hauptsächlich prodzedural gehalten (D.h der Code wird der Reihe nach von oben nach unten abgearbeitet).
Einzige Ausnahme ist beim Client der Typ/Klasse ganz am Ende.

Hoffe das hilft einigen das Prinzip zu verstehen.


Quelltext Server:
BlitzMax: [AUSKLAPPEN]

Strict

'SERVER

'Variablen die benötigt werden
Local serverPort:Int = 8888 'Wie der Name schon sagt. Der Port auf den gelauscht wird
Local quitServer = False 'Variable die prüft ob Server weiter aktiv sein soll
Local openServer:tgnethost 'Variable die auf den gestarteten Serverhost zeigt



'Host erstellen der sich zu anderen verbinden(client) kann oder lauschen kann.(server)
Local listener:tgnethost = CreateGNetHost()
Print "Server wird gestartet ";Print""

'Server auf bestimmten Port lauschen lassen

If Not GNetListen(listener , serverPort)
Print "Server konnte nicht gestartet werden:"
Print "Port " + serverPort + " bereits belegt."
quitServer = True
CloseGNetHost(listener)
Return
Else
openServer:tgnethost = listener 'Umbennen der Variable zum Zecke des Verständnisses
EndIf



While Not quitServer

'Synchronisieren der GNet Objekte
GNetSync(openServer)


'Objekt-Liste die alle Gnet-Objekte enthält
Local objectGList:TList = GNetObjects( openServer)

'Foreach Schleife die alle Elemente der Liste durchläuft
For Local objectG:TGnetObject = EachIn objectGList

'Hier wird der Status jedes einzelnen GnetObjekts abgelegt
Local state = GNetObjectState( objectG )

'Swicht-Case Abfrage (Die verschiedenen möglichen Gbnet-Objekt Stati)
Select state
Case GNET_CREATED
Print "New object created"
Case GNET_SYNCED
Case GNET_MODIFIED
Print GetGNetString(objectG,1)+" is moving"
Case GNET_CLOSED
Print "Connection closed to a peer"
Case GNET_MESSAGE
EndSelect

Next



'Delay von einer Millisekunde damit die CPU nicht zu 100% ausgelasstet wird.
Delay(1)
Wend



Quelltext Client:
BlitzMax: [AUSKLAPPEN]

Strict

'client

'Variablen die benötigt werden
Local serverPort:Int = 8888 'Wie der Name schon sagt. Der Port auf den gelauscht wird
Local quitClient = False 'Variable die prüft ob Client weiter aktiv sein soll
Local serverAdresse:String = "localhost" 'Die Adresse des Servers
Local connectTimeout:Int = 10000 'Nach dieser Zeit wird der Verbindungsversuch abgebrochen (in Millisekunden)
Local session:tgnethost 'In diese Variable wird zwecks übersichtlichkeit der connector zeiger gelegt

'Host erstellen der sich zu anderen verbinden(client) kann oder lauschen kann.(server)
Local connector:tgnethost = CreateGNetHost()

'Verbindung zum Server herstellen
If Not GNetConnect(connector , serverAdresse , serverPort,connectTimeout)
Print "Verbindung zum Server nicht möglich."
Else
'Zur Übersichtlichkeit der Session Varibale den Connector übergeben
session = connector
EndIf


'Hier dir ein NetObjekt erzeugt in dem sich ein Gnet Objekt befindet.
Local localplayer:NetObject = NetObject.Create(connector , "PlayerX" , 320 , 240)

Graphics 640,480,0


While Not quitClient

'Die Objekte werden synchronisiert.
GNetSync(connector) ' Sync objects

' Es wird eine Liste erzeugt in denen alle akutellen GNet Objekte liegen
Local olist:TList = GNetObjects( connector )

'Es wird eine Liste erzeugt in der später alle aktiven Objekte des Typs NetObject gespeichert werden
Local plist:TList = CreateList()

'Foreach Schleife in der alle GNet Objekte abgearbeitet werden
For Local o:TGnetObject = EachIn olist

' Der Status des Gnet-Objekts wird gespeichert
Local state = GNetObjectState( o )

'Switchcase Abfrage was bei einem bestimmten Status passieren soll
Select state
'Objekt wurde erstellt
Case GNET_CREATED
'Abfrage ob es sich um ein NetObject handelt
If GetGNetInt( o , 0 ) = NetObject.kennung
'Wenn Objekt erzeugt wird dieses in die Liste der Spieler hinzugefügt.
plist.addlast( o )
Print "Joined: "+GetGNetString(o,1)
EndIf
'Objekt ist bereits synchron
Case GNET_SYNCED
'Abfrage ob es sich um ein NetObject handelt
If GetGNetInt( o, 0 ) = NetObject.kennung
plist.addlast( o )
EndIf
'Dieses Objekt wurde im letzten Schleifendurchlauf verändert
Case GNET_MODIFIED
'Abfrage ob es sich um ein NetObject handelt
If GetGNetInt( o, 0 ) = NetObject.kennung
plist.addlast( o )
EndIf
'Dieses Objekt existiert nun nicht mehr
Case GNET_CLOSED

EndSelect

Next

'Den oberen Teil hätte man auch in eine eigene funktion auslagern können

' Das Spieler-Objekt wird bewegt.
If KeyDown( KEY_LEFT ) Then LocalPlayer.move(-1,0)
If KeyDown( KEY_RIGHT ) Then LocalPlayer.move(1,0)
If KeyDown( KEY_UP ) Then LocalPlayer.move(0,-1)
If KeyDown( KEY_DOWN ) Then LocalPlayer.move(0,1)


' Jetzt wirds erst grafisch.

' Verbundene Spieler und sonstige Sachen zeichnen
'Varibale wird benötigt um verbundene Spieler untereinander zu schreiben.
Local y = 10

'Foreachschleife die wieder alle Gnet-Objekte durchläuft
For Local dp:TGnetObject = EachIn olist

'Namen zwischenspeichern
Local tmp:String = GetGNetString( dp,1 ) 'Slot 1 ist Nickname
'Spielernamen werden untereinander gezeichnet
DrawText tmp, 10,y
y:+17

' Rechtecke werden für die Spielerobjekte gezeichnet
Local xpos = GetGNetInt(dp,2) ' X-Position auf Slot 2
Local ypos = GetGNetInt(dp,3) ' Y-Position auf Slot 3
DrawRect xpos - 3 , ypos - 12 , 7 , 12
'Über dem Objekt wird noch der Name geschrieben
DrawText tmp, xpos,ypos-30

Next

' Zum Schluss wird noch die Anzal der Spieler gezeichnet
DrawText "Players: "+plist.count(), 5,y




Flip ;
Cls

Wend





'Ein Typ welcher ein Gnet Object erstellen, beinhalten und manipulieren kann
Type NetObject

'
Const kennung:Int = 0

'Typ Eigenschaften (Beachte maximale Anzahl der EIgenschaften im einem Gnet-Objekt auf 32 beschränkt)
Field nobj:TGNetObject 'Variable für das Gnet-Objekt
Field xpos:Int 'Die X-Position auf dem Bildschirm
Field ypos:Int 'Die Y-Position auf dem Bildschirm
Field name:String 'Der Name des Objekts

'Funktion die das eigentliche Gnet-Objekt erstelt.
Function Create:NetObject( connection:TGNetHost, oname:String, x:Int, y:Int )

'Neues NetObject-Objekt wird initialisiert (siehe Typ)
Local netObjekt:NetObject = New NetObject

'Das Gnet-Objekt wird erstellt bzw mit Session verknüpft
netObjekt.nobj = CreateGNetObject( connection )

'Auf Slot 0 wird der ein Intwert gelegt, welcher als Kennzeichnung (um welche Art) des Objects dient.
SetGNetInt( netObjekt.nobj, 0, NetObject.kennung)

'Methodenaufruf um Startposition zu setzten
netObjekt.place(x , y)
'Methodenaufruf um Objektnamen zu setzen
netObjekt.rename(oname)

'Gnet-Objekt wird zurückgegeben
Return netObjekt
EndFunction



'Methode um Position zu setzen
Method place( x:Int , y:Int )
'Interne Typenvariablen
xpos = x
ypos = y
'Die Gnet-Objekt-Variablen '(Slot 2 und 3 sind für die x,y Postion reserviert)
SetGNetInt( nobj,2,x )
SetGNetInt( nobj,3,y )
EndMethod

'Methode um Bewegungen zu setzten (Variaben wie bei Methode place)
Method Move( xoff:Int, yoff:Int )
xpos:+xoff
ypos:+yoff
SetGNetInt( nobj,2,xpos )
SetGNetInt( nobj,3,ypos )
EndMethod

'Methode um den Namen zu ändern
Method rename( oname:String )
'Interen Typenvariable
name = oname
'De Gnet-Objekt-Varibale (Slot 1)
SetGNetString( nobj,1,name ) ' slot 1 is used for the nickname
EndMethod

EndType



Viel Spaß damit.


Gruß
maanee9
 

code van damme

BeitragSo, Nov 28, 2010 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, warum hat sich noch keiner bedankt? Question

Hm. Egal.

Danke!!! Very Happy

Wirklich sehr hilfreich für mich!
 

funkheld

BeitragMo, Aug 15, 2016 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie soll das Ding laufen, wenn alles über Print geht bei der BiltzMax-IDE ?
Wenn ich eine Exe starte , passiert garnichts.

Danke.
Gruss

Mathias-Kwiatkowski

BeitragDi, Aug 16, 2016 4:55
Antworten mit Zitat
Benutzer-Profile anzeigen
dies ist doch ein einfaches beispiel.

was wirklich gut funktioniert, dennoch würde ich gnet nich nutzen.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group