Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

1

12.08.2013, 21:30

[Tilenet] Eine Tile streaming Library

Hi,

Ich bin jetzt schon fast 6 Jahre angemeldet, habe aber noch nie ein Projekt veröffentlicht :(. Das will ich heute mal ändern ;).

Über Tilenet

Tilenet ist eine kleine Library, die es ermöglichen soll, ein Spiel lediglich serverseitig zu programmieren und dann den Inhalt zum Spieler (dem Client) zu "streamen".
Die Grafik ist dabei allerdings auf kleine Rechtecke (Tiles) begrenzt, die auf so genannte Layer gesetzt werden. Ein oder mehrere Layer können dann einem oder mehreren
Spielern zugewiesen werden. Diese sehen dann den entsprechenden Inhalt in einem Fenster. Zur Auswahl stehen verschiedene Tiles:

  • Ein NullTile, welches einfach nur ein Platzhalter ist.
  • Ein CharTile, mit dem man Text darstellen kann.
  • Und ein StdTile, mit dem dann Graphiken angezeigt werden können.

Setzt der Server StdTiles ein, gibt er lediglich einen Namen für das entsprechende Tile an (z.B. "tree" für einen Baum). Der Client wiederum lädt dann ein Paket, welches dann den Namen Grafiken zuweist.
Besonders angenehm ist es, dass man anstatt Graphiken erstmal die Standardzeichen aus der Konsole verwenden kann. So kann man erstmal an dem Spiel arbeiten, ohne gleich die Graphiken zu erstellen.

Tastatur Events werden vom Client zum Server versendet.

Samples

Zum testen und ausprobieren habe ich zwei Samples erstellt. Einmal ein Vier gewinnt und Multi-explore, ein kleiner Test auf dem viele Spieler als Smileys über eine Insel laufen können.
Beide Samples könnt ihr hier runterladen.

Vier gewinnt


(Link)



(Link)


Wie man sieht, wurden hier keine Grafiken benutzt, sondern lediglich die eingebauten Konsolenzeichen verwendet.

Multi-explore

Einmal mit Ascii-Grafik:

(Link)


Und einmal mit Grafiken, die ich aus einem Grafikpack für Dwarf Fortess (Ironhand) habe:

(Link)


(Bei den samples liegen .bat datein, mit denen ihr die packete auswählen könnt)

Idee

Tja... wie sovieles ist auch mir die Idee zu dieser Library gekommen, als ich es endlich geschaft hatte, dass meine Zwerge in Dwarf Fortress ein bisschen länger als das erste Jahr überlebten :)
Dieses Spiel, obwohl die Graphik nicht gerade sehenswert ist, hat doch vom Inhalt so viel zu bieten, wie kaum ein anderes Spiel. Und wer hat sich noch nicht gewünscht, Dwarf Fortress im Multiplayer zu spielen?
So war dann auch schon die Idee für Tilenet da. Damit soll es möglichst einfach sein, Multiplayer Spiele zu entwickeln, ohne sich um das Netzwerk-Zeugs kümmern zu müssen. Dafür muss man dann leider Abstriche in der Grafik machen ;)
... obwohl ... man kann theoretisch die Tile-Größe auf einen Pixel setzen... aber dann ist die Performance wahrscheinlich unterirdisch ;)

Technik

Das Projekt setzt sich aus einem C-Interface, einer Server-Komponente, einer Netzwerk-Komponente, einer Client-Komponente und einem C++-Wrapper zusammen.
Die ersten drei bilden zusammen die tilenet library. Der C++-Wrapper besteht lediglich aus Header-Files und ich habe ihn spaßigerweise tiley getauft ;)

Um den Code zu bauen (sowohl unter Linux als auch unter Windows) kommt CMake zum Einsatz.
Für das interne Threadmanagment und den Netzwerk-Verkehr kommt boost::asio zum Einsatz, sowie eine von mir selbst geschriebene Serialisierungs-Komponente.

Für Fenster und Grafiken verwende ich SFML, obwohl ich gerne etwas anderes benutzen will (z.b. opengl+freeglut)... aber ich bin zu faul das zu ändern ;)

Die Library ist theoretisch multithreading fähig; wie gut und sicher das ist, weiß ich aber nicht genau :thumbup:

Wird der Inhalt eines Layers geändert, wird die Änderung von tilenet erkannt und nur die relevanten Daten werden verschickt.
Verschiebungen oder Ähnliches werden leider nicht erkannt. Die Nachrichten werden auch noch nicht komprimiert, was man aber leicht einbauen könnte.

Performance

Lokal (also auf dem eigenen System und im LAN) ist die Performance super. Über Internet wird es wohl etwas langsamer sein, aber ich hatte leider auch noch keine Gelegenheit das richtig zu testen.

Get It

Wenn ihr die Library benutzen oder mit weiterentwickeln wollt, könnt ihr euch den Sourcecode über git von google-code holen:

Quellcode

1
git clone https://Code.DataByte@code.google.com/p/tilenet/

Hier gibt es den Code.
Und hier gibt es eine Beschreibung wie ihr den Code ganz einfach mit CMake kompiliert, nachdem ihr das Repository mit git geklont habt.
Mit doxygen könnt ihr euch dann auch die Dokumentation erstellen, allerdings ist die noch nicht sehr ausführlich :)
Wenn ihr nur die samples haben wollt, könnt ihr sie hier runterladen.


Fortschritt und Aussicht

In letzter Zeit bin ich gut mit Tilenet vorangekommen. Besonders die Netzwerk-Komponente und die Server-Komponente sind sehr weit Fortgeschritten.
Dem Client fehlt noch eine Oberfläche, mit der er zum Beispiel Pakete mit Graphiken auswählen oder nach Spielen im LAN oder Internet suchen kann.
Der C++-Wrapper ist noch nicht sehr weit und eher provisorisch zusammen gehackt (damit ich Multi-Explore nicht mit C schreiben musste ;) )
Weiterhin habe ich immer neue Ideen, die man einbauen könnte; Dazu gehört zum Beispiel ein Sound-Tile, mit dem man Soundeffekte abhängig vom Hörer einbauen kann.
Auch wäre ein bisschen Verschlüsselung nicht schlecht ;)

Aja und die Dokumentation läuft auch etwas hinterher ;)



Probiert einfachmal die Samples aus. Sollten Fehler auftreten oder ihr noch Fragen haben, dann meldet euch einfach hier. Ihr könnt auch gerne Anregungen oder Kritik posten :cursing: ^^