<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Konzept einer Ereignisbehandlung]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich wende mich heute mal wieder mit einem gedanklichen Problem an Euch.</p>
<p>Mit schwebt vor, ein &quot;Pong&quot; strikt nach Model-View-Controller (MVC) zu schreiben. Hierbei soll vor allem das Model (in meinem Konzept die Spiellogik) vollkommen unabhänging von der Ausgabe (Bildschirm, Sound, etc.) und der Eingabe (via SDL-Events<sup>[1]</sup>) verarbeitet werden.</p>
<p>Die Kommunikation zwischen den drei Komponenten soll über Ereignisse abgewickelt werden (auf welche reagiert werden KANN) - der Spiellogik ist es schlussendlich egal, ob die Züge dargestellt werden oder mit Musikeffekten untermalt werden. Rein theoretisch wären alle Komponenten nahtlos austauschbar.</p>
<p>Ereignisse werden von der Basisklasse &quot;Event&quot; abgeleitet.</p>
<p>Die Verteilung der Ereignisse erfolgt natürlich nicht willkürlich. So sollen sich Ereigniss-Handler (welche von der abstrakten Klasse &quot;Handler&quot; erben) beim Ereignisverteiler für jenen Ereignistyp registrieren, für welchen sie Ereignisse empfangen wollen.</p>
<p>---</p>
<p>Mir ist nun in den Sinn gekommen, der Basisklasse &quot;Event&quot; ein Typ-Attribut zu verpassen. Anhand dieser Typ-ID werden nun die Ereignisse an die jeweiligen Handler verteilt.</p>
<p>Meine Schwierigkeit (mehr ein Unbehagen) liegt nun darin, dass der jeweilige Handler entscheiden muss, welches Ereignis er gerade erhalten hat. Dies ist m. E. nur über die Abfrage der Typ-ID möglich. Hängen dem Ereignis weitere Attribute an (Positionen, Objektreferenzen, etc.) so bleibt mir nichts anderes übrig, als einen dynamischen Cast zu verwenden. Ich persönlich finde das unschön und ganz wohl ist mir bei dem Gedanken auch nicht.</p>
<p>(Quelltext liegt im übrigen noch keine einzige Zeile vor, ich plane derzeit noch.)</p>
<p>---</p>
<p>Was haltet Ihr von diesem Konzept?<br />
Gibt es bessere Lösungen?</p>
<p>In diesem Sinne grüßt... Heiko</p>
<p>[1]: <a href="http://www.libsdl.org" rel="nofollow">http://www.libsdl.org</a></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202786/konzept-einer-ereignisbehandlung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 00:09:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202786.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Jan 2008 13:44:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konzept einer Ereignisbehandlung on Tue, 15 Jan 2008 13:44:00 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich wende mich heute mal wieder mit einem gedanklichen Problem an Euch.</p>
<p>Mit schwebt vor, ein &quot;Pong&quot; strikt nach Model-View-Controller (MVC) zu schreiben. Hierbei soll vor allem das Model (in meinem Konzept die Spiellogik) vollkommen unabhänging von der Ausgabe (Bildschirm, Sound, etc.) und der Eingabe (via SDL-Events<sup>[1]</sup>) verarbeitet werden.</p>
<p>Die Kommunikation zwischen den drei Komponenten soll über Ereignisse abgewickelt werden (auf welche reagiert werden KANN) - der Spiellogik ist es schlussendlich egal, ob die Züge dargestellt werden oder mit Musikeffekten untermalt werden. Rein theoretisch wären alle Komponenten nahtlos austauschbar.</p>
<p>Ereignisse werden von der Basisklasse &quot;Event&quot; abgeleitet.</p>
<p>Die Verteilung der Ereignisse erfolgt natürlich nicht willkürlich. So sollen sich Ereigniss-Handler (welche von der abstrakten Klasse &quot;Handler&quot; erben) beim Ereignisverteiler für jenen Ereignistyp registrieren, für welchen sie Ereignisse empfangen wollen.</p>
<p>---</p>
<p>Mir ist nun in den Sinn gekommen, der Basisklasse &quot;Event&quot; ein Typ-Attribut zu verpassen. Anhand dieser Typ-ID werden nun die Ereignisse an die jeweiligen Handler verteilt.</p>
<p>Meine Schwierigkeit (mehr ein Unbehagen) liegt nun darin, dass der jeweilige Handler entscheiden muss, welches Ereignis er gerade erhalten hat. Dies ist m. E. nur über die Abfrage der Typ-ID möglich. Hängen dem Ereignis weitere Attribute an (Positionen, Objektreferenzen, etc.) so bleibt mir nichts anderes übrig, als einen dynamischen Cast zu verwenden. Ich persönlich finde das unschön und ganz wohl ist mir bei dem Gedanken auch nicht.</p>
<p>(Quelltext liegt im übrigen noch keine einzige Zeile vor, ich plane derzeit noch.)</p>
<p>---</p>
<p>Was haltet Ihr von diesem Konzept?<br />
Gibt es bessere Lösungen?</p>
<p>In diesem Sinne grüßt... Heiko</p>
<p>[1]: <a href="http://www.libsdl.org" rel="nofollow">http://www.libsdl.org</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437056</guid><dc:creator><![CDATA[bwbg]]></dc:creator><pubDate>Tue, 15 Jan 2008 13:44:00 GMT</pubDate></item><item><title><![CDATA[Reply to Konzept einer Ereignisbehandlung on Tue, 15 Jan 2008 13:53:34 GMT]]></title><description><![CDATA[<p>Hab das bisher, zumindest im Netzwerk, wie folgt gehandhabt, da die Nachrichten in der Regel eh sehr klein sind:</p>
<pre><code class="language-cpp">struct Message{
    MessageID id;
    union MessageData{
        SoundRequest   sr;
        MoveRequest    mr;
        DisplayRequest dr;
        // ...
    } data;
};
</code></pre>
<p>Weiß jetzt nicht ob die Schreibweise korrekt ist... Wenn das ganze eh in einem Prozess läuft wären Pointer sicherlich Bandbreitenschonender, wirst dann um casts aber kaum herumkommen. Außer du machst zB ein union mit den unterschiedlichen Pointertypen drin, wobei ich gerade nicht einmal weiß ob das überhaupt geht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>EDIT: Was spricht gegen SDL_Event?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437062</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 15 Jan 2008 13:53:34 GMT</pubDate></item><item><title><![CDATA[Reply to Konzept einer Ereignisbehandlung on Tue, 15 Jan 2008 14:48:54 GMT]]></title><description><![CDATA[<p>Gegen SDL_Event spricht als solches nur die Tatsache, dass die Applikationslogik unabhängig von libsdl sein soll.</p>
<p>Nichts desto trotz habe ich gerade (mal eben) etwas zusammen gefummelt, was meiner Idee am nächsten kommt (Programmschleife, Queues und Handler-Liste muss man sich dazudenken). Die Basisklassen habe ich nicht aufgeführt, da diese recht simpel sind:</p>
<pre><code class="language-cpp">#define EVT_TEXT 123

// ----------------------------------------------------------------------------
class TextEvent : public Event
{
private:
    string message_;
public:
    TextEvent(const string&amp; pmessage)
        : Event(EVT_TEXT), message_(pmessage)
        { }
    const string&amp; message() const { return message_; }
};
// ----------------------------------------------------------------------------
class Printer : public Handler
{
public:
    void on_event(const Event&amp; event)
        {
            const TextEvent&amp; e = dynamic_cast&lt;const TextEvent&amp;&gt;(event);
            cout &lt;&lt; e.message() &lt;&lt; endl;
        }
};
// ----------------------------------------------------------------------------
int main()
    {
        Printer printer;
        TextEvent e1(&quot;Hallo Welt!&quot;);
        printer.on_event(e1);
        return EXIT_SUCCESS;
    }
</code></pre>
<p>Dieses <em>const TextEvent&amp; e = dynamic_cast&lt;const TextEvent&amp;&gt;(event);</em> macht auf mich persönlich den Eindruck eines ziemlichen Gemurkses aber es erfüllt seine Aufgabe. Ggf. sollte man vorher den Typ abfragen und eine möglich Bad-Cast-Exception auffangen.</p>
<p>Grüße... Heiko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437107</guid><dc:creator><![CDATA[bwbg]]></dc:creator><pubDate>Tue, 15 Jan 2008 14:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to Konzept einer Ereignisbehandlung on Tue, 15 Jan 2008 15:13:52 GMT]]></title><description><![CDATA[<p>Warum benutzt du denn nicht konkret TextEvent als Parameter?</p>
<pre><code class="language-cpp">void on_event(const TextEvent&amp; event)
</code></pre>
<p>Oder soll diese Methode alle Events der Klasse (bzw. des Objekts) bearbeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437127</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 15 Jan 2008 15:13:52 GMT</pubDate></item><item><title><![CDATA[Reply to Konzept einer Ereignisbehandlung on Tue, 15 Jan 2008 15:24:35 GMT]]></title><description><![CDATA[<p>Der Ereignisqueue nimmt konkret Zeiger auf Objekte vom Typ &quot;Event&quot; auf. Somit kann ich gewährleisten, dass alle möglichen Ereignisse darüber abgewickelt werden können. Des weiteren wird es einen Container mit Zeiger auf Handler-Objekte geben - diese müssen die genannte on_event-Methode implementieren.</p>
<p>Es kann auch sein, dass sich ein und der selbe Handler mehrerer Ereignistypen annimmt.</p>
<p>So wie es aussieht, scheint keine elegantere Möglichkeit zu existieren, als das Casting.</p>
<p>Grüße... Heiko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437132</guid><dc:creator><![CDATA[bwbg]]></dc:creator><pubDate>Tue, 15 Jan 2008 15:24:35 GMT</pubDate></item><item><title><![CDATA[Reply to Konzept einer Ereignisbehandlung on Tue, 15 Jan 2008 15:42:50 GMT]]></title><description><![CDATA[<p>Willst du das nicht nochmal überdenken? Irgendwie scheint das ein relativ unsauberer Ansatz zu sein, oder hat der auch seine Vorteile? Soll die &quot;on_event&quot;-Funktion auch Tastatur- und Maus-Nachrichten usw empfangen?<br />
Und gibt's einen konkreten Grund, warum du dich gegen Interfaces entschieden hast (reine Neugierde)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437143</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 15 Jan 2008 15:42:50 GMT</pubDate></item><item><title><![CDATA[Reply to Konzept einer Ereignisbehandlung on Tue, 15 Jan 2008 20:16:34 GMT]]></title><description><![CDATA[<p>Ja, ich grüble ja noch. Wenn Ihr &quot;saubere&quot; Quellen habt, nehme ich die gerne an. Fertige Frameworks bringen mir persönlich jetzt nichts, da ich das von Grund auf nachvollziehen wollte.</p>
<p>Und ja, mir kommt das auch sehr unsauber vor...</p>
<p>Grüße... Heiko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437269</guid><dc:creator><![CDATA[bwbg]]></dc:creator><pubDate>Tue, 15 Jan 2008 20:16:34 GMT</pubDate></item><item><title><![CDATA[Reply to Konzept einer Ereignisbehandlung on Tue, 15 Jan 2008 21:42:14 GMT]]></title><description><![CDATA[<p>Also ich kenne Events so in dieser Art, finde es eigentlich auch ganz angenehm:</p>
<pre><code class="language-cpp">// Maus-Krams:
class MouseReceiver
{
    public:
        virtual void OnMouseMove( int x, int y, int dx, int dy ) = 0;
};

class Mouse
{
    public:
        void addReceiver( MouseReceiver* r )
        {
            recv.push_back( r );
        }

    protected:
        void HierWirdFestgestelltDassSichDieMausBewegtHat()
        {
            for ( alle recv )
                recv[i]-&gt;OnMouseMove( ... );
        }

    private:
        vector&lt;MouseReceiver*&gt; recv;
};

// Die Klasse, die Mausnachrichten empfangen will:
#include &quot;MausKrams.h&quot;

class Sonstwas : public MouseReceiver
{
    public:
        void OnMouseMove( int x, int y, int dx, int dy )
        {
            // Drauf reagieren
        }
};

// Registrieren..
Mouse miep;
Sonstwas yeah;
miep.addReceiver( &amp;yeah );
</code></pre>
<p>So gibt es relativ wenige Abhängigkeiten und es bleibt recht flexibel. Ich weiß aber natürlich nicht, inwieweit es in dein Konzept passt, oder es bessere Alternativen gibt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437305</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 15 Jan 2008 21:42:14 GMT</pubDate></item></channel></rss>