<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Splash Screens and Setup Screens Part of Event loop?</title>
		<link>http://www.allegro.cc/forums/view/618810</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 20 Apr 2023 21:21:24 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just thinking in advance.  I&#39;ve got my simple game operational, granted without any safe guards for the moment.  Eventually I&#39;m going to want to allow for an entry screen and/or setup screen for player names.</p><p>My question, when implementing screens like instruction screens or game setup screens do you run that through a separate loop?  I envision a main loop with the gameplay loop called from that loop.  When the game was over or player quits, you would return to the main loop responsible for the opening screen?</p><p>Is that a common approach or a problematic approach?  Thanks
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AceBlkwell)</author>
		<pubDate>Sat, 15 Apr 2023 01:28:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You can create another variable, game_state.</p><p>Some options:</p><p>You can make separate functions that handle events for certain game states or have one function, but it gets confusing.</p><p>I don&#39;t know how well you are at reading code, but I have a simple tictactoe game. It has game state. There is an opening screen with a menu. You can escape during gameplay back to the menu and the menu changes (from new game to continue game).</p><p>I kept it to one function for the logic, but multiple functions for drawing the screen depending on game state.</p><p><a href="https://github.com/dlharmon911/TicTacToe">Link here</a></p><p>In the game there are numerous game states.
