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

Techie

Alter Hase

  • »Techie« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

14.06.2013, 20:06

C++ feat. Signal & Slot

Guten Abend ( oder je nachdem wann es gelesen wird, guten Morgen ),
wie einige schon erfahren haben, entwickle ich zurzeit mit 'nem Kumpel ein Spiel, nebenbei schlüpft aus den Klassenkapselungen eine Engine heraus.
Zurzeit kämpfe ich zwar noch mit der MessageLoop, bzw. Events und bla bla bla...

Nun mein eigentliches Anliegen betrifft das "Signale und Slot"-Prinzip, bis jetzt hatte ich nur einmal damit zu schaffen ( Der C++ Programmierer: habe das QT-Beispiel durchgemacht ): Nun, ich habe mir gedacht, dass ich durch dieses Konzept das System besser abstrahieren könnte. Mein Problem ist, dass ich überhaupt keine Vorstellung habe wie das ganze ( als Code ) aussehen sollte/könnte, bzw. wie das Konzept selber funktioniert.

Ich habe schon etwas recherchiert ( mit Dr.Google ), das einzige Konstruktive was raus gekommen ist, war die Wikiseite zu diesem Thema, ansonsten nur Links zu irgendwelchen Libs.

Meine Frage: Wie würde ein primitive Umsetzung davon aussehen?
Habt ihr ev. auch Links zu Tutorials bei denen man lernen/sehen kann wie so etwas umgesetzt werden könnte?

Ich freue mich auf eure Antworten.
Gruß Techie

P.S.: Habe eine kleine Lib gefunden... Aber wirklich verstehen tue ich es nicht.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Techie« (14.06.2013, 20:45)


xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

14.06.2013, 23:35

Da C++ nicht viele moeglichkeiten zur Reflection bietet, benutzt QT einen speziellen compiler um code fuer signals/slots zu genierieren. Eine recht uebersichtliche Beschreibung findest du hier: http://woboq.com/blog/how-qt-signals-slots-work.html

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

3

15.06.2013, 20:04

Also ich habe schon einige male die "sigslot"-"Libary" verwendet.
Wobei "Libary" schon fast etwas zuviel gesagt ist, denn sie besteht nur aus einen einzigen realtiv großen Header.
http://sigslot.sourceforge.net/

Soweit ich weiß hat sie schon viele Jahre auf den Buckel, aber das macht sie ja nicht schlechter.
Es gibt auch einen zum modernen GCC kompatiblen Header, allerdings weiß ich nichtmehr wo...

Evt. ist es auch genau die selbe Lib, die du schon hattest.

Im Prinzip ist es eine einfache Kapselung von Callbacks in einer Datenstruktur. Wozu man dafür Reflection brauchen sollte, erschließt sich mir nicht. (Qt habe ich nie verwendet...)
Ohne Variadic Templates ist es aber nicht möglich eine allgemeine Lösung für eine beliebige Anzahl Parameter zu schaffen.
Man kann aber immer nur einen Parameter übergeben. In diesem wird immer eine Klasse übergeben in der wiederum die nötigen zu übergebenden Daten stecken, die man sonst direkt als Parameter übergeben hätte. Je nach Geschmack ist das sowieso die bevorzugte Variante. In C# ist es standardmäßig immer so, obwohl das nicht sein müsste... (EventArgs)

Techie

Alter Hase

  • »Techie« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

4

15.06.2013, 21:54

Ich hatte dieses im Sinn -> https://github.com/pbhogan/Signals

Ist zwar in der Implementierung noch etwas umständlich zahlt sich aber ( hoffentlich ) aus.
Nur, hätte ich wohl davor Fragen sollen: Was gibt es noch für Konzepte um das Win-System zu abstrahieren?

Vielen Dank für die Antworten.
Gruß Techie
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

5

15.06.2013, 22:38

http://www.tomprogs.at/tutorials/program…ternative.xhtml

