fb:porticula NoPaste
testplay.bas
Uploader: | ThePuppetMaster |
Datum/Zeit: | 10.09.2009 14:10:09 |
Hinweis: Dieser Quelltext ist Bestandteil des Projekts TSNEPlay, zu dem es auf FreeBASIC-Portal.de eine Projektseite gibt.
'##############################################################################################################
'TEST-CLIENT für TSNEplay_V3
'##############################################################################################################
'##############################################################################################################
#include once "TSNEplay_V3.bi"
'##############################################################################################################
'Statusereignise der Verbindung zum Server
Sub TSNEPlay_ConnectionState(ByVal V_FromPlayerID as UInteger, ByVal V_State as TSNEPlay_State_Enum)
Print "[STATUS] PlayerID:"; V_FromPlayerID; " Status:"; TSNEPlay_Desc_GetStateCode(V_State)
End Sub
'--------------------------------------------------------------------------------------------------------------
'Ein Spieler hat sich erfolgreich mit dem Server verbunden
Sub TSNEPlay_Player_Connected(ByVal V_PlayerID as UInteger, V_IPA as String, V_Nickname as String)
Print "[NEUER SPIELER VORHANDEN] PlayerID:"; V_PlayerID; " IPA:"; V_IPA; " Nickname:"; V_Nickname
End Sub
'--------------------------------------------------------------------------------------------------------------
'Ein Spieler hat die Serververbindung getrennt
Sub TSNEPlay_Player_Disconnected(ByVal V_PlayerID as UInteger)
Print "[SPIELER HAT VERBINDUNG BEENDET] PlayerID:"; V_PlayerID
End Sub
'--------------------------------------------------------------------------------------------------------------
'Ein Spieler hat uns / allen eine Nachricht geschickt
Sub TSNEPlay_Message(ByVal V_FromPlayerID as UInteger, ByVal V_ToPlayerID as UInteger, ByVal V_Message as String, ByVal V_MessageType as TSNEPlay_MessageType_Enum)
Print "[NACHRICHT] Von PlayerID:"; V_FromPlayerID; " Fuer PlayerID:"; V_ToPlayerID; " Type:";
Select Case V_MessageType
Case TSNEPlay_MSGType_Regular : Print "[Standard]";
Case TSNEPlay_MSGType_Private : Print "[Privat]";
Case TSNEPlay_MSGType_Notice : Print "[Notiz]";
Case TSNEPlay_MSGType_Hightlighted : Print "[Hervorgehoben]";
Case Else : Print "[UNKNOWN]";
End Select
Print " Nachricht:>"; V_Message; "<"
End Sub
'--------------------------------------------------------------------------------------------------------------
'Ein Spieler hat eine 'Bewegen' Aktion ausgeführt
Sub TSNEPlay_Move(ByVal V_FromPlayerID as UInteger, ByVal V_ToPlayerID as UInteger, ByVal V_NewPositionX as Double, ByVal V_NewPositionY as Double, ByVal V_NewPositionZ as Double, ByVal V_SubData as UInteger)
'Print "[BEWEGUNG] Von PlayerID:"; V_FromPlayerID; " Fuer PlayerID:"; V_ToPlayerID; " Position (X/Y/Z):"; V_NewPositionX; " "; V_NewPositionY; " "; V_NewPositionZ; " SubData:"; V_SubData
PSet (V_NewPositionX, V_NewPositionY), RGB((255 / 2 * V_FromPlayerID), 255 - (255 / 2 * V_FromPlayerID), 0)
End Sub
'--------------------------------------------------------------------------------------------------------------
'Wenn der Programmiere mal eigene Daten versenden will, wird diese Funktion aufgerufen. Die Message Funktion ist hierfür nicht geeignet
Sub TSNEPlay_Data(ByVal V_FromPlayerID as UInteger, ByVal V_ToPlayerID as UInteger, ByRef V_Data as String)
Print "[DATEN] Von PlayerID:"; V_FromPlayerID; " Fuer PlayerID:"; V_ToPlayerID; " Data: >"; V_Data; "<"
End Sub
'##############################################################################################################
'Das Programm wird auf 2 arten gestartet
'<Programmname> server
'ermöglicht das erstellen eines servers. Hierbei fungiert das Programm nicht nur als lokal verbundener Client
'sondern auch als Server für andere Spieler. Wenn andere Spieler mit diesem Server eine Verbindung herstellen
'wollen, dann muss diesen Spielern die IP-Adresse dieses Programms bekannt sein. Entweder wie WAN oder LAN IPA
'<Programmname> <hostname>
'<hostname> muss eine IP-Adresse oder einen Hostname beinhaltet. Darufhin fungiert dieses Programm als Client
'und baut eine verbindung zum server (<Hostname>) auf.
'Ab hier gehts los, mit dem Programm
Screenres 800, 600, 32
Dim RV as TSNEPlay_GURUCode
'Soll das Programm ein Server sein?
If Command() = "server" Then
'Wen ja, dann hier weiter und server erzeugen.
Print "Dieses Programm dient zusätzlich als Server!"
Print "Erzeuge Server..."
'Wir erzeugen einen Spiele-Server für 10 Spieler, auf dem Port 1234.
'Durch das erzeugen des Servers werden wir automatisch als Client zum Server hinzugefügt!
'Wir brauchen also keine zusätziche Clientverbindung ausführen.
'Da wir selbst als Spieler fungieren werden, geben wir einen Nickname an
'Zusätzlich erhält der Server (otpional) ein Passwort
'Am ende werden die Callbacks eingetragen, welche bei unterschiedlichen ereignissen zum einsatz kommen
RV = TSNEPlay_CreateServer(10, 1234, "ServerNickname", "ServerPass", @TSNEPlay_ConnectionState, @TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, @TSNEPlay_Message, @TSNEPlay_Move, @TSNEPlay_Data)
If RV <> TSNEPlay_NoError Then Print "[ERROR] "; TSNEPlay_Desc_GetGuruCode(RV): End -1
Else
'wenn nein, dan nur einen Client erzeugen
Print "Stelle Verbindung zum Server '"; Command(); "' her..."
'Hie stellen wir eine verbindung zu einem bereits erzeugtem Server her. Auch hier geben wir die Selben Parameter an.
'Einzigster Unterschied besteht im ersten Parameter, der nicht die anzahl maximaler Spieler enthält, sondern den Hostname
'des Servers, zu dem eine verbindung hergestellt werden soll.
RV = TSNEPlay_ConnectToServer(Command(), 1234, "ClientNickname", "ServerPass", @TSNEPlay_ConnectionState, @TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, @TSNEPlay_Message, @TSNEPlay_Move, @TSNEPlay_Data)
If RV <> TSNEPlay_NoError Then Print "[ERROR] "; TSNEPlay_Desc_GetGuruCode(RV): End -1
'Jetztprüfen wir manuel den Status der Verbindung. (Könnte man auch über das Callback machen, aber für Demonstrationszwecke ist es hier integriert.
Dim TState as TSNEPlay_State_Enum
Dim TStateL as TSNEPlay_State_Enum
Dim XTot as Double = Timer() + 60
Do Until InKey() = Chr(27)
'Den Aktuellen Verbindungsstatus abfragen
TState = TSNEPlay_Connection_GetState()
If TStateL <> TState Then
TStateL = TState
Select Case TState
Case TSNEPlay_State_Disconnected, TSNEPlay_State_Ready: Exit Do
End Select
'Hiermit könnten wir den AKtuellen Status in Klartext umsetzen lassen
' Print TSNEPlay_Desc_GetStateCode(TState)
End If
Sleep 1, 1
'Timeout?, dan raus hier.
If XTot < Timer() Then Exit Do
Loop
'Und nochmal prüfen (falls es ein timeout gab)
TState = TSNEPlay_Connection_GetState()
If TState <> TSNEPlay_State_Ready Then
Print "Verbindung zum Server fehlgeschlagen!"
End -1
End If
End If
'Von hier an ist alles bereit. (Wurde uns auch via allback gemeldet)
Print "Verbindung zu Spieleserver Bereit!"
'Eine Kleine anwendung hinzufügen. Ist zwar kein Spiel, aber erfüllt seinen Zweck zur demonstration.
'Mit der Linken maustaste kann gemalt werden, mit der rechte eine feste Nachricht verschickt.
Dim TMouseR as Integer
Dim TMouseX as Integer
Dim TMouseY as Integer
Dim TMouseZ as Integer
Dim TMouseB as Integer
Dim TMouseXL as Integer
Dim TMouseYL as Integer
Dim TMouseBL as Integer
Do Until InKey() = Chr(27)
TMouseR = GetMouse(TMouseX, TMouseY, TMouseZ, TMouseB)
If (TMouseR = 0) and (TMouseX >= 0) and (TMouseY >= 0) and (TMouseB >= 0) Then
If TMouseB = 1 Then
If (TMouseXL <> TMouseX) or (TMouseYL <> TMouseY) Then
TMouseXL = TMouseX
TMouseYL = TMouseY
TSNEPlay_SendMove(0, TMouseX, TMouseY)
End If
ElseIf TMouseB = 2 Then
If TMouseBL <> TMouseB Then
TSNEPlay_SendMSG(0, "Das ist eine kleine Testnachricht an ALLE. Timestamp:" & Str(Timer()))
End If
End If
TMouseBL = TMouseB
End If
Sleep 1, 1
Loop
'Zu guter letzt sollten wir noch alle verbindungen (server / client) getrennt werden.
'Als client wird nur die verbindung zum server beendet
'Als Server werden alle Client-Verbindungen getrennt.
RV = TSNEPlay_CloseAll()
If RV <> TSNEPlay_NoError Then Print "[ERROR] "; TSNEPlay_Desc_GetGuruCode(RV): End -1
screen 0
End 0