Message-Queue wie Windows
-
Hi
Ich habe mir überlegt, für mein Projekt eine Message-Queue ähnlich der von Windows zu benutzen, um die Events zu steuern. Dass also gewisse Einheiten und Gebäude Nachrichten senden, um Events auszulösen.
Gibts sowas schon? (Benutze DirectX)
Ansonsten dachte ich, ich nehm nenn Stack und eine Struct für die Messages und frag die in jedem Spielzyklus ab.
Denkt ihr, dass das Sinn macht?
-
sowas wie libsig könntest du nutzen.
btw. weil jemand directX nutzt, muss nicht jede seiner fragen was mit spiele-/Graphicprogrammierung zu tun haben
-
Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ja gibts, schau dir mal boost::signals an:
-
Ok danke
Schauts gut aus, muss ich mal durchlesen..
-
ich würde lieber das Listener-Pattern verwenden.
public interface MeinListener { public void onEvent(Event e); } public class MeinObjekt implements MeinListener { public void onEvent(Event e) { /* ... */ }; } public class EventSender { private Vector<MeinListener> listeners; public void addListener(MeinListene l) { listerners.add(l); } protected void fireEvent(Event e) { /* für jeden MeinListener l in listeners l.onEvent(e); */ } }
-
Gut danke
Aber ich kann kein Javanisch..
Was heisst "inteface"
und was "implements" auf C++isch?Und verständniss Frage:
Vielleicht lieg ich falsch, aber ich dachte es eigentlich anders rum.
Die Objekte senden Nachrichten an die Zentrale Unit, die dann entsprechend reagiert, zb. ein anderes Objekt dahin schickt ua...
-
Erstell dir doch eine MessageKlasse, in die sender, und ein paar parameter abgespeichert werden, und dann nimm ein std::queue<DeineMessageKlasse> und pack da halt immer eine neue instanz drauf, wenn du ne nachricht hast, und irgendwo anderst kannste die dann halt abarbeiten
-
Wenn du kein JAva verstehste, wieso postest du dann im RudP-Forum ?
class Listener { public: void onEvent(Event event) = 0; } class MeinObjekt : Listener { public: void onEvent(Event event) { /* mach was */ } } class Sender { public: void addListener(Listener l) { füge zur Collection listeners den Listener l hinzu; } protected: void fireOnMessage(Event event) { für jeden Listener l in listeners l.onEvent(e); } private: Collection<Listener> listeners; }
Vorteile:
- keine riesige Schleife in der alle Nachrichten verarbeitet werden
- dezentrale Verarbeitung von Nachrichten
- Objekte reagieren nur auf Nachrichten die sie brauchen
- Objectorientiert
-
Kuck dich mal an was ein interface ist
-
DEvent schrieb:
Wenn du kein JAva verstehste, wieso postest du dann im RudP-Forum ?
weil ich ihn hierher verschoben hatte, weil signals nicht sprachspezifisch sind. aber wenn jemand hier postet, heißt es nicht, dass er jede sprache beherrschen muss. genauso könnte man fragen, wieso man in nem c++-forum beispiele in java schreiben muss.
@1310-Logik
interface sagt nur aus dass es eine abstracte klass ist. implements ist ableiten davon.
-
naja für mich ist RumdP-Forum ein Forum in dem alle Sprachen durcheinander gepostet werden :p
-
DEvent schrieb:
ich würde lieber das Listener-Pattern verwenden.
imho ist sigslot da besser, als wenn man sowas in C++ selber implementiert.
Sigslot bietet bereits Mechanismen für die Kommunikation über Klassen hinweg,
und wenn man die Klasse auch von boost::signals::tracable ableitet, wird
die Verbindung der Klassen sogar automatisch aufgehoben, wenn eine der beiden
zerstört wird. Und du musst nicht mal irgendwelche interfaces implementieren.
Zu dem ist boost::signals recht einfach zu bedienen.phlox
-
Ist das Listener Pattern eintlech das selbe wie das Observer PAttern?
Weil was in dem "Getreide und Bäcker" Beispiel steht, ist eigentlich das was ich meinte.