BlitzBasic3D UDP Chat mit Umfangreicher Doku. von ???
Hallo.

Das ist ein BlitzBasic3D UDP Chat mit Umfangreicher Dokumentation wie man am Code erkennen kann. Also für anfänger am besten geeignet.

Den code habe ich auf bitten von Suco-X geschrieben. Also viel spaß noch. :)

[code:1:ba5b01c08c]Global Chat_Eingabe$ = "" ; In dieser Variable wird alles gespeichert was der User eingibt.
Global Cursor_Blinkt ; 1 = Cursor ist momentan sichtbar. 0 = unsichtbar.
Global Cursor_Timer ; Diese Zeitvariable ist für den Cursort bestimmt.

; Diese Verbindungs-Variablen müssen auch innerhalb der Funktionen verfügbar sein:
Global Verbindung, Andere_Verbindung_Port, Andere_Verbindung_IP

; Die Namen der Chatter müssen natürlich auch innerhalb der Funktionen verfügbar sein:
Global Chat_PartnerName$, Chat_Name$

Type TextZeile ; Hier wird ein Datenfeld Deklariert.
Field DerText$ ; mit der String-Variable DerText$, und ...
Field Farbe ; der Farb-Integer-Variable.
End Type

Print "Kleiner UDP Chat."
Print "-----------------"
Print
Print "1. Host"
Print "2. Join"
Chat_Modus = Input()
; Hier kommt der Quellcode für den Host hin.
If Chat_Modus = 1 Then
; Nach einen Chat name abfragen.
Print
Chat_Name$ = Input$("Bitte geben Sie ihr Chat name ein: ")
Print

Verbindung = CreateUDPStream()
If Not Verbindung Then ; Wenn keine Verbindung hergestellt werden konnte.
; Fehlermeldung ausgeben.
Print
Print "Es konnte keine Verbindung hergestellt werden. Bitte drücken Sie eine Taste."
WaitKey ; Auf tastendruck warten
End ; Programm Beenden
End If

Verbindung_Port = UDPStreamPort(Verbindung) ; Port von der geöffnete verbindung auslesen.
Verbindung_IP_String$ = ip$() ; Eine Funktion aufrufen, dass die IP ausliest.

Print
Print "Verbindung wurde hergestellt."
Print
Print "Deine IP: " + Verbindung_IP_String$
Print "Dein Port: " + Verbindung_Port

; Nun soll auf einen Chatpartner gewartet werden.
Print
Print "Warte auf Chatpartner ... || Abbruch mit der ESC-Taste"

; Eine Schleife "für immer" einrichten.
Repeat
If KeyDown(1) Then
; Abbruch meldung bringen, und auf Tastendruck warten um schließlich zu Beenden.
Print "Chat versuch abgebrochen. Programm wird nach einen Tastendruck Beendet."
WaitKey
End
End If

If RecvUDPMsg(Verbindung) Then ; Auf einsendung warten.
If ReadAvail(Verbindung) Then ; Ein Packet annehmen.
If ReadByte(Verbindung)=1 Then ; Wenn das Prüf-Signal Positiv ist, dann fortsetzen
Chat_PartnerName$ = ReadLine$(Verbindung) ; Partner Name auslesen.
Andere_Verbindung_IP = UDPMsgIP(Verbindung) ; Partner IP auslesen.
Andere_Verbindung_Port = UDPMsgPort(Verbindung) ; Partner Port auslesen.

WriteByte Verbindung, 1 ; Eine bestätigung senden.
WriteLine Verbindung, Chat_Name$ ; Anbei auch den Namen.
SendUDPMsg Verbindung, Andere_Verbindung_IP, Andere_Verbindung_Port ; Nun alles absenden.

Exit ; hauptschleife verlassen und fortsetzen.
End If
End If
End If
Forever
ElseIf Chat_Modus = 2 Then
; Nach einen Chat name abfragen.
Print
Chat_Name$ = Input$("Bitte geben Sie ihr Chat name ein: ")

; IP und Port abfragen zu dem später eine verbindung aufgebaut werden soll.
Print
Print "Bitte geben sie folgende Daten ein, um mit einen User Chatten zu können:"
Print
Andere_Verbindung_IP_String$ = Input("Die IP: ") ; IP abfragen
Andere_Verbindung_Port = Input("Das Port: ") ; Port abfragen
Andere_Verbindung_IP = ipint(Andere_Verbindung_IP_String$) ; IP-String in einen IP-Integer umwandeln.

; Nun eine normale UDP Verbindung aufbauen.
Print
Print "Bitte haben Sie etwas gedult. Es wird momentan eine Verbindung aufgebaut."
Verbindung = CreateUDPStream()
Verbindung_Port = UDPStreamPort(Verbindung) ; Port von eigener verbindung auslesen.

