TCP und UDP-Netzwerkverbindungen m?glich?

Previous topic - Next topic

EightBitWitch

Ich habe hier im Forum mal nach "Netzwerk" gesucht und einiges, oft sehr altes, gefunden. Bisher habe ich nur rauslesen k?nnen, das es "nur" die Netzwerkbefehle f?r die Kommunikation von glBasic-Spielen untereinander gibt.

Ich besch?ftige mich nun mit einem Projekt, bei dem ich ein 2D-Frontend (Sprites) f?r ein bestehendes MMOG erstellen m?chte. Bisher gibt es vom Spieleanbieter nur ein browserbasierendes Frontend f?r das Spiel, das den FlashPlayer bis zur "Bewusslosigkeit" qu?lt und auf ?lteren Rechnern (3+ Jahre mit Ein-Kern-CPU) das parallele laufen lassen von Teamspeak kaum mehr m?glich macht.

Wie die Kommunikation zwischen GameClient und GameServern l?uft, habe ich bereits vor einigen Monaten vollst?ndig "entschl?sselt",  so das ich bereits zum Test einen recht komplezen BOT erstellen konnte, der in dem Spiel gegen NPC- und Spielergegener gut bestehen kann und nur bei zahlenm?ssiger ?berlegenheit der Spielergegner verliert.
Den BOT habe ich in Visual Basic 9 (.Net) Express programmiert und das Projekt ist in den letzten vier Monate auf ?ber 7000 Codezeilen angewachsen.
Ich bin mit VB.Net recht gl?cklich, aber ich m?chte mein neues Frontend auch auf Linux und MacOS laufen lassen k?nnen, was bei VB.Net kaum m?glich ist.

F?r dieses Frontend ist es aber nun unumg?nglich, das es sich mit dem Gameservern per TCP verbinden kann.
Ich muss mich da zu einem Host X auf Port Y verbinden k?nnen und UTF-8 codierte Daten empfangen (und verarbeiten) k?nnen und Daten senden k?nnen, hier reicht dann eine ASCII-Codierung.
Daf?hrt mich noch zu der Frage, ob glbasic mit UniCode-Strings umgehen kann und diese auch darstellen kann. Die Strings sind dann nicht vordefiniert, sondern bestehen zum Teil aus Daten, die vom Gameserver gesendet werden.

Einfache Frage: Geht das mit glBasic? Auch unter Linux und MacOS

Passt nicht hier her aber muss ich auch wissen:
Geht Soft-Scrolling in X- und Y-Richtung? Ich habe ein Spielfeld von ca. 4000*3000 Pixel und einen sichtbaren Bereich von ca. 800*600 Pixel. Die Spielfigur ist in der Mitte und je nach Bewegungsrichtung muss das Spielfeld gescrollt werden. Oder muss man das im Hintergrund ?ber den Backpuffer und immer anders gew?hlten Ausschnitt - sowas wie Blitter(xs1,ys1,xs2,ys2, xd1,yd1) - aus einer Bitmap realisieren?

Gru?
Valerie

Kitty Hello

Ja, sicher!
Schau mal in der Hilfe f?r: SOCK_ und NET nach. Du wirst wohl SOCK brauchen. Das ist alles sehr einfach.

Schau mal unter "Netowkring for Cowards"
http://www.glbasic.com/forum/index.php?board=16.0

EightBitWitch

#2
Quote from: Kitty Hello on 2009-Jul-30
Ja, sicher!
Schau mal in der Hilfe f?r: SOCK_ und NET nach. Du wirst wohl SOCK brauchen. Das ist alles sehr einfach.

Schau mal unter "Netowkring for Cowards"
http://www.glbasic.com/forum/index.php?board=16.0

OK, SOCK habe ich gefunden (Hilfedatei im kostenlosen SDK) und es sieht tats?chlich sehr einfach aus - ?hnlich wie TcpClient unter VB.NET - sch?n.

ABER:
Wie sieht es mit der Unterst?tzung von UNICODE in Strings aus. In der Hilfe habe ich gelesen, das Strings nur mit ein Byte/Zeichen arbeiten.
Es ist nun so, das die Spielernamen, in dem MMOG f?r das ich ein neues Frontend erstellen m?chte, UTF-8 codiert ?bertragen werden, viele Sonderzeichen enthalten und so auch anzeigbar sein m?ssen. In VB.Net wandele ich die in UTF-8 kodierten in Unicode um und kann so mit ihren arbeiten.

UND:
Ich habe noch eine Frage bez?glich den mathematischen Funktionen.
Ich brauche die Funktion ArkusTangens mit zwei Argumenten (atan2) f?r eine Winkelberechnung eines Punktes auf einem Kreisumfang.