2 Bibliotheken im Vergleich + simple Beispielimplementierung, um zu sehen, wie man sowas umsetzen kann.

Bzgl. Einschränkungen ohne Variadic-Templates: boost hat soweit ich weiß Unterstützung für bis zu n Parameter (vlt. 10 oder so) hardcodiert drin. Ist natürlich ein bisschen fummelig, derartig viele Funktionen zu haben, die alle das selbe machen, andererseits haben schon normale Funktionen meist nicht so viele Parameter und Slots erst recht nicht. Außerdem kann man es durch Hilfskonstrukte ja immer irgendwie umgehen.

Was gibt es noch für Konzepte um das Win-System zu abstrahieren?

Was genau meinst du damit?
Lieber dumm fragen, als dumm bleiben!

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

6

16.06.2013, 10:52

Seit c++11 gibt es jetzt auch std::bind und std::function (Ähnlich wie boost::bind + boost::function von Jonathan_Klein)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
struct blabla
{
    void sayHallo(int i) { std::cout << "Hallo " << i << std::endl ; }
};

...

std::unique_ptr<blabla> context(new blabla());

std::function<void(int)> func = std::bind(blabla::sayHallo, std::move(context), std::placeholders::_1);

func(100);


Hmm, ja ok... um die volle signal funktionalität zu bekommen muss man dann noch ein bisl was schreiben... so wie das makro oben aus dem link.

std::bind
std::function

Techie

Alter Hase

  • »Techie« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

7

16.06.2013, 18:09

Zitat

Was gibt es noch für Konzepte um das Win-System zu abstrahieren?


Ich habe damit allgemein "Design Pattern" gemeint mit dem ich dem Schichtenmodell konform werden kann.
Nun, vielen Dank für die Antworten, ich werde mir alles nochmal anschauen, weitere Information sind willkommen.

Für das Projekt werde ich jetzt wohl eine Mischung aus Observer Pattern und Signal and Slot Pattern nehmen, falls es da was zu verbessern gibt, ob ich ev. doch nicht ein anderes nehmen sollte schreibt es bitte als Antwort.

Gruß Techie

P.S.: Wie fügt man Zitate richtig ein? O_o
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Tobiking

1x Rätselkönig

  • Private Nachricht senden

8

16.06.2013, 18:50

Für window events habe ich nen ganz simples System. Die Fensterklasse hat virtuelle Funktionen der Art "OnResize", die aufgerufen werden wenn ein entsprechendes Event vorliegt. Die Anwendung kann von der Fensterklasse erben und die Funktionen entsprechend überschrieben. In den meisten Fällen braucht die Anwendung das aber gar nicht, weil sich das Fenster selber um die Anpassung des render target etc. kümmert.

Techie

Alter Hase

  • »Techie« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

9

16.06.2013, 19:06

Anfangs habe ich auch an eine abstrakte Klasse gedacht, jedoch möchte ich das System allgemein simpel halten. Gut gelöst wurde es ( meiner Meinung nach ) in SFML mit den wenigen Methoden aufrufen schon ein Fenster hinzaubern kann...
Ich tue mir dennoch mit der WinLoop schwer....

Mir fällt langsam auf, obwohl ich doch die Syntax von C++ behersche ( Aussetzer mal nicht mitgezählt ) so kenne ich weniger von C++ und der Programmierung wie zuvor angenommen.

Design Patterns waren bis vor heute morgen mir noch ein Fremdwort. Oder das der Compiler bei schlecht deklarierten Strukturen bis zu 4 bytes extra dranhängen damit es mit es mit der 32-bit Architektur passt.... Nichts davon gekannt oder gewusst.

Naja, immerhin, lieber dumm angefangen, als dumm zu bleiben ( Ja, das ist eine Anspielung.... )



Gruß Techie
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Techie« (16.06.2013, 19:19)


patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

10

16.06.2013, 21:22

Du kannst dir ja mal den Code von SFML ansehen, das ist ja einer der Vorteile von Open Source Software.

Werbeanzeige