; Anmeldungsdaten zum Hoster zusenden.
WriteByte Verbindung, 1 ; Anmelde Signal senden.
WriteLine Verbindung, Chat_Name$ ; Sein eigener Name senden.
SendUDPMsg Verbindung, Andere_Verbindung_IP, Andere_Verbindung_Port ; Nun alles absenden.

; Nun mit einer bestimmte Zeit auf einen Rückmeldung warten. Abbruch durch ESC möglich.
Aktuelle_Zeit = MilliSecs() ; Die Aktuelle Zeit
Repeat
If RecvUDPMsg(Verbindung) Then ; Auf einsendung warten.
If ReadAvail(Verbindung) Then ; Ein Packet annehmen.
If ReadByte(Verbindung)=1 Then ; Wenn das Prüf-Signal Positiv ist, ...
Chat_PartnerName$ = ReadLine$(Verbindung)
Exit ; ... dann hauptschleife verlassen und fortsetzen.
End If
End If
End If

If KeyDown(1) Or MilliSecs() > Aktuelle_Zeit + 4000 Then
; Abbrech meldung bringen, und auf Tastendruck warten um schließlich zu Beenden.
Print "Verbindungs versuch abgebrochen. Programm wird nach einen Tastendruck Beendet."
WaitKey
End
End If
Forever
End If

; Hauptschleife des Chats beginnen.
Repeat
DatenEmpfangen() ; Hier werden die Daten empfangen und zur weiter bearbeitung geschickt.
ChatEingabe() ; Hier wird der Cursor der Chat Eingabe geregelt, und die eingaben selber.
AllesZeichnen() ; Hier wird der Bildschirm Aktualisiert. Also muss alles neu gezeichnet werden.

If KeyDown(1) Then Exit ; Wenn die ESCAPE Taste gedrückt wird, dann wird die Schleife und somit das Programm beendet.
Forever

; Diese Funktion sorgt dafür, dass alle empfangene Daten richtig verwaltet wird.
Function DatenEmpfangen()
If RecvUDPMsg(Verbindung) Then ; Auf einsendung warten.
If ReadAvail(Verbindung) Then ; Ein Packet annehmen.
Packet_Art = ReadByte(Verbindung) ; Die Art des Packets auslesen.
If Packet_Art=1 Then ; Wenn das Packet ein Text-Packet ist, dann ...
DerText$ = ReadLine$(Verbindung) ; ... das Text auslesen, und ...
TextZeileEinfuegen(Chat_PartnerName$ + "> " + DerText$) ; ... in der Chat-Konsole hinzufuegen.
End If
End If
End If
End Function

; Diese Funktion fügt einen Text in der Chat-Konsole ein.
Function TextZeileEinfuegen(DerText$, Farbe = 1) ; Farbe ist Optional und Standartmäßig auf 1
TextZeile.TextZeile = New TextZeile ; Neues Datenfeld für eine Text Zeile einrichten.
TextZeileDerText$ = DerText$ ; Nun den Text für dieses Datenfeld zuweisen.
TextZeileFarbe = Farbe ; Nun die Farbe für diese Datenfeld-Zeile zuweisen.
End Function

; Hier wird der Cursor der Chat Eingabe geregelt, und die eingaben selber.
Function ChatEingabe()
; Wenn der Cursor über eine halbe sekunde un-/sichtbar ist, ...
If MilliSecs() > Cursor_Timer + 500 Then
Cursor_Blinkt = Cursor_Blinkt Xor 1 ; ... Cursor un-/sichtbar machen, ...
Cursor_Timer = MilliSecs() ; und die Cursor_Timer auf die momentane Zeit setzen.
End If

; Knopf Anschlag von der Tastatur Speichern.
Momentane_Eingabe = GetKey()

If Momentane_Eingabe>31 Then ; Wenn ein Knopf getätigt wurde, dann ...
EingabeZeichen$ = Chr(Momentane_Eingabe) ; ... eingabe in ein Zeichen umwandeln und ...
Chat_Eingabe$ = Chat_Eingabe$ + EingabeZeichen$ ; an der eingabe hinzufügen.
End If

If Momentane_Eingabe = 13 Then ; Prüft ob die Eingabetaste auf der Tastatur bestätigt wurde.
SendeZumPartner(Chat_Eingabe$) ; Hier wird eine Funktion aufgerufen, dass den Text zum Partner Sendet.
TextZeileEinfuegen(Chat_Name$ + "> " + Chat_Eingabe$, 2) ; Die eigene eingabe in der eigene Konsole, als Zeile mit einer anderen Farbe, einfügen.
Chat_Eingabe$ = "" ; Hier wird die eingabe geleert.
End If
End Function

; Diese Funktion sendet eine Variable als Text zum Partner
Function SendeZumPartner(DerText$)
WriteByte Verbindung, 1 ; Dieser Signal deutet darauf hin, dass der inhalt dieses Packets ein Text ist.
WriteLine Verbindung, DerText$ ; Nun wird der eigentliche Text zum Packaget angefügt.
SendUDPMsg Verbindung, Andere_Verbindung_IP, Andere_Verbindung_Port ; Nun alles absenden.
End Function