Auweia, ich hab noch ne Frage
Wie sieht es mit Multi-Threading oder (zumindest) timergesteuerten ausf?hren von Funktionen aus. F?r solche Sachen, die man fr?her, in den guten alten 8-Bit HomeComputer-Zeiten (ich bin Jg. 68) per Systemtimer- oder Vsync-Interrupt gemacht h?tte.
Es geht konkret darum, das ich st?ndig Daten vom SpielServer empfange und die in Datenstrukturen einpflegen muss, die dann den aktuellen Zustand der Spielumgebung beschreiben. Das sollte m?glichst in einem eigenen Thread oder timergesteuert mindestens zwei Mal pro Sekunde passieren. Oder eben auf Basis eines "TCP-ReceiveData"-Events, wobei die Daten dann in einer Event-Prozedur verarbeitet werden. Auf Basis der Daten in diesen Datenstrukturen soll dann sooft wie m?glich die Spielwelt auf dem Bildschirm dargestellt werden (50 Mal pro Sekunde ist aber v?llig ausreichend). Auch mein BOT nutzt diese Datenstrukturen um sich zu orientieren und seine n?chste Aktion zu planen und Gefahren sofort zu erkennen.
Es hat sich gezeigt, das eine serielle Abfolge - Daten empfangen - Bewerten - Aktion ausl?sen - nicht optimal ist und zu sehr komplizierten und un?bersichtlichen Code f?hrt, der auch kein optimales zeitliches Verhalten hat.
Ich habe diesen Ansatz bereits unter VB.NET in der ersten Version meines BOT ausprobiert und er ist v?llig untaglich. Multi-Threaded funktioniert es tadellos und ist auch sehr einfach zu warten und zu erweitern.


Kitty Hello

UFT-8 ist ja sch?n, weil es einfach nur ein 8-bit string ist (wie bei GLBasic), aber manchen Sonderzeichen eben als 2-byte codiert werden.
Das Problem hier wird sein, wie Du die Namen darstellen willst. GLBasic Grafik-Fonts k?nnen nur 256 Zeichen. Der volle Unicode Zeichensatz geht als Bitmap nicht, weil das mehrere MB gro?e Bitmaps w?ren.

Was willst Du genau machen, dann kann ich helfen die richtige L?sung zu finden.

EightBitWitch

#5
Quote from: Moru on 2009-Jul-30
ATAN2:
http://www.glbasic.com/forum/index.php?topic=2744.0

Ich bin mathematischer Laie und daher die Frage: Geht das tats?chlich mit der Korrektur bei negative Winkeln?
Code (glbasic) Select
FUNCTION angleBetweenPoints:ax,ay,ex,ey
LOCAL angle

angle=ATAN(ey-ay,ex-ax)
IF angle<0.0
angle=180.0+(180.0+angle)
ENDIF

RETURN angle
ENDFUNCTION


EDIT:
Leider ist die Hilfe in Bezug auf ATAN() nicht sehr ausf?hrlich bzw. es gibt gar keine Erl?uterung, sonst w?re ich evtl. selbst drauf gekommen.

EightBitWitch

#6
Quote from: Kitty Hello on 2009-Jul-30
UFT-8 ist ja sch?n, weil es einfach nur ein 8-bit string ist (wie bei GLBasic), aber manchen Sonderzeichen eben als 2-byte codiert werden.
Das Problem hier wird sein, wie Du die Namen darstellen willst. GLBasic Grafik-Fonts k?nnen nur 256 Zeichen. Der volle Unicode Zeichensatz geht als Bitmap nicht, weil das mehrere MB gro?e Bitmaps w?ren.

Was willst Du genau machen, dann kann ich helfen die richtige L?sung zu finden.

Ich muss die Namen der Spieler und deren Clans (in WOW w?ren das Gilden) originalgetreu, also mit allen Sonderzeichen (Auch kyrillische, t?rkische und griechische Zeichen) auf dem Bildschirm darstellen k?nnen. Das sollte auch sehr schnell gehen, da die Spielfiguren st?ndig in schneller Bewegung sind und ihren Namen immer "mitf?hren". Welche Zeichen/Namen wann und wo auftauchen kann ich in keine Weise voraussehen. Gibt es f?r Windows/Linux/MacOS keine Font-Unterst?tzung ala TrueType? Ist ok das es das nicht auf den Spielkonsolen gibt, aber das sind auch nicht meine Zielplattformen.
Welche(s) Grafik-Engine/Framework nutzt glBasic? Gibt es evtl die M?glichkeit Font-Funktionen direkt anzusprechen, auch wenn der Code dann nicht mehr 100% X-Plattform-f?hig ist? Damit k?nnte ich leben, da nur ein kleiner Teil des Programmes angepasst w?rden m?sste und evtl. ?ber bedingte Kompilierung (abh?ngig von der Zielplattform)  realisiert werden k?nnte.

Kitty Hello

Wenn Du auf Win bleibst, ist das kein Problem. Da bekommt man den Text sicher hin.

EightBitWitch

Aber die Forderung ist: Windows, Linux und MacOS

Kitty Hello

Da wird unicode schon schwer. Hm. m?sste man eine TTF Lib einbinden, wie GLFT.