Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

testplay.bas

Uploader:MitgliedThePuppetMaster
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