</p><div class="source-code snippet"><div class="inner"><pre>    <span class="k1">enum</span> <span class="k1">class</span> GameState
    <span class="k2">{</span>
      Undefined,
      Initializing,
      TitleScreen,
      HelpScreen,
      AboutScreen,
      Shuttingdown,
      PlayerXTurn,
      PlayerOTurn,
      PlayerXWin,
      PlayerOWin,
      Tie
    <span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>

most of the logic is triggered by mouse or key up. It gets messy. I only show you to show the mess.
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="k1">case</span> ALLEGRO_EVENT_KEY_UP:
<span class="number">   2</span>    <span class="k2">{</span>
<span class="number">   3</span>      this-&gt;m_input.OnEventKeyUp<span class="k2">(</span>event.keyboard.keycode<span class="k2">)</span><span class="k2">;</span>
<span class="number">   4</span>
<span class="number">   5</span>      <span class="k1">if</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_OPENBRACE<span class="k2">)</span>
<span class="number">   6</span>      <span class="k2">{</span>
<span class="number">   7</span>        Theme::incTheme<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">   8</span>      <span class="k2">}</span>
<span class="number">   9</span>      <span class="k1">if</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_CLOSEBRACE<span class="k2">)</span>
<span class="number">  10</span>      <span class="k2">{</span>
<span class="number">  11</span>        Theme::decTheme<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  12</span>      <span class="k2">}</span>
<span class="number">  13</span>
<span class="number">  14</span>      this-&gt;m_dirty <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  15</span>      <span class="k1">switch</span> <span class="k2">(</span>this-&gt;m_gameState<span class="k2">)</span>
<span class="number">  16</span>      <span class="k2">{</span>
<span class="number">  17</span>      <span class="k1">case</span> GameState::PlayerXWin:
<span class="number">  18</span>      <span class="k1">case</span> GameState::PlayerOWin:
<span class="number">  19</span>      <span class="k2">{</span>
<span class="number">  20</span>        <span class="k1">if</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_ESCAPE<span class="k2">)</span>
<span class="number">  21</span>        <span class="k2">{</span>
<span class="number">  22</span>          this-&gt;m_grid.reset<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  23</span>          this-&gt;m_gameState <span class="k3">=</span> GameState::TitleScreen<span class="k2">;</span>
<span class="number">  24</span>        <span class="k2">}</span>
<span class="number">  25</span>      <span class="k2">}</span> <span class="k1">break</span><span class="k2">;</span>
<span class="number">  26</span>      <span class="k1">case</span> GameState::PlayerXTurn:
<span class="number">  27</span>      <span class="k1">case</span> GameState::PlayerOTurn:
<span class="number">  28</span>      <span class="k2">{</span>
<span class="number">  29</span>        <span class="k1">if</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_ESCAPE<span class="k2">)</span>
<span class="number">  30</span>        <span class="k2">{</span>
<span class="number">  31</span>          this-&gt;m_gameState <span class="k3">=</span> GameState::TitleScreen<span class="k2">;</span>
<span class="number">  32</span>        <span class="k2">}</span>
<span class="number">  33</span>      <span class="k2">}</span> <span class="k1">break</span><span class="k2">;</span>
<span class="number">  34</span>
<span class="number">  35</span>      <span class="k1">case</span> GameState::HelpScreen:
<span class="number">  36</span>      <span class="k1">case</span> GameState::AboutScreen:
<span class="number">  37</span>      <span class="k2">{</span>
<span class="number">  38</span>        <span class="k1">if</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_ESCAPE<span class="k2">)</span>
<span class="number">  39</span>        <span class="k2">{</span>
<span class="number">  40</span>          this-&gt;m_gameState <span class="k3">=</span> GameState::TitleScreen<span class="k2">;</span>
<span class="number">  41</span>        <span class="k2">}</span>
<span class="number">  42</span>      <span class="k2">}</span> <span class="k1">break</span><span class="k2">;</span>
<span class="number">  43</span>
<span class="number">  44</span>      <span class="k1">case</span> GameState::TitleScreen:
<span class="number">  45</span>      <span class="k2">{</span>
<span class="number">  46</span>        <span class="k1">if</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_ENTER <span class="k3">|</span><span class="k3">|</span>
<span class="number">  47</span>          event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_PAD_ENTER<span class="k2">)</span>
<span class="number">  48</span>        <span class="k2">{</span>
<span class="number">  49</span>          <span class="k1">switch</span> <span class="k2">(</span>this-&gt;m_option<span class="k2">)</span>
<span class="number">  50</span>          <span class="k2">{</span>
<span class="number">  51</span>          <span class="k1">case</span> App::TitleOptions::New:
<span class="number">  52</span>          <span class="k2">{</span>
<span class="number">  53</span>            this-&gt;m_gameState <span class="k3">=</span> GameState::PlayerXTurn<span class="k2">;</span>
<span class="number">  54</span>            <a href="http://www.allegro.cc/manual/al_show_mouse_cursor"><span class="a">al_show_mouse_cursor</span></a><span class="k2">(</span>this-&gt;m_display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  55</span>          <span class="k2">}</span> <span class="k1">break</span><span class="k2">;</span>
<span class="number">  56</span>          <span class="k1">case</span> App::TitleOptions::Help:
<span class="number">  57</span>          <span class="k2">{</span>
<span class="number">  58</span>            this-&gt;m_gameState <span class="k3">=</span> GameState::HelpScreen<span class="k2">;</span>
<span class="number">  59</span>          <span class="k2">}</span> <span class="k1">break</span><span class="k2">;</span>
<span class="number">  60</span>          <span class="k1">case</span> App::TitleOptions::About:
<span class="number">  61</span>          <span class="k2">{</span>
<span class="number">  62</span>            this-&gt;m_gameState <span class="k3">=</span> GameState::AboutScreen<span class="k2">;</span>
<span class="number">  63</span>          <span class="k2">}</span> <span class="k1">break</span><span class="k2">;</span>
<span class="number">  64</span>          <span class="k1">case</span> App::TitleOptions::Quit:
<span class="number">  65</span>          <span class="k2">{</span>
<span class="number">  66</span>            this-&gt;m_kill <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  67</span>          <span class="k2">}</span> <span class="k1">break</span><span class="k2">;</span>
<span class="number">  68</span>          <span class="k2">}</span>
<span class="number">  69</span>        <span class="k2">}</span>
<span class="number">  70</span>
<span class="number">  71</span>        <span class="k1">if</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_UP <span class="k3">|</span><span class="k3">|</span>
<span class="number">  72</span>          event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_PAD_8<span class="k2">)</span>
<span class="number">  73</span>        <span class="k2">{</span>
<span class="number">  74</span>          <span class="k1">if</span> <span class="k2">(</span>this-&gt;m_option <span class="k3">=</span><span class="k3">=</span> App::TitleOptions::New<span class="k2">)</span>
<span class="number">  75</span>          <span class="k2">{</span>
<span class="number">  76</span>            this-&gt;m_option <span class="k3">=</span> App::TitleOptions::Quit<span class="k2">;</span>
<span class="number">  77</span>          <span class="k2">}</span>
<span class="number">  78</span>          <span class="k1">else</span>
<span class="number">  79</span>          <span class="k2">{</span>
<span class="number">  80</span>            this-&gt;m_option <span class="k3">=</span> App::TitleOptions<span class="k2">(</span><span class="k1">static_cast</span><span class="k3">&lt;</span>int32_t&gt;<span class="k2">(</span>this-&gt;m_option<span class="k2">)</span> <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  81</span>          <span class="k2">}</span>
<span class="number">  82</span>        <span class="k2">}</span>
<span class="number">  83</span>        <span class="k1">if</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_DOWN <span class="k3">|</span><span class="k3">|</span>
<span class="number">  84</span>          event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_PAD_2<span class="k2">)</span>
<span class="number">  85</span>        <span class="k2">{</span>
<span class="number">  86</span>          <span class="k1">if</span> <span class="k2">(</span>this-&gt;m_option <span class="k3">=</span><span class="k3">=</span> App::TitleOptions::Quit<span class="k2">)</span>
<span class="number">  87</span>          <span class="k2">{</span>
<span class="number">  88</span>            this-&gt;m_option <span class="k3">=</span> App::TitleOptions::New<span class="k2">;</span>
<span class="number">  89</span>          <span class="k2">}</span>
<span class="number">  90</span>          <span class="k1">else</span>
<span class="number">  91</span>          <span class="k2">{</span>
<span class="number">  92</span>            this-&gt;m_option <span class="k3">=</span> App::TitleOptions<span class="k2">(</span><span class="k1">static_cast</span><span class="k3">&lt;</span>int32_t&gt;<span class="k2">(</span>this-&gt;m_option<span class="k2">)</span> <span class="k3">+</span> <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  93</span>          <span class="k2">}</span>
<span class="number">  94</span>        <span class="k2">}</span>
<span class="number">  95</span>        <span class="k1">if</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_ESCAPE<span class="k2">)</span>
<span class="number">  96</span>        <span class="k2">{</span>
<span class="number">  97</span>          this-&gt;m_kill <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  98</span>        <span class="k2">}</span>
<span class="number">  99</span>      <span class="k2">}</span> <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 100</span>      <span class="k1">case</span> GameState::Tie:
<span class="number"> 101</span>      <span class="k2">{</span>
<span class="number"> 102</span>        <span class="k1">if</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_ESCAPE<span class="k2">)</span>
<span class="number"> 103</span>        <span class="k2">{</span>
<span class="number"> 104</span>          this-&gt;m_gameState <span class="k3">=</span> GameState::TitleScreen<span class="k2">;</span>
<span class="number"> 105</span>          this-&gt;m_grid.reset<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 106</span>        <span class="k2">}</span>
<span class="number"> 107</span>      <span class="k2">}</span> <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 108</span>      default: <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 109</span>      <span class="k2">}</span>
<span class="number"> 110</span>    <span class="k2">}</span> <span class="k1">break</span><span class="k2">;</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Sat, 15 Apr 2023 02:04:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is easily handled with a little inheritance and a screen pointer. Have a base Scene class with a few virtual functions to override like so :</p><p>For instance, here is my Scene class for the latest game I am working on :
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#ifndef Scene_HPP</span>
<span class="number">  2</span><span class="p">#define Scene_HPP</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#include "Eagle/Events.hpp"</span>
<span class="number">  5</span><span class="p">#include "Eagle/AnimationBase.hpp"</span>
<span class="number">  6</span>
<span class="number">  7</span><span class="k1">class</span> EagleGraphicsContext<span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="k1">enum</span> SCENE_STATUS <span class="k2">{</span>
<span class="number"> 10</span>   SCENE_NOTREADY <span class="k3">=</span> <span class="n">0</span>,
<span class="number"> 11</span>   SCENE_READY    <span class="k3">=</span> <span class="n">1</span>,
<span class="number"> 12</span>   SCENE_RUNNING  <span class="k3">=</span> <span class="n">2</span>,
<span class="number"> 13</span>   SCENE_COMPLETE <span class="k3">=</span> <span class="n">4</span>,
<span class="number"> 14</span>   SCENE_ERROR    <span class="k3">=</span> <span class="n">8</span>
<span class="number"> 15</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span><span class="p">#define NUM_SCENES 3</span>
<span class="number"> 18</span>
<span class="number"> 19</span><span class="k1">class</span> Scene <span class="k2">:</span> <span class="k1">public</span> AnimationBase <span class="k2">{</span>
<span class="number"> 20</span>
<span class="number"> 21</span><span class="k1">protected</span> <span class="k2">:</span>
<span class="number"> 22</span>   <span class="k1">bool</span> redraw<span class="k2">;</span>
<span class="number"> 23</span>   <span class="k1">bool</span> quit<span class="k2">;</span>
<span class="number"> 24</span>   <span class="k1">bool</span> complete<span class="k2">;</span>
<span class="number"> 25</span>   SCENE_STATUS status<span class="k2">;</span>
<span class="number"> 26</span>
<span class="number"> 27</span>   <span class="k1">void</span> OnComplete<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>complete <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span><span class="k2">}</span>
<span class="number"> 28</span>   
<span class="number"> 29</span><span class="k1">public</span> <span class="k2">:</span>
<span class="number"> 30</span>   Scene<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>
<span class="number"> 32</span>   <span class="k1">virtual</span> ~Scene<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span>
<span class="number"> 33</span>   
<span class="number"> 34</span>   <span class="k1">virtual</span> <span class="k1">bool</span> Init<span class="k2">(</span>EagleGraphicsContext<span class="k3">*</span> win<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 35</span>   
<span class="number"> 36</span>   <span class="k1">virtual</span> SCENE_STATUS HandleEvent<span class="k2">(</span>EagleEvent ev<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 37</span>   <span class="k1">virtual</span> SCENE_STATUS Update<span class="k2">(</span><span class="k1">double</span> dt<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 38</span>   <span class="k1">virtual</span> <span class="k1">void</span> Display<span class="k2">(</span>EagleGraphicsContext<span class="k3">*</span> win<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 39</span>   
<span class="number"> 40</span>   <span class="k1">bool</span> Redraw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>   <span class="k1">bool</span> Quit<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>   <span class="k1">bool</span> Complete<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 43</span>   SCENE_STATUS Status<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span>
<span class="number"> 45</span>   <span class="k1">virtual</span> <span class="k1">void</span> Reset<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 46</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 47</span>
<span class="number"> 48</span><span class="p">#endif // Scene_HPP</span>
</div></div><p>

It lays the framework to derive new classes of scene. One for each screen you want to have, because each will have different inputs, handle events differently, and draw different things. That&#39;s what the virtual functions are for.</p><p><img src="http://www.allegro.cc/forums/smileys/cool.gif" alt="8-)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 15 Apr 2023 18:35:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Damn Edgar that makes we want to start making a new game! <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dizzy Egg)</author>
		<pubDate>Sat, 15 Apr 2023 19:14:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="remote-thumbnail"><span class="json">{"name":"giphy.gif","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/4\/3\/4351345c99eba961790182ff75abacf7.gif","w":332,"h":168,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/4\/3\/4351345c99eba961790182ff75abacf7"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/4/3/4351345c99eba961790182ff75abacf7-240.jpg" alt="giphy.gif" width="240" height="121" /></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 15 Apr 2023 19:43:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for the input all.  </p><p>I&#39;m not very familiar with virtual functions Edgar but sounds like I need to learn.</p><p>Daniel, I&#39;m assuming all of this runs within the same while loop?</p><p>I was looking over my last game using A4,  It didn&#39;t work with events but I think the concept will work the same.  Previously I used main to call all other functions. IE Title screen. Instruction screen, Playing screen. Outside of calling inits and declaring arrays/variables, main was less than 20 lines of code. I used while loops to keep the game running with in the different functions but stopped for readkeys.  I think that will be the major difference.   </p><p>Again I appreciate the input.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AceBlkwell)</author>
		<pubDate>Mon, 17 Apr 2023 18:27:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Polymorphism</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">class</span> Base
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>public:
<span class="number">  4</span>    Base<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>    <span class="k1">virtual</span> ~Base<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>    <span class="k1">virtual</span> <span class="k1">void</span> draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="k1">class</span> TitleScreen <span class="k2">:</span> <span class="k1">public</span> Base
<span class="number"> 10</span><span class="k2">{</span>
<span class="number"> 11</span>public:
<span class="number"> 12</span>    TitleScreen<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>    ~TitleScreen<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>    <span class="k1">void</span> draw<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 15</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>
<span class="number"> 18</span><span class="k1">class</span> MenuScreen <span class="k2">:</span> <span class="k1">public</span> Base
<span class="number"> 19</span><span class="k2">{</span>
<span class="number"> 20</span>public:
<span class="number"> 21</span>    MenuScreen<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>    ~MenuScreen<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    <span class="k1">void</span> draw<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 24</span><span class="k2">}</span><span class="k2">;</span>
</div></div><p>

Each subclass inherits everything from the base class. Then you can have one Base class variable. Each subclass can have it&#39;s own logic, drawing, event handling.</p><div class="source-code snippet"><div class="inner"><pre>TitleScreen<span class="k3">*</span> title <span class="k3">=</span> <span class="k1">new</span> TitleScreen<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
MenuScreen<span class="k3">*</span> menu <span class="k3">=</span> <span class="k1">new</span> MenuScreen<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
Base<span class="k3">*</span> base <span class="k3">=</span> nullptr<span class="k2">;</span>
</pre></div></div><p>

Depending which game state you are in, you assign base to that subclass.</p><div class="source-code snippet"><div class="inner"><pre>base <span class="k3">=</span> <span class="k2">(</span>Base<span class="k3">*</span><span class="k2">)</span>title<span class="k2">;</span>
base-&gt;draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Then switch if game state switches.
</p><div class="source-code snippet"><div class="inner"><pre>base <span class="k3">=</span> <span class="k2">(</span>Base<span class="k3">*</span><span class="k2">)</span>menu<span class="k2">;</span>
base-&gt;draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Virtual tells the compiler to use the function of the child class if there is one. Otherwise use the function of the base class. The functions of the subclass is optional. </p><p>You can force it by declaring your virtual function like this
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> Base
<span class="k2">{</span>
public:
    Base<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    <span class="k1">virtual</span> ~Base<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    <span class="k1">virtual</span> <span class="k1">void</span> draw<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>

Not each child class is required to have it&#39;s own draw function.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Mon, 17 Apr 2023 18:47:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><a href="https://cplusplus.com/doc/tutorial/classes/">https://cplusplus.com/doc/tutorial/classes/</a> <img src="http://www.allegro.cc/forums/smileys/cool.gif" alt="8-)" /></p><p>The virtual keyword is just a signal to the compiler and base classes that they may override the behavior of this function. If it is a pure absolute function (virtual and ends with )=0; ) then it must be implemented in the derived class before it can be instantiated.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 17 Apr 2023 21:25:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ll have to read up on it some more.  I&#39;m familiar with base classes and inheritance from the stand point that I&#39;ve read up on them. I&#39;ve even done a few exercises.  My limited used of classes isn&#39;t much different than structs.  Well other than private and public.  As such I typically use structs.  I guess it&#39;s time to graduate on.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AceBlkwell)</author>
		<pubDate>Tue, 18 Apr 2023 18:20:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It has it&#39;s uses. Don&#39;t for get <b>protected</b> keyword also.</p><p>Here is my dialog class, which is a subclass of a widget. It&#39;s abstract, meaning you can&#39;t create a Dialog. 
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">namespace</span> Wind
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <span class="k1">class</span> Dialog <span class="k2">:</span> <span class="k1">public</span> Widget
<span class="number">  4</span>  <span class="k2">{</span>
<span class="number">  5</span>  public:
<span class="number">  6</span>    Dialog<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>    <span class="k1">virtual</span> ~Dialog<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnStart<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 10</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnStop<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 11</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnInitialize<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 12</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnShutDown<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 13</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnUpdate<span class="k2">(</span><span class="k1">int32_t</span> tick_count<span class="k2">)</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 14</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnRender<span class="k2">(</span>Allegro::Display<span class="k3">&amp;</span> display<span class="k2">)</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnJoystickAxis<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnJoystickButtonDown<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnJoystickButtonUp<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnJoystickConfiguration<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnKeyDown<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnKeyUp<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnKeyChar<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnMouseClick<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnMouseAxes<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnMouseButtonDown<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnMouseButtonUp<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnMouseEnterDisplay<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnMouseLeaveDisplay<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnMouseWarped<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnDisplayResize<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnDisplayClose<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnDisplayLost<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnDisplayFound<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnDisplaySwitchIn<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 35</span>    <span class="k1">virtual</span> <span class="k1">bool</span> OnDisplaySwitchOut<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>    <span class="k1">virtual</span> <span class="k1">void</span> NotifyParent<span class="k2">(</span><span class="k1">int32_t</span> n, <span class="k1">void</span><span class="k3">*</span> data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>
<span class="number"> 38</span>    <span class="k1">void</span> AddWidget<span class="k2">(</span>Widget<span class="k3">*</span> widget<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</span>    <span class="k1">virtual</span> Widget<span class="k3">*</span> GetWidget<span class="k2">(</span><span class="k1">int32_t</span> x, <span class="k1">int32_t</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span>
<span class="number"> 41</span>  protected:
<span class="number"> 42</span>
<span class="number"> 43</span>    Dialog<span class="k2">(</span><span class="k1">const</span> Dialog<span class="k3">&amp;</span> Dialog<span class="k2">)</span> <span class="k3">=</span> <span class="k1">delete</span><span class="k2">;</span>
<span class="number"> 44</span>    Dialog<span class="k3">&amp;</span> <span class="k1">operator</span> <span class="k3">=</span> <span class="k2">(</span><span class="k1">const</span> Dialog<span class="k3">&amp;</span> Dialog<span class="k2">)</span> <span class="k3">=</span> <span class="k1">delete</span><span class="k2">;</span>
<span class="number"> 45</span>    std::vector<span class="k3">&lt;</span>Dialog<span class="k3">*</span><span class="k3">&gt;</span> m_children<span class="k2">;</span>
<span class="number"> 46</span>    std::vector<span class="k3">&lt;</span>Widget<span class="k3">*</span><span class="k3">&gt;</span> m_widgets<span class="k2">;</span>
<span class="number"> 47</span>  <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 48</span><span class="k2">}</span>
</div></div><p>

My starting dialog. I don&#39;t use most of the events in this class. I left them in there, but commented them out.
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>  <span class="k1">class</span> Game <span class="k2">:</span> <span class="k1">public</span> Wind::Dialog
<span class="number">  2</span>  <span class="k2">{</span>
<span class="number">  3</span>  public:
<span class="number">  4</span>    Game<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>    ~Game<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>    <span class="k1">bool</span> OnStart<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>    <span class="k1">bool</span> OnStop<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>    <span class="k1">bool</span> OnInitialize<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>    <span class="k1">bool</span> OnShutDown<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>    <span class="k1">bool</span> OnUpdate<span class="k2">(</span><span class="k1">int32_t</span> tick_count<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>    <span class="k1">bool</span> OnRender<span class="k2">(</span>Allegro::Display<span class="k3">&amp;</span> display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>
<span class="number"> 14</span>    <span class="c">//bool OnJoystickAxis(const Allegro::Event&amp; event);</span>
<span class="number"> 15</span>    <span class="c">//bool OnJoystickButtonDown(const Allegro::Event&amp; event);</span>
<span class="number"> 16</span>    <span class="c">//bool OnJoystickButtonUp(const Allegro::Event&amp; event);</span>
<span class="number"> 17</span>    <span class="c">//bool OnJoystickConfiguration(const Allegro::Event&amp; event);</span>
<span class="number"> 18</span>    <span class="c">//bool OnKeyDown(const Allegro::Event&amp; event);</span>
<span class="number"> 19</span>    <span class="c">//bool OnKeyUp(const Allegro::Event&amp; event);</span>
<span class="number"> 20</span>    <span class="c">//bool OnKeyChar(const Allegro::Event&amp; event);</span>
<span class="number"> 21</span>    <span class="c">//bool OnMouseClick(const Allegro::Event&amp; event);</span>
<span class="number"> 22</span>    <span class="c">//bool OnMouseDoubleClick(const Allegro::Event&amp; event);</span>
<span class="number"> 23</span>    <span class="c">//bool OnMouseAxes(const Allegro::Event&amp; event);</span>
<span class="number"> 24</span>    <span class="c">//bool OnMouseButtonDown(const Allegro::Event&amp; event);</span>
<span class="number"> 25</span>    <span class="c">//bool OnMouseButtonUp(const Allegro::Event&amp; event);</span>
<span class="number"> 26</span>    <span class="c">//bool OnMouseEnterDisplay(const Allegro::Event&amp; event);</span>
<span class="number"> 27</span>    <span class="c">//bool OnMouseLeaveDisplay(const Allegro::Event&amp; event);</span>
<span class="number"> 28</span>    <span class="c">//bool OnMouseWarped(const Allegro::Event&amp; event);</span>
<span class="number"> 29</span>    <span class="k1">bool</span> OnDisplayResize<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>    <span class="k1">bool</span> OnDisplayClose<span class="k2">(</span><span class="k1">const</span> Allegro::Event<span class="k3">&amp;</span> event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>    <span class="c">//bool OnDisplayLost(const Allegro::Event&amp; event);</span>
<span class="number"> 32</span>    <span class="c">//bool OnDisplayFound(const Allegro::Event&amp; event);</span>
<span class="number"> 33</span>    <span class="c">//bool OnDisplaySwitchIn(const Allegro::Event&amp; event);</span>
<span class="number"> 34</span>    <span class="c">//bool OnDisplaySwitchOut(const Allegro::Event&amp; event);</span>
<span class="number"> 35</span>    <span class="k1">void</span> NotifyParent<span class="k2">(</span><span class="k1">int32_t</span> n, <span class="k1">void</span><span class="k3">*</span> data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>
<span class="number"> 37</span>  private:
<span class="number"> 38</span>  <span class="k2">}</span><span class="k2">;</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Tue, 18 Apr 2023 20:44:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Java&#39;s one listener class for every event is total over-engineering. In my opinion so is having an <span class="source-code">OnEvent</span> method for every event type. It&#39;s simple enough to let a widget or a dialog or a screen or an object to handle a single event and modify it&#39;s behavior based on the type.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 19 Apr 2023 20:38:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In your opinion, you can keep to yourself.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Thu, 20 Apr 2023 20:38:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In any case, talking with you guys lets me know how much I really don&#39;t know <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=";D" border="0" />. <br />I appreciate the input.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AceBlkwell)</author>
		<pubDate>Thu, 20 Apr 2023 20:48:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wouldn&#39;t want to offend anyone with my opinion. <img src="http://www.allegro.cc/forums/smileys/embarassed.gif" alt=":-[" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 20 Apr 2023 21:21:24 +0000</pubDate>
	</item>
</rss>
