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

MatStorm

Frischling

  • »MatStorm« ist der Autor dieses Themas

Beiträge: 14

Beruf: Student

  • Private Nachricht senden

1

26.08.2013, 22:18

Netzwerk, SFML und Fenster(wxWidgets) ???

Hallo alle miteinander :D

Ich stehe wiedermal vor einer Frage :P
Ich habe ein neues Projekt angefangen. Und zwar will ich ein "Miniatur-Online-2D-Game" machen. Und zwar erst einmal einfach nur farbige Texturen, die irgendwelche Spieler darstellen, die man durch die Onlinewelt schlendern lassen kann. Ich weiß, dass selbst diese Kleinigkeit sich als Problem herauskristallisieren kann(wird, soll) ^^.
Der Sinn dabei ist: Programmieren lernen mal auf Gaming-Mode Medium.

Nun zum Problem/Herausforderung/Frage/Wasauchimmer:
Ich habe ein eigenes Protokoll erstellt, SGP, welches ich für das Spiel benutzen werde. dem SGP möchte ich gerne alles was mit Netzwerk zu tun hat überlassen.
[Spiel] =Schreibt Daten in Packet=> [SGP] =Sendet=> [TCP/IP] =Gegenüber empfängt=> [SGP] =Liest Paket=> [Server]
Da würde ich dann ggf. die Boost-Library benutzen. Es zu Programmieren ist kein Problem.
Dann gibt es das Spiel und der Server. Bei denen würde ich auf wxWidgets (Patch, Loginfenster, Serverfenster) und SFML (Das eigentliche Spielgeschehen grafisch angezeigt) zugreifen (ich weiß, dass beides über Sockets vefügen). Der Grund, warum ich nicht die Sockets bei SFML oder wxWidgets benutze ist, weil ich nicht weiß, wie ich die für den Login aufgebaute wxWidgets-Socket-Verbindung zu einer für das Spiel benötigte SFML-Socket-Verbindung. Deshalb mach ich jetzt alles über die Boost-Sockets.

ABER: Dann fallen die Events weg. Wie mache ich das am geschicktesten, dass ich ein normales Fenster habe, für Logineingaben (Welches ich normalerweise mit wxWidgets machen würde), ein Spiel-Fenster habe (Welches ich mit SFML machen werde), aber beides ein Socket teilt, welches auch Events hergibt.
In SFML könnte ich ja in die Schleife eine Abfrage mit hineinnehmen, aber in wxWidgets würde ich da Probleme kriegen.

Kurz: Ich denke ich benutze da zu viele Bibliotheken. Wie würdet ihr das "Problem" lösen? Sollte ich nur eine Bibliothek benutzen? Ist meine Idee akzeptabel? Wenn ja, wie kriege ich das Event-Problem in den Griff?

Ich hoffe, dass ich mein Problem verständlich erläutert habe (habe so meine Schwächen im Artikulieren) :P

Ich bedanke mich schonmal im Voraus ^_^

Mit freundlichen Grüßen,
Matthias


PS: Habe hier noch ein nettes Schaubild im Anhang
»MatStorm« hat folgendes Bild angehängt:
  • Schaubild.png

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

2

27.08.2013, 03:59

Also die eigentliche Frage ist, wie mixt man wxWidgets und SFML Events?
Für was braucht eigentlich der Server ein Fenster? Der Server sollte doch nur die Gamelogik/-pyhsik/etc. simulieren und dafür braucht es ja nur optional ein Fenster (wenn überhaupt).

Also wenn ich dich jetzt richtig verstanden habe, dann willst du die Events (z.B. Tastatur Input) mit deinem Protokoll an den Server schicken, richtig?
Falls das so ist, dann musst zuerst einmal rausfinden wie wxWidgets und SFML die Events handlen (kA was dies da machen) und dann geht es relative einfach. Poll alle Events vom Client und verpacke die wichtigsten. Dann sende die verpackten Events mit deinem Protokoll an den Server. Dieser interpretiert dann die Events und simuliert das Spielgeschehen, mit den nötigen Checks, dass da auch ja niemand cheated und dann schickst du die neuen Positionen und anderen Daten mit deinem Protokoll wieder zurück an den Client. Der Client hat in der Zwischezeit schon seine eigene Situations Vorhersage gemacht und passt sich nun den offiziellen Änderungen des Servers an.

Klingt jetzt noch alles ziemlich simple, aber das wird wohl eine harte Arbeit werden. Ich hoffe du hast genügend erfahrung mit Netzwerk programmierung, ansonsten wird das wohl sehr schwer. ;)
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

MatStorm

Frischling

  • »MatStorm« ist der Autor dieses Themas

Beiträge: 14

Beruf: Student

  • Private Nachricht senden

3

27.08.2013, 12:33

wxWidgets-Events mit SFML-Events mixen wäre eine Möglichkeit. Ich hätte aber gerne, dass die SGP-Library (Mein Protokoll) unabhängig ist, sodass egal welche Bibliotheken ich benutze, ob sei es wxWidgets, Qt, SFML, SDL etc., sie universell einsetzbar ist. Ich habe mir schon folgende Schnittstellen überlegt.

C-/C++-Quelltext

1
2
3
4
void WriteWithSocket(wxSocketBase *socket);
void WriteWithSocket(sf::Socket *socket);
void ReadWithSocket(wxSocketBase *socket);
void ReadWithSocket(sf::Socket *socket);



Der Vorteil: Die Sockets gehören zur SFML bzw wxWidgets und lösen auch dementsprechend Events aus (Socket Input Event). Dann übergebe ich das Socket dem SGP und das erledigt den Rest. Der Nachteil ist natürlich, dass man dann auf die Bibliotheken beschränkt ist, die ich hier implementiere.