; Diese Funktion Zeichnet alles auf den Bildschirm.
Function AllesZeichnen()
Cls ; Bildschirmseite leeren
Color 255, 255, 255 ; Anfangsfarbe auf weis setzen.

; Chat eingabe anzeigen. Dabei muss aber beachtet werden ob der Cursor momentan sichtbar ist.
If Cursor_Blinkt Then
Text 5, 5, Chat_Eingabe$ + "_" ; Chat eingabe mit dem Cursor anzeigen.
Else
Text 5, 5, Chat_Eingabe$ ; Chat eingabe ohne den Cursor anzeigen
End If

; Nun werden die Textzeilen angezeigt.
AngezeigteTexte = 0 ; Die anzahl der gezeigten Texte werden auf Null gesetzt.
For TextZeile.TextZeile = Each TextZeile ; Hier wird jede Textzeile durchgegangen.
; Hier wird die Farbe eingenommen, die für diese Text Zeile Definiert ist.
If TextZeileFarbe = 1 Then Color 255, 255, 0 ; Wenn die Farbe auf 1 Definiert ist, dann soll diese Zeile Gelb angezeigt werden.
If TextZeileFarbe = 2 Then Color 255, 255, 255 ; Wenn die Farbe auf 2 Definiert ist, dann soll diese Zeile Weis angezeigt werden.

Text 5, 25 + AngezeigteTexte * 15, TextZeileDerText$ ; Jede Textzeile anzeigen.
AngezeigteTexte = AngezeigteTexte + 1 ; Anzahl der angezeigten Texten um 1 erhöhen.
Next ; Durchgang Beenden.

Flip ; Bildschirmseiten austauschen
End Function


; IP Integeter in einen üblichen IP-String umwandeln.
Function ip$(inte=0)
ips=CountHostIPs("") ; Anzahl der offenen IPs am Computer auslesen.
If Not ips Then Return 0 ; Wenn kein geöffnet, dann 0 zurück liefern.
ip=HostIP(ips) ; Die IP als Integer von der momentane Verbindung rausfiltern.
If inte=1 Then Return ip ; Wenn die Option inte gesetzt ist, dann wird die IP im form eines Integer zurück geliefert.
ipstr$=DottedIP(ip) ; Im weiteren verlauf, falls die Option inte nicht gesetzt ist, das Integer in einen String umwandeln.
Return ipstr$ ; Wert zurückliefern.
End Function

; Hier wird ein IP-String in einen IP-Integer umgewandelt.
Function ipint(umwandeln$)
; Alle Daten in Temporäre Abschnitten unterteilen um das Integer zu berechnen.
teil1 = Instr(umwandeln$,".")
teil2 = Instr(umwandeln$,".",teil1+1)
teil3 = Instr(umwandeln$,".",teil2+1)
temp1 = Mid(umwandeln$,1,teil1-1)
temp2 = Mid(umwandeln$,teil1+1,teil2-1)
temp3 = Mid(umwandeln$,teil2+1,teil3-1)
temp4 = Mid(umwandeln$,teil3+1)

; IP Integer berechnen.
zurueck = (temp1 Shl 24) + (temp2 Shl 16) + (temp3 Shl 8) + temp4

; Wert zurück liefern.
Return zurueck
End Function[/code:1:ba5b01c08c]

cu
===
von ???
Nicht schlecht.
Aber ich farge mich rstens wieso du nicht auf vorhandene UDP L!GHTBRARIES zugreifst und 2. was das mit "3D" zu tun hat?!?!
===
von ???
Naja. Da es BlitzBasic2D "nicht mehr gibt", gibt es ja nur noch BlitzBasic3D. Und damit kann man eben auch 2D machen.

Außerdem: was ist UDP L!GHTBRARIES ? - Ich nutze solche Libarys nie, sondern Code selber.

Das ist erstens Code-Optimierter, und man kann selber Optimiert einen Code erweitern.

cu
===
von ???
Das solte ne anspielung sein aus CodeMasters project "UDP L!GHT". Isn ne library feru UDP.
===
von ???
Sieht nett aus.

@Sparx: Für sowas einfaches braucht man keine Library.
===
von sucox /
geht das eigentlich nicht auch kürzer? wir können ja einen wettbewerb machen, wer das größte Spiel mit dem wenigsten quellcode codet... dann darf man zb. nur die blitzbasicx standart befehle verwenden wie input und nicht gleich ne input routine schreiben...
===
von ???
Lasse: In dem fall würde ich aber eine eigene input routine schreiben, um über die Daten verwalten zu können, die bei mir rein kommen. :)

Zum anderen ist es kein Spiel, sondern ein Chat. Was wiederrum nicht heißen soll, dass deine nicht Idee gut ist.

cu



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: