 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 05.01.2013, 10:30 Titel: TSNE + TSNE PLAY |
|
|
Hi
Ich habe mich jetzt ein paar Tage durch die TSNE sache durchgelesen und hätte da noch ein paar Fragen.
hab Server und
Client geladen zum fumeln und lernen
1. wie weiß die server.bas das z.B. ein Client eine Msg. gesendet hat - denn das Programm ist ja lediglich eine endlosschleife in der nichts steht
Code: | ' Das "Programm"
do
sleep 1
loop until inkey = chr(27) |
2. ist es möglich 2 verschiedene programme gleichzeitig mit tsne laufen zu lassen - z.b. ein mail-prog und ein game, wenn ja wie würde das umgesetzt... ich denke das z.b. der game client bei der serveranfrage sein programmnamen mitsenden müsste oder so.
ich denk das reicht erstmal
EDIT: 2. hat sich erledigt... das wird über die Ports gesteuert |
|
Nach oben |
|
 |
Domso
Anmeldungsdatum: 02.02.2011 Beiträge: 109
|
Verfasst am: 05.01.2013, 16:42 Titel: |
|
|
das mit der endlosschleife regelt tsne von alleine
wenn jetzt zb der client eine nachricht an den server schickt, wird automatisch
Code: |
TSNEPlay_Message(byval von as uinteger, byval zu as uinteger, byval nachricht as string, _
byval typ as TSNEPlay_MessageType_Enum)
' Ein Spieler hat uns / allen eine Nachricht geschickt
print "Nachricht von " & von & ": " & nachricht
end sub
|
ausgeführt |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 05.01.2013, 17:14 Titel: |
|
|
Wie ist das möglich? Der erklärt nicht, dass die Hauptschleife praktisch leer ist. |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 05.01.2013, 18:55 Titel: |
|
|
ah ok danke
jetzt wollt ich den clienten so abändern das wenn er keine verbindungsnachricht bekommt, er selbst ein server startet und erneut versucht zu verbinden.
wäre es so richtig?
Code: | sub TSNEPlay_Player_Connected(byval id as uinteger, IPA as string, nick as string)
' Spieler wurde verbunden
DIM SHARED AS STRING verbindung
print id & " hat die Verbindung hergestellt"
verbindung = "OK"
end sub |
Code: |
' Aufbau der Verbindung
randomize timer
dim as integer zufallsnummer = rnd*99999
DO
netzwerk = TSNEPlay_ConnectToServer(ServerAdresse, ServerPort, "Client" & zufallsnummer, "geheimesPasswort", _
@TSNEPlay_ConnectionState, @TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, _
@TSNEPlay_Message, @TSNEPlay_Move, @TSNEPlay_Data)
Sleep 2000, 1
IF verbindung = "OK" THEN EXIT DO
RUN Server.exe
LOOP
|
|
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 06.01.2013, 01:25 Titel: |
|
|
Eigentlich kannst du das ganz simpel, anders lösen.
Du fürst den aufbau einr verbindung mithilfe der funktion
Code: | TSNEPlay_ConnectToServer(...) |
aus.
diese liefert dir einen "Return-code" zurück. Dieser enthält anschliessend den status des Funktionsaufrufs.
Code: | Dim RV as TSNEPlay_GURUCode = TSNEPlay_ConnectToServer(...)
Print TSNEPlay_Desc_GetGuruCode(RV) |
Wenn hier kein fehler aufgetreten ist, kannst du simpel prüfen, ob die verbindung erfolgreich hergestellt wurde, indem du den Status der Verbindugn mithilfe von
Code: | TSNEPlay_Connection_GetState() |
abfragst
Code: | Dim RV as TSNEPlay_GURUCode = TSNEPlay_ConnectToServer(...)
If RV <> TSNEPlay_NoError Then Print "[ERROR] "; TSNEPlay_Desc_GetGuruCode(RV): End -1
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
|
Wie aus dem Beispiel von TSNEPlay.
Hier könntest du simpel prüfen, ob ein timeout eintrat, oder ein anderer fehler.
Code: |
Dim TConnected as Integer = 0
'verbindung herstellen
Dim RV as TSNEPlay_GURUCode = TSNEPlay_ConnectToServer(...)
If RV = TSNEPlay_NoError Then
Dim XTot as Double = Timer() + 60
Do Until InKey() = Chr(27)
Select Case TSNEPlay_Connection_GetState()
Case TSNEPlay_State_Disconnected: Exit Do
Case TSNEPlay_State_Ready: TConnected = 1
End Select
Sleep 1, 1
If XTot < Timer() Then Exit Do
Loop
If TSNEPlay_Connection_GetState() = TSNEPlay_State_Ready Then TConnected = 1
End If
If TConnected = 0 Then
Print "Konnte verbindugn nicht herstellen! Etabliere Server!"
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
End If
|
So sollte das recht easy und safe vonstatten gehen.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 06.01.2013, 15:05 Titel: |
|
|
ich bekomm das nicht gebacken
ich hab den code so verstanden... ist der server auf pc a nicht erreichbar dann wird der client auf pc b selbst zum server.
pc a als server erreichbar funzt aber wenn nicht dann meldung : [ERROR] NOT READY
Code: | screen 18
DIM SHARED AS STRING ServerAdresse
DIM SHARED AS STRING newmail
newmail = ""
DIM SHARED AS Ushort ServerPort
input "Serveradresse: "; ServerAdresse
input "Port: "; ServerPort
print "CLIENT - Meldung eingeben; anschliessend beenden mit ESC"
' ***** Netzwerkverbindung *****
#include once "tsneplay_v3.bi"
sub TSNEPlay_ConnectionState(byval von as uinteger, byval state as TSNEPlay_State_Enum)
' Rückmeldung für einen Spieler über seinen Status
end sub
sub TSNEPlay_Player_Connected(byval id as uinteger, IPA as string, nick as string)
' Spieler wurde verbunden
print id & " hat die Verbindung hergestellt"
end sub
sub TSNEPlay_Player_Disconnected(byval id as uinteger)
' Spieler wurde getrennt
print id & " hat die Verbindung abgebrochen"
end sub
sub TSNEPlay_Message(byval von as uinteger, byval zu as uinteger, byval nachricht as string, _
byval typ as TSNEPlay_MessageType_Enum)
'Ein Spieler hat uns / allen eine Nachricht geschickt
print "Nachricht von " & von & ": " & nachricht
? "NachrichtenTyp: " & typ
? "Nachricht an " & zu
newmail = nachricht
end sub
sub TSNEPlay_Move(byval von as uinteger, byval zu as uinteger, byval typ as double, _
byval x as double, byval y as double, byval r as uinteger)
' Spielzug
end sub
sub TSNEPlay_Data(von as uinteger, zu as uinteger, daten as string)
' Meldung vom Programmierer
end sub
' Aufbau der Verbindung
Dim TConnected as Integer = 0
'verbindung herstellen
Dim RV as TSNEPlay_GURUCode = TSNEPlay_ConnectToServer(ServerAdresse, ServerPort, "Client", "geheimesPasswort", _
@TSNEPlay_ConnectionState, @TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, _
@TSNEPlay_Message, @TSNEPlay_Move, @TSNEPlay_Data)
If RV = TSNEPlay_NoError Then
Dim XTot as Double = Timer() + 6
Do Until InKey() = Chr(27)
Locate 1, 40: ? "Bereit in " & XTot - TIMER()
Select Case TSNEPlay_Connection_GetState()
Case TSNEPlay_State_Disconnected: Exit Do
Case TSNEPlay_State_Ready: TConnected = 1
End Select
Sleep 1, 1
If XTot < Timer() Then Exit Do
Loop
If TSNEPlay_Connection_GetState() = TSNEPlay_State_Ready Then TConnected = 1
End If
If TConnected = 0 Then
Print "Konnte verbindugn nicht herstellen! Etabliere Server!"
RV = TSNEPlay_CreateServer(10, ServerPort, "Server", "geheimesPasswort", @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): sleep:End -1
End If
' Daten an den Server schicken
dim as string eingabe
do
sleep 1
eingabe = inkey
IF newmail <> "" THEN locate 1, 40: ? "1 neue Mail!"
if eingabe <> "" then TSNEPlay_SendMSG(0, "" & eingabe)
loop until eingabe = chr(27) |
|
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 06.01.2013, 15:20 Titel: |
|
|
Hi.
Das liegt an einem Kleinen Bug in TSNEplay ...
als Abhilfe kannst du entweder die [TSNEplay_V3.bi erneut herunterladen, oder du machst vor dem create server ein "TSNEPlay_CloseAll()".
Beim Aufruf der connect oder server function wird, bei fehlerhaftem verbindungsaufbau der "verbindungsstatus" nicht zurück gesetzt. das führt dazu, das ein erneuter aufruf mit der meldung "[ERROR] Not Ready! Conection Already Exist! Close all connections!" Abbricht. Denn, 2 Verbindungen über TSNEplay sind gleichzeitig nicht möglich (und war auch nie vorgesehen (Ist ja nur ein kleines help-schnipsel)).
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 06.01.2013, 15:35 Titel: |
|
|
super danke.
Habs neu geladen. Der Error kommt nun nicht mehr nur das er den Server etabliert. Doch leider meine Eingaben nicht angezeigt... kann es sein das die SUBs neu geladen werden müssen bzw TSNE neu mitgeteilt? |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 06.01.2013, 15:52 Titel: |
|
|
Nun .. das liegt daran, weil auf vielfachen wunsch der community ich ein Flag in die TSNEPlay_CreateServer Funktion eingebaut habe, das verhindert, das ein localer client erzeugt wird.
Um dem Server auch einen localen Clienten hinzuzufügen, musst du am ende der Funktion noch ein ",0" hinzufügen.
Code: |
RV = TSNEPlay_CreateServer(10, ServerPort, "Server", "geheimesPasswort", @TSNEPlay_ConnectionState, _
@TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, @TSNEPlay_Message, @TSNEPlay_Move, _
@TSNEPlay_Data, 0)
|
Hiermit weist du der funktion zu, das "nicht hinzufügen" zu ignorieren, und einen lokalen clienten zu erzeugen.
Dann sollte es funktionieren.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 06.01.2013, 18:09 Titel: |
|
|
ja danke so geht es.
nochmal eine kleine zwischen frage.
wenn das programm mit END -1 beendet wird ist das wie eine info ans betriebssystem das ein fehler aufgetreten ist und es die Variablen aus dem arbeitsspeicher löschen soll/muss ? |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 06.01.2013, 18:12 Titel: |
|
|
Das Betriebssystem >sollte generell< beim beenden eines Programmes (egal welcher returncode (end ...)) den speicher welcher zu diesem programm gehört, und von diesem eingeholt wurde, wieder leeren.
Windows hat da aber manchmal so seine macken, und macht dies nicht anständig.
Bei Linux ist mir das zwar auch schon untergekommen, allerdings in extrem seltenen fällen.
GENERELL sollte der Programmierer dafür sorgen, das vor dem Ende des Programmes auch der von Ihm erzeugte Speicher wieder freigegeben wird.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 06.01.2013, 18:51 Titel: |
|
|
oha ok... bis jetzt hab ich immer alles was ich gemacht habe nur mit End beendet. gut zu wissen |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 06.01.2013, 19:00 Titel: |
|
|
Noch als anmerkung. Das gilt bei Freebasic NUR für die "Allocate" oder "CAllocate" Funktionen.
Alles andere wie "Dim bla...." usw. wird von Freebasic selbst wieder aufgeräumt.
Nur speicher der mit Allocate oder C... erzeugt wurde, wird von freebsic nicht mehr aufgeräumt.
Du brauchst also Dim's nicht "aufräumen" (was auch nicht funktioniert)
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 06.01.2013, 19:08 Titel: |
|
|
achso ok |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 11.01.2013, 16:36 Titel: |
|
|
gibt TSNE eigentlich ne Meldung zurück wenn der PC momentan keine I-net Verbindung hat? wenn ja wie kann ich diese Meldung abfangen.
Und dann wollt ich nochmal fragen, ich hatte vor ein paar Tagen einen Thread gelesen in dem es um externe Verbindungen ging.
Also im Heimnetz ist alles super PC Name eingeben und Verbindung steht. Und wenn ich mich mit einem Freund verbinden möchte, muss ich ich lediglich seine Externe IP kennen und eingeben? |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 11.01.2013, 16:42 Titel: |
|
|
Nein. TSNE kann nicht erkennen, ob eine I-Net verbindung besteht.
Du könntest das allerdings in kombination mit der erkennung der WAN-IP-Adresse kombinieren.
Da du / dein gegner die WAN-IP-Adresse benötigt, um über das Internet eine Verbindung herstellen zu können, kannst du folgenden Source nutzen, um die WAN-IP Adresse zu ermitteln.
Wenn diese ermittelt wurde, ist damit auch sichergestellt, das du derzeit, bzw. zum zeitpunkt der abfrage der WAN-IP, auch eine Inet verbindung besteht / bestand.
http://www.freebasic-portal.de/porticula/testgetwanipa-bas-1229.html
Alternativ kannst du die Erweiterung von TSNE (TSNEX) einbinden und die Funktion TSNEX_GetWANIPA() aufrufen. Diese ermittelt dir ohne das ganze geschnörkerl ausenrum die WAN IP-Adresse. Allerdings erhöht sie auch den source und damit die binäri gröse. (was bei einer solch kleinen funktion eigentlich etwas too much is)
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 11.01.2013, 19:59 Titel: |
|
|
Danke für die schnelle Antwort... doch leider muss ich mich dem später widmen. Es hat sich ein Problem aufgetan.
Auf PC 2 läuft der Server und PC 1verbindet sich. Programm auf PC 1 läuft und zeigt auch die eigenen Eingaben an. Gebe ich jetzt wahllos mehrere Buchstaben ein reagiert das Programm nach ca 10 - 20 Eingaben nicht mehr.
Programm
Code: |
'DIMs für TSNE
DIM SHARED AS STRING ServerAdresse
DIM SHARED AS INTEGER iVerbindung
'Function
DIM SHARED AS STRING TxtArray (10)
DIM SHARED AS INTEGER MaxTxtLen
'Programm
DIM SHARED AS INTEGER i, ze, Auswahl
DIM SHARED AS STRING newmail
DIM SHARED AS STRING Eingabe, Txt, Txt2
DIM SHARED AS INTEGER w, h, depth, wh
newmail = "": Txt = ""
DIM SHARED AS STRING *15 PMPartner
DECLARE FUNCTION TxtF (Txt AS STRING, MaxTxtLen as Integer, Txt2 AS STRING) AS STRING
'[Txt = Rückgabe][MaxTxtLen = Länge der Eingabe][Txt2 = Text an den angeschlossen wird]
#include ONCE "vbcompat.bi"
#include ONCE "autowrite.bi"
#include ONCE "vbcompat.bi"
#INCLUDE ONCE "fbgfx.bi"
#Include Once "windows.bi"
ScreenControl FB.GET_DESKTOP_SIZE, w, h 'Desktopauflösung auslesen
SCREENRES w -1 , h - 1, 32,, FB.GFX_SHAPED_WINDOW or FB.GFX_ALWAYS_ON_TOP
Color ,&hFF00FF: CLS
'###################### anlegen einer PC Liste #################################
Close
IF NOT FileExists ("PcListe.dat") THEN
autowrite (&haaAAaa, 10, 25, "Verbindung eintragen (Pc Name)")
Auswahl = 1
Do
Sleep 1
Eingabe = InKey
SELECT CASE RIGHT(Eingabe, 1)
CASE CHR(77) 'rechts
Auswahl += 1
IF Auswahl > 10 THEN Auswahl = 1
Eingabe = ""
CASE CHR(75) 'links
Auswahl -= 1
IF Auswahl < 1 THEN Auswahl = 10
Eingabe = ""
END SELECT
IF Eingabe <> "" THEN TxtArray(Auswahl) = TxtF(Txt, 15, TxtArray(Auswahl)) 'Function Txt += Eingabe
ze = 45
ScreenLock
FOR i = 1 TO 10
Line (8, ze - 2) - STEP(120, 10),&hFFFFFF ,BF: autowrite (&h000000, 10, ze, STR(i) & ". " + TxtArray(i))
IF Auswahl = i THEN Line (8, ze - 2) - STEP(120, 10),&hAAcccc ,b
ze += 20
NEXT i
ScreenUnLock
Loop until Eingabe = chr(13)
IF Txt <> "" THEN
OPEN EXEPATH + "\PcListe.dat" FOR RANDOM AS #1 LEN=LEN(PMPartner)
For i = 1 TO 10
PMPartner = TxtArray(i): PUT #1, i, PMPartner
Next i
Close
ELSE
END
END IF 'Txt <> ""
END IF 'NOT FileExists ("PcListe.dat")
'######################### Optionen u. Verbindungen laden ######################
OPEN EXEPATH + "\PcListe.dat" FOR RANDOM AS #1 LEN=LEN(PMPartner)
For i = 1 TO 10
GET #1, i, PMPartner
TxtArray(i) = PMPartner
Next i
' ***** Netzwerkverbindung *****
CLS
#include once "tsneplay_v3.bi"
dim shared RV as TSNEPlay_GURUCode
sub TSNEPlay_ConnectionState(byval von as uinteger, byval state as TSNEPlay_State_Enum)
' Rückmeldung für einen Spieler über seinen Status
end sub
sub TSNEPlay_Player_Connected(byval id as uinteger, IPA as string, nick as string)
' Spieler wurde verbunden
print id & " hat die Verbindung hergestellt"
end sub
sub TSNEPlay_Player_Disconnected(byval id as uinteger)
' Spieler wurde getrennt
print id & " hat die Verbindung abgebrochen"
end sub
sub TSNEPlay_Message(byval von as uinteger, byval zu as uinteger, byval nachricht as string, _
byval typ as TSNEPlay_MessageType_Enum)
'Ein Spieler hat uns / allen eine Nachricht geschickt
print "Nachricht von " & von & ": " & nachricht
? "NachrichtenTyp: " & typ
? "Nachricht an " & zu
newmail = nachricht
end sub
sub TSNEPlay_Move(byval von as uinteger, byval zu as uinteger, byval typ as double, _
byval x as double, byval y as double, byval r as uinteger)
' Spielzug
end sub
sub TSNEPlay_Data(von as uinteger, zu as uinteger, daten as string)
' Meldung vom Programmierer
end sub
' Aufbau der Verbindung
Dim TConnected as Integer = 0
'verbindung herstellen
FOR iVerbindung = 1 TO 10
IF LEN(TxtArray(iVerbindung)) > 0 THEN
ServerAdresse = TxtArray(iVerbindung)
? "Verbinde mit " & ServerAdresse
RV = TSNEPlay_ConnectToServer(ServerAdresse, 1234, "Client", "geheimesPasswort", _
@TSNEPlay_ConnectionState, @TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, _
@TSNEPlay_Message, @TSNEPlay_Move, @TSNEPlay_Data) ' Port ist UShort
If RV = TSNEPlay_NoError Then
Dim XTot as Double = Timer() + 6
Do Until InKey() = Chr(27)
Locate 1, 40: ? "Bereit in " & XTot - TIMER()
Select Case TSNEPlay_Connection_GetState()
Case TSNEPlay_State_Disconnected: Exit Do
Case TSNEPlay_State_Ready: TConnected = 1
End Select
Sleep 1, 1
If XTot < Timer() Then Exit Do
Loop
If TSNEPlay_Connection_GetState() = TSNEPlay_State_Ready Then TConnected = 1:EXIT FOR
End If
END IF 'LEN(TxtArray(iVerbindung) > 0
NEXT iVerbindung
If TConnected = 0 Then
Print "Konnte verbindung nicht herstellen! Etabliere Server!"
RV = TSNEPlay_CreateServer(10, 1234, "Server", "geheimesPasswort", @TSNEPlay_ConnectionState, _
@TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, @TSNEPlay_Message, @TSNEPlay_Move, _
@TSNEPlay_Data, 0) ',0 weist der funktion zu, das "nicht hinzufügen eines lokalen clienten" zu ignorieren
If RV <> TSNEPlay_NoError Then Print "[ERROR] "; TSNEPlay_Desc_GetGuruCode(RV): sleep:End -1
End If
' Daten an den Server schicken
' z.B. TSNEPlay_SendMSG(0, "" & eingabe)
' ******************************* Programm Start *******************************
do
sleep 1
ScreenLock
LINE (w / 2 - 30, 1) - STEP (60, 9),&hABCD45,BF '&hABCD45
autowrite (&h00FF00, w / 2 - (4 * 6) + 1, 3,"postmail") '&h00FF00
ScreenUnLock
eingabe = inkey
IF newmail <> "" THEN locate 10, 3: ? "1 neue Mail!"
if eingabe <> "" then TSNEPlay_SendMSG(0, "" & eingabe)
loop until eingabe = chr(27)
'############################ Funktionen #######################################
FUNCTION TxtF (Txt AS STRING, MaxTxtLen AS Integer, Txt2 AS STRING) AS STRING
IF LEN(Eingabe) = 1 THEN
SELECT CASE ASC(Eingabe)
CASE IS = 8 'backspace
IF LEN(Txt2) = 0 THEN EXIT SELECT
Txt = MID(Txt2, 1, LEN(Txt2) - 1)
CASE IS = 13 'enter
CASE IS = 27 'ESC
CASE 48 TO 57 'zahlen 0-9
IF LEN(Txt2) = MaxTxtLen THEN EXIT SELECT
Txt = Txt2 + Eingabe
CASE 65 TO 90 'A-Z
IF LEN(Txt2) = MaxTxtLen THEN EXIT SELECT
Txt = Txt2 + Eingabe
CASE 97 TO 122 'a-z
IF LEN(Txt2) = MaxTxtLen THEN EXIT SELECT
Txt = Txt2 + Eingabe
CASE ELSE 'sonderzeichen (.,-/....)
IF LEN(Txt2) = MaxTxtLen THEN EXIT SELECT
IF ASC(Eingabe) = 129 THEN Eingabe = "ü"
IF ASC(Eingabe) = 154 THEN Eingabe = "Ü"
IF ASC(Eingabe) = 132 THEN Eingabe = "ä"
IF ASC(Eingabe) = 142 THEN Eingabe = "Ä"
IF ASC(Eingabe) = 148 THEN Eingabe = "ö"
IF ASC(Eingabe) = 153 THEN Eingabe = "Ö"
IF ASC(Eingabe) = 225 THEN Eingabe = "ß"
IF Eingabe = "," THEN Eingabe = "."
Txt = Txt2 + Eingabe
END SELECT
END IF 'LEN(keytxt)
Return Txt
END Function
|
autowrite.bi
Code: |
'version 20130107
'aufruf mit -> autowrite (,,,)
' [farbe &h000000][spalte 150][zeile 200][text "..."]
'Diese Routine beherscht nur die großschreibung - kleine Eingaben werden nur groß dargestellt
DECLARE SUB autowrite (c AS INTEGER,sp AS INTEGER,ze AS INTEGER,wort AS STRING)
SUB autowrite (c AS INTEGER,sp AS INTEGER,ze AS INTEGER,wort AS STRING)
DIM AS INTEGER i
DIM AS STRING bust
COLOR c
FOR i = 1 TO LEN(wort)
SELECT CASE wort[i-1]
CASE 65, 97'a
PSET (sp, ze + 4): DRAW "u3 e1 r2 d4 u2 l3"
CASE 132, 142, 196, 228' Ä-> '-'-> 196 ä-> õ-> 228
PSET (sp, ze + 4): DRAW "u2 e2 f2 d2 u2 l4 bu3 u-1 br4 d-1": sp = sp + 1
CASE 66, 98'b
PSET (sp, ze): DRAW "d4 r2 e1 h1 l1 r1 e1 h1 l2"
CASE 67, 99'c
PSET (sp + 3, ze): DRAW "l2 g1 d2 f1 r2"
CASE 68, 100'd
PSET (sp, ze): DRAW "d4 r2 e1 u2 h1 l2"
CASE 69, 101'e
PSET (sp + 3, ze): DRAW "l3 d2 r2 l2 d2 r3"
CASE 70, 102'f
PSET (sp + 3, ze): DRAW "l3 d2 r2 l2 d2"
CASE 71, 103'g
PSET (sp + 3, ze): DRAW "l2 g1 d2 f1 r2 u2 l1"
CASE 72, 104'h
PSET (sp, ze): DRAW "d4 u2 r3 u2 d4"
CASE 73, 105'i
PSET (sp + 2, ze): DRAW "d4"
CASE 74, 106'j
PSET (sp, ze): DRAW "r3 d3 g1 l1 h1"
CASE 75, 107'k
PSET (sp, ze): DRAW "d4 u2 r1 e2 g2 f2"
CASE 76, 108'l
PSET (sp, ze): DRAW "d4 r3"
CASE 77, 109'm
PSET (sp, ze + 4): DRAW "u4 f2 e2 d4"
CASE 78, 110'n
PSET (sp, ze + 4): DRAW "u4 f4 u4"
CASE 79, 111'o
PSET (sp, ze + 1): DRAW "d2 f1 r1 e1 u2 h1 l1"
CASE 148, 153, 214, 246 'Ö-> í-> 214 ö-> ÷-> 246
PSET (sp, ze + 2): DRAW "d1 f1 r1 e1 u1 h1 l1 bl1 bu2 d-1 br3 l-1"
CASE 80, 112'p
PSET (sp, ze + 4): DRAW "u4 r2 f1 g1 l1"
CASE 81, 113'q
PSET (sp, ze + 1): DRAW "d2 f1 r1 e1 f1 h1 u2 h1 l1": sp = sp + 1
CASE 82, 114'r
PSET (sp, ze + 4): DRAW "u4 r2 f1 g1 l1 f2"
CASE 83, 115's
PSET (sp, ze + 4): DRAW "r2 e1 h1 l1 h1 e1 r2"
CASE 84, 116't
PSET (sp, ze): DRAW "r2 d4 u4 r2"
CASE 85, 117'u
PSET (sp, ze): DRAW "d4 r3 u4"
CASE 129, 154, 220, 252'Ü-> _-> 220 ü-> ³-> 252
PSET (sp, ze - 1): DRAW "bd2 d3 r3 u3 bu2 r-1"
CASE 86, 118'v
PSET (sp, ze): DRAW "d2 f2 e2 u2": sp = sp + 1
CASE 87, 119'w
PSET (sp, ze): DRAW "d4 e2 f2 u4"
CASE 88, 120'x
PSET (sp, ze): DRAW "f4 h2 g2 e4"
CASE 89, 121'y
PSET (sp, ze): DRAW "d2 r3 u2 d4 l2"
CASE 90, 122'z
PSET (sp, ze + 1): DRAW "u1 r3 g3 d1 r3 u1"
CASE 49'1
PSET (sp + 2, ze + 4): DRAW "u4 g2"
CASE 50'2
PSET (sp, ze + 1): DRAW "e1 r1 f1 g3 r3"
CASE 51'3
PSET (sp, ze + 4): DRAW "r2 e1 h1 l1 r1 e1 h1 l2"
CASE 52'4
PSET (sp + 2, ze + 4): DRAW "u4 g2 d1 r3"
CASE 53'5
PSET (sp, ze + 4): DRAW "r2 e1 h1 l2 u2 r3"
CASE 54'6
PSET (sp + 2, ze): DRAW "l1 g1 d2 f1 r1 e1 h1 l1"
CASE 55'7
PSET (sp, ze + 1): DRAW "u1 r3 d1 g3"
CASE 56'8
PSET (sp, ze + 1): DRAW "f1 g1 f1 r1 e1 h1 e1 h1 l1"
CASE 57'9
PSET (sp + 2, ze + 2): DRAW "l1 h1 e1 r1 f1 d2 g1 l1"
CASE 48'0
PSET (sp, ze + 1): DRAW "d2 f1 r2 e1 u2 h1 l2"
CASE 225, 223'ß-> ¯-> 223
PSET (sp, ze + 5): DRAW "u5 r1 f1 d1 l1 r1 f1 g1"
CASE 37'%
PSET (sp, ze): PSET (sp + 4, ze + 4): PSET (sp, ze + 4): DRAW "e4": sp = sp + 2
CASE 62'>
PSET (sp + 1, ze + 4): DRAW "e2 h2"
CASE 60'<
PSET (sp + 4, ze + 4): DRAW "h2 e2"
CASE 47'/
PSET (sp, ze + 4): DRAW "e4"
CASE 92'\
PSET (sp + 4, ze + 4): DRAW "h4"
CASE 95'_
PSET (sp, ze + 4): DRAW "r4"
CASE 43'+
PSET (sp + 1, ze + 2): DRAW "r2 l1 u1 d2"
CASE 45'-
PSET (sp + 1, ze + 2): DRAW "r2"
CASE 46'.
PSET (sp + 2, ze + 4): DRAW ""
CASE 44',
PSET (sp + 2, ze + 4): DRAW "g1"
CASE 40'(
PSET (sp + 2, ze): DRAW "g1 d3 f1"
CASE 41')
PSET (sp + 2, ze): DRAW "f1 d3 g1"
CASE 63'?
PSET (sp + 1, ze + 1): DRAW "e1 r1 f1 g1 l1 d1 bd2 d-1"
CASE 58':
PSET (sp + 2, ze + 4): PSET (sp + 2, ze + 2)
CASE 32'" "
'SPACE sp = sp + 6
CASE ELSE
'
END SELECT
sp = sp + 6
NEXT i
END SUB
|
|
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 11.01.2013, 20:02 Titel: |
|
|
Es ist extrem wichtig, das du eingaben / ausgaben (text / grafik) per mutex sperrst. diese funktionen sind in der derzeitigen rtlib nicht threadsafe. da tsne / play auf threads bassiert, musst du entsprechend diese grafikoperationen sichern.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 11.01.2013, 21:32 Titel: |
|
|
ehrlich gesagt versteh ich nur die hälfte. Also um was geht ist klar. Nur die Umsetzung ist noch nicht ganz klar.
Ich versuchs mal anhand meines geposteten Code.
dieser Teil verwaltet eingehende Nachrichten und shreibt diese in die Variable newmail. Und hierbei muss ich jetzt sperren !?
Code: | sub TSNEPlay_Message(byval von as uinteger, byval zu as uinteger, byval nachricht as string, _
byval typ as TSNEPlay_MessageType_Enum)
'Ein Spieler hat uns / allen eine Nachricht geschickt
print "Nachricht von " & von & ": " & nachricht
MutexLock
newmail = nachricht
MutexUnlock
end sub |
Und hier soll newmail weiterverarbeitet oder ausgegeben werden
Code: | do
sleep 1
ScreenLock
LINE (w / 2 - 30, 1) - STEP (60, 9),&hABCD45,BF '&hABCD45
autowrite (&h00FF00, w / 2 - (4 * 6) + 1, 3,"postmail") '&h00FF00
ScreenUnLock
eingabe = inkey
MutexLock
IF newmail <> "" THEN locate 10, 3: ? "1 neue Mail!"
MutexUnlock
if eingabe <> "" then TSNEPlay_SendMSG(0, "" & eingabe)
loop until eingabe = chr(27) |
|
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|