Danach dachte ich mir, dass ich die Sockets IN die SGP.lib hineinprogrammiere. Dadurch muss ich dann nur die Verbindung einstellen,z.B. mit

C-/C++-Quelltext

1
void SetData1(char *something);


oder dergleichen das Paket beschmücken, und dann mit

C-/C++-Quelltext

1
void Send();


das Paket in Richtung Server werfen. Der Nachteil ist eben, dass der Server dann kein Socket-Input-Event auslöst.

Okay, ich könnte auch den Server in eine Konsole oder fensterlosen Anwendung programmieren, aber ich hätte schon ganz gerne eine graphische Oberfläche, mit der man das gesamte Spielgeschehen beobachten kann, sehen kann, wer gerade eingeloggt ist, usw..

Zitat

Also wenn ich dich jetzt richtig verstanden habe, dann willst du die Events (z.B. Tastatur Input) mit deinem Protokoll an den Server schicken, richtig?
Ja genau. Beispielsweise Client drückt W um sich nach oben zu bewegen (in einer 2D-Welt). Das Event wird ausgeführt, im Protokoll verarbeitet und versendet. Das stellt kein Problem dar. Das Problem ist eben, wie sorge ich dafür, dass wenn der Server das Paket kriegt, ein Socket-Input-Event auslöst, damit ich auf das Empfangen reagieren kann.

So wie du das erklärt hast, hatte ich es auch vor, und ich weiß dass es ein riesiger Aufwand ist, aber ich hab bereits alles durchgeplant, das einzige was mir fehlt ist eben die Möglichkeit, eine Bibliothek zu programmieren die:

  • Unabhängig von den Bibliotheken des Programmes, welches das SGP benutzt ist
  • Socket-Input-Events auslößt, sobald das SGP ein Paket empfängt.
Ich glaub aber eher, dass es nicht möglich ist, deshalb werde ich es wie Oben beschrieben machen. So funktioniert es wenigstens :P

Danke für die Antwort, wenn mein Game die ersten Schritte hinter sich hat, melde ich mich mal im Projekte-Forum. :D

Grüße,
Matthias

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

27.08.2013, 13:48

Klingt für mich nach einem Einsatzfall für das Adapter Pattern (Wikipedia). Dein SGP bekommt eine feste Schnittstelle und zusätzlich gibt es Adapter für SFML, WX etc. Ohne ein Minimum an extra Code wirst du nicht verschiedene Netzwerkbibliotheken als Basis nehmen können. Sind die Schnittstellen ähnlich, kannst du diese nahezu 1:1 umsetzen. Kann eine Lib z.B. keine Events, musst du diese im Adapter halt selber implementieren. Letztendlich ist das auch nichts anderes als ein regelmäßiges lesen und das Aufrufen einer Funktion sobald Daten da sind.

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

5

27.08.2013, 15:04

Der Vorteil: Die Sockets gehören zur SFML bzw wxWidgets und lösen auch dementsprechend Events aus (Socket Input Event). Dann übergebe ich das Socket dem SGP und das erledigt den Rest. Der Nachteil ist natürlich, dass man dann auf die Bibliotheken beschränkt ist, die ich hier implementiere.
Ich weiss nicht genau, warum du verschiedene Sockets verweden möchtest und dann trotzdem alles irgendwie mit Boost ASIO vermischst. Also ich würde dir empfehlen dich auf eine Socket Implementierung zu beschränken. Wenn du modular bleiben willst, dann solltest du wie Tobiking erwähnt hat, solltest du das Adapter Pattern verwenden. Somit hast du ein allgemeines Interface für Client/Server/alle anderen Libs und kannst dann im Hintergrund entscheiden, ob das nun über ASIO, SFML oder wxWidgets Sockets geht. Ist aber meiner Meinung nach overkill, wenn nicht sogar völlig unnötig. Der Sinn von Sockets ist ja eigentlich eine Verbindung zwisch A und B herzustellen, da spielt es ja dann eigentlich gar keine Rolle welche Sockets nun wo verwendet werden.
Dein Browser interessierts schlussendlich ja nicht, ob der gegen über ein Server mit SFML Sockets oder ein server mit wxWidget Sockets hostet, so lange der Server valide HTTP responses und validen HTML Code ausspuckt.
Somit kann dein Client irgend ein Socket verwenden, so lange er sich an dein SGProtokol hält, damit dann auch der Server, egal mit was für einem Socket der kommuniziert, auch versteht was Sache ist.


(Link)


Ja genau. Beispielsweise Client drückt W um sich nach oben zu bewegen (in einer 2D-Welt). Das Event wird ausgeführt, im Protokoll verarbeitet und versendet. Das stellt kein Problem dar. Das Problem ist eben, wie sorge ich dafür, dass wenn der Server das Paket kriegt, ein Socket-Input-Event auslöst, damit ich auf das Empfangen reagieren kann.
Wenn ich das richtig verstehe, hast du da ein normales Netzwerk Programmierung Problem. Es gibt ja verschiedene Arten das zu implementieren: Blocking, Non-Blocking, Asynchronous, Callback, etc.
Ich weiss nicht ob wxWidget ein Event bereit stellt, aber evtl. kommt von daher die Verwirrung, aber SFML lässt es dir offen, wie du das implementierst. Somit gibt es keine Events dort, sondern du musst selbst entscheiden wie es funktionieren soll. Darum ist Netzwerkprogrammierung zum Grossenteil nicht eine triviale Angelegenheit.
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

Werbeanzeige