<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>game state and level transition approaches</title>
		<link>http://www.allegro.cc/forums/view/613788</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 18 Jan 2014 17:22:37 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey there everybody!</p><p>Although I registered this account quite some time ago, I decided to start working on a 2D shooter project I&#39;ve been conceptualizing for a while now and had some questions about code design. Specifically, as it pertains to game states and levels.</p><p>So far, I have a base entity class with a working player class, projectile, and parallel scrolling background class, all designed to be updated and rendered using lists and polymorphism. However, I&#39;ve hit a few roadblocks as to how I should continue.</p><p>My question is whats the best approach for scripting enemy encounters for levels? I&#39;ve looked around online but cannot seem to find any good tutorials or examples.</p><p>EDIT: I suppose I should kind of elaborate on this a bit. by enemy encounters, I meant designing levels in such a way that enemy spawns can be queued in some way based on the current level the player is on. My goal is to eventually design the game in such a way that I can use a level editor to make new levels and load them as files in the game. I was hoping someone might be able to point me in the right direction.</p><p>Also, I was wondering if someone could provide me with some advice for an effective approach for creating different game states for menus and such? I was thinking of using multiple entity lists instead of the single one I currently have, one for each state. Then I&#39;d use condition branching in the main loop to determine how input behaves and which entity list to loop through for update/render. I&#39;m pretty sure this would work, but my gut tells me there might be a more flexible approach that I might be missing. Any advice would be greatly appreciated!</p><p>If it helps, here is my main loop atm. Feel free to pick it apart. The more feedback I can get, the better!</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">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;allegro5/allegro_image.h&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">   4</span><span class="p">#include &lt;allegro5/allegro_font.h&gt;</span>
<span class="number">   5</span><span class="p">#include &lt;allegro5/allegro_ttf.h&gt;</span>
<span class="number">   6</span><span class="p">#include &lt;allegro5/allegro_audio.h&gt;</span>
<span class="number">   7</span><span class="p">#include &lt;allegro5/allegro_acodec.h&gt;</span>
<span class="number">   8</span><span class="p">#include &lt;list&gt;</span>
<span class="number">   9</span>
<span class="number">  10</span>
<span class="number">  11</span><span class="p">#include "globals.h"</span>
<span class="number">  12</span><span class="p">#include "entity.h"</span>
<span class="number">  13</span><span class="p">#include "background.h"</span>
<span class="number">  14</span><span class="p">#include "player.h"</span>
<span class="number">  15</span><span class="p">#include "bullet.h"</span>
<span class="number">  16</span><span class="p">#include "pointer.h"</span>
<span class="number">  17</span>
<span class="number">  18</span><span class="p">#include "imageMgr.h"</span>
<span class="number">  19</span>
<span class="number">  20</span><span class="c">//---local globals---//</span>
<span class="number">  21</span>
<span class="number">  22</span><span class="c">//--Entity lists--//</span>
<span class="number">  23</span>std::list<span class="k3">&lt;</span>entity <span class="k3">*</span><span class="k3">&gt;</span> entities<span class="k2">;</span>
<span class="number">  24</span>std::list<span class="k3">&lt;</span>entity <span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator iter<span class="k2">;</span>
<span class="number">  25</span>std::list<span class="k3">&lt;</span>entity <span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator iter2<span class="k2">;</span>
<span class="number">  26</span>
<span class="number">  27</span><span class="c">//--project globals--//</span>
<span class="number">  28</span>imageMgr <span class="k3">*</span>image <span class="k3">=</span> <span class="k1">new</span> imageMgr<span class="k2">;</span>
<span class="number">  29</span>
<span class="number">  30</span>background <span class="k3">*</span>bg <span class="k3">=</span> <span class="k1">new</span> background<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  31</span><span class="c">//background *fg = new background();</span>
<span class="number">  32</span>
<span class="number">  33</span>player <span class="k3">*</span>ship <span class="k3">=</span> <span class="k1">new</span> player<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  34</span>pointer <span class="k3">*</span>cursor <span class="k3">=</span> <span class="k1">new</span> pointer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  35</span>
<span class="number">  36</span>
<span class="number">  37</span>
<span class="number">  38</span><span class="c">//Project function prototypes</span>
<span class="number">  39</span><span class="k1">float</span> __cdecl cursorX<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  40</span><span class="k1">float</span> __cdecl cursorY<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  41</span>
<span class="number">  42</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  43</span>    
<span class="number">  44</span>    <span class="c">//Shell variables</span>
<span class="number">  45</span>    <span class="k1">bool</span> done <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  46</span>    <span class="k1">bool</span> render <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  47</span>    <span class="k1">bool</span> keys<span class="k2">[</span><span class="n">5</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span><span class="k1">false</span>, <span class="k1">false</span>, <span class="k1">false</span>, <span class="k1">false</span>, <span class="k1">false</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  48</span>    
<span class="number">  49</span>    <span class="k1">float</span> gameTime <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  50</span>    <span class="k1">int</span> frames <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  51</span>    <span class="k1">int</span> gameFPS <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  52</span>    
<span class="number">  53</span>    <span class="c">//Allegro variables</span>
<span class="number">  54</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>display <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  55</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>event_queue <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  56</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a> <span class="k3">*</span>timer<span class="k2">;</span>
<span class="number">  57</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a> <span class="k3">*</span>font18<span class="k2">;</span>
<span class="number">  58</span>    
<span class="number">  59</span>    <span class="c">//Allegro init functions</span>
<span class="number">  60</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  61</span>       <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"Failed to initialize allegro!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  62</span>       <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  63</span>    <span class="k2">}</span>
<span class="number">  64</span>    
<span class="number">  65</span>    display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span>WIDTH, HEIGHT<span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>display<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  67</span>       <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"Failed to create display!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>       <span class="k1">return</span> <span class="k3">-</span><span class="n">1</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="c">//Addon install functions</span>
<span class="number">  72</span>    <a href="http://www.allegro.cc/manual/al_install_keyboard"><span class="a">al_install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  73</span>    <a href="http://www.allegro.cc/manual/al_install_mouse"><span class="a">al_install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  74</span>    <a href="http://www.allegro.cc/manual/al_init_image_addon"><span class="a">al_init_image_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  75</span>    <a href="http://www.allegro.cc/manual/al_init_font_addon"><span class="a">al_init_font_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  76</span>    <a href="http://www.allegro.cc/manual/al_init_ttf_addon"><span class="a">al_init_ttf_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  77</span>    <a href="http://www.allegro.cc/manual/al_init_primitives_addon"><span class="a">al_init_primitives_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  78</span>    
<span class="number">  79</span>    <span class="c">//Project initialization</span>
<span class="number">  80</span>    image-&gt;init<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  81</span>    
<span class="number">  82</span>    font18 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_font"><span class="a">al_load_font</span></a><span class="k2">(</span><span class="s">"Fonts/arial.ttf"</span>, <span class="n">18</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>    
<span class="number">  84</span>    bg-&gt;init<span class="k2">(</span><span class="n">1</span>, image-&gt;bg<span class="k2">)</span><span class="k2">;</span>
<span class="number">  85</span>    entities.push_back<span class="k2">(</span>bg<span class="k2">)</span><span class="k2">;</span>
<span class="number">  86</span>    
<span class="number">  87</span>    cursor-&gt;init<span class="k2">(</span>WIDTH<span class="k3">/</span><span class="n">2</span>,HEIGHT<span class="k3">/</span><span class="n">2</span>, image-&gt;cursor<span class="k2">)</span><span class="k2">;</span>
<span class="number">  88</span>    entities.push_back<span class="k2">(</span>cursor<span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span>    
<span class="number">  90</span>    ship-&gt;init<span class="k2">(</span><span class="k3">&amp;</span>cursorX, <span class="k3">&amp;</span>cursorY, image-&gt;player<span class="k2">)</span><span class="k2">;</span>
<span class="number">  91</span>    entities.push_back<span class="k2">(</span>ship<span class="k2">)</span><span class="k2">;</span>
<span class="number">  92</span>    
<span class="number">  93</span>    <span class="c">//Timer init and setup</span>
<span class="number">  94</span>    event_queue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  95</span>    timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span><span class="k3">/</span><span class="n">60</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  96</span>    
<span class="number">  97</span>    <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  98</span>    <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_keyboard_event_source"><span class="a">al_get_keyboard_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  99</span>    <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_mouse_event_source"><span class="a">al_get_mouse_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 100</span>    
<span class="number"> 101</span>    <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 102</span>    
<span class="number"> 103</span>    <a href="http://www.allegro.cc/manual/al_hide_mouse_cursor"><span class="a">al_hide_mouse_cursor</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 104</span>    
<span class="number"> 105</span>    <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>done<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 106</span>          
<span class="number"> 107</span>          <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number"> 108</span>          <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>event_queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 109</span>          
<span class="number"> 110</span>          <span class="c">//Event decision branch</span>
<span class="number"> 111</span>          <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 112</span>              <span class="k1">switch</span><span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 113</span>                  <span class="k1">case</span> ALLEGRO_KEY_ESCAPE:
<span class="number"> 114</span>                       done <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 115</span>                       <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 116</span>                  <span class="k1">case</span> ALLEGRO_KEY_LEFT:
<span class="number"> 117</span>                       keys<span class="k2">[</span>LEFT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 118</span>                       <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 119</span>                  <span class="k1">case</span> ALLEGRO_KEY_RIGHT:
<span class="number"> 120</span>                       keys<span class="k2">[</span>RIGHT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 121</span>                       <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 122</span>                  <span class="k1">case</span> ALLEGRO_KEY_UP:
<span class="number"> 123</span>                       keys<span class="k2">[</span>UP<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 124</span>                       <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 125</span>                  <span class="k1">case</span> ALLEGRO_KEY_DOWN:
<span class="number"> 126</span>                       keys<span class="k2">[</span>DOWN<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 127</span>                       <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 128</span>              <span class="k2">}</span>
<span class="number"> 129</span>          <span class="k2">}</span>
<span class="number"> 130</span>          <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_UP<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 131</span>               <span class="k1">switch</span><span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 132</span>                   <span class="k1">case</span> ALLEGRO_KEY_ESCAPE:
<span class="number"> 133</span>                        done <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 134</span>                        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 135</span>                   <span class="k1">case</span> ALLEGRO_KEY_LEFT:
<span class="number"> 136</span>                        keys<span class="k2">[</span>LEFT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 137</span>                        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 138</span>                   <span class="k1">case</span> ALLEGRO_KEY_RIGHT:
<span class="number"> 139</span>                        keys<span class="k2">[</span>RIGHT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 140</span>                        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 141</span>                   <span class="k1">case</span> ALLEGRO_KEY_UP:
<span class="number"> 142</span>                        keys<span class="k2">[</span>UP<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 143</span>                        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 144</span>                   <span class="k1">case</span> ALLEGRO_KEY_DOWN:
<span class="number"> 145</span>                        keys<span class="k2">[</span>DOWN<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 146</span>                        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 147</span>               <span class="k2">}</span>
<span class="number"> 148</span>          <span class="k2">}</span>
<span class="number"> 149</span>          <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_MOUSE_AXES<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 150</span>               cursor-&gt;setX<span class="k2">(</span>ev.mouse.x<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 151</span>               cursor-&gt;setY<span class="k2">(</span>ev.mouse.y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 152</span>          <span class="k2">}</span>
<span class="number"> 153</span>          <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_MOUSE_BUTTON_DOWN<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 154</span>               bullet <span class="k3">*</span>Bullet1 <span class="k3">=</span> <span class="k1">new</span> bullet<span class="k2">(</span>ship-&gt;getTurret1X<span class="k2">(</span><span class="k2">)</span>, 
<span class="number"> 155</span>               ship-&gt;getTurret1Y<span class="k2">(</span><span class="k2">)</span>, ship-&gt;getTurret1Angle<span class="k2">(</span><span class="k2">)</span>, <span class="n">20</span>, PLAYER_BULLET<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 156</span>               entities.push_back<span class="k2">(</span>Bullet1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 157</span>               bullet <span class="k3">*</span>Bullet2 <span class="k3">=</span> <span class="k1">new</span> bullet<span class="k2">(</span>ship-&gt;getTurret2X<span class="k2">(</span><span class="k2">)</span>,
<span class="number"> 158</span>               ship-&gt;getTurret2Y<span class="k2">(</span><span class="k2">)</span>, ship-&gt;getTurret2Angle<span class="k2">(</span><span class="k2">)</span>, <span class="n">20</span>, PLAYER_BULLET<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 159</span>               entities.push_back<span class="k2">(</span>Bullet2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 160</span>          <span class="k2">}</span>
<span class="number"> 161</span>          <span class="c">// Update Game</span>
<span class="number"> 162</span>          <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 163</span>               
<span class="number"> 164</span>               render <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 165</span>               
<span class="number"> 166</span>               <span class="c">//Update Frames per second</span>
<span class="number"> 167</span>               frames<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 168</span>               <span class="k1">if</span><span class="k2">(</span>al_current_time<span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> gameTime <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 169</span>                   gameTime <span class="k3">=</span> al_current_time<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 170</span>                   gameFPS <span class="k3">=</span> frames<span class="k2">;</span>
<span class="number"> 171</span>                   frames <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 172</span>               <span class="k2">}</span>
<span class="number"> 173</span>               
<span class="number"> 174</span>               <span class="c">//Player Movement Buffer here.</span>
<span class="number"> 175</span>               ship-&gt;playerMovement<span class="k2">(</span>keys<span class="k2">[</span>UP<span class="k2">]</span>, keys<span class="k2">[</span>DOWN<span class="k2">]</span>, keys<span class="k2">[</span>LEFT<span class="k2">]</span>, keys<span class="k2">[</span>RIGHT<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 176</span>               
<span class="number"> 177</span>               
<span class="number"> 178</span>               <span class="c">//Update objects</span>
<span class="number"> 179</span>               <span class="k1">for</span> <span class="k2">(</span>iter <span class="k3">=</span> entities.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> iter <span class="k3">!</span><span class="k3">=</span> entities.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>iter<span class="k2">)</span>
<span class="number"> 180</span>                   <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 181</span>               
<span class="number"> 182</span>               <span class="c">//Collisions</span>
<span class="number"> 183</span>               <span class="k1">for</span><span class="k2">(</span>iter <span class="k3">=</span> entities.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> iter <span class="k3">!</span><span class="k3">=</span> entities.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>iter<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 184</span>                   <span class="k1">if</span><span class="k2">(</span> <span class="k3">!</span> <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Collidable<span class="k2">(</span><span class="k2">)</span> <span class="k2">)</span> <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 185</span>                       <span class="k1">for</span><span class="k2">(</span>iter2 <span class="k3">=</span> iter<span class="k2">;</span> iter2 <span class="k3">!</span><span class="k3">=</span> entities.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>iter2<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 186</span>                           <span class="k1">if</span><span class="k2">(</span> <span class="k3">!</span><span class="k2">(</span><span class="k3">*</span>iter2<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Collidable<span class="k2">(</span><span class="k2">)</span> <span class="k2">)</span> <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 187</span>                           <span class="k1">if</span><span class="k2">(</span> <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getID<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>iter2<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getID<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 188</span>                           <span class="k1">if</span><span class="k2">(</span> <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>checkCollision<span class="k2">(</span> <span class="k2">(</span><span class="k3">*</span>iter2<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 189</span>                               <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>collided<span class="k2">(</span> <span class="k2">(</span><span class="k3">*</span>iter2<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getID<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 190</span>                   <span class="k2">(</span><span class="k3">*</span>iter2<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>collided<span class="k2">(</span> <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getID<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 191</span>                               <span class="c">//something died</span>
<span class="number"> 192</span>                   <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 193</span>                <span class="k2">}</span>
<span class="number"> 194</span>              <span class="k2">}</span>
<span class="number"> 195</span>            <span class="k2">}</span>
<span class="number"> 196</span>                
<span class="number"> 197</span>               <span class="c">//remove dead objects.</span>
<span class="number"> 198</span>               <span class="k1">for</span> <span class="k2">(</span>iter <span class="k3">=</span> entities.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> iter <span class="k3">!</span><span class="k3">=</span> entities.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 199</span>                   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span> <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getAlive<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 200</span>                       <span class="k1">delete</span><span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 201</span>                       iter <span class="k3">=</span> entities.erase<span class="k2">(</span>iter<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 202</span>                   <span class="k2">}</span>
<span class="number"> 203</span>                   <span class="k1">else</span>
<span class="number"> 204</span>                       iter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 205</span>               <span class="k2">}</span> 
<span class="number"> 206</span>          <span class="k2">}</span>
<span class="number"> 207</span>          
<span class="number"> 208</span>          <span class="c">//Render</span>
<span class="number"> 209</span>          <span class="k1">if</span> <span class="k2">(</span>render <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 210</span>              render <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 211</span>              
<span class="number"> 212</span>              <span class="c">//Render objects.</span>
<span class="number"> 213</span>              <span class="c">//int count = 0;</span>
<span class="number"> 214</span>              <span class="k1">for</span> <span class="k2">(</span>iter <span class="k3">=</span> entities.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> iter <span class="k3">!</span><span class="k3">=</span> entities.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>iter<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 215</span>                  <span class="c">//++count;</span>
<span class="number"> 216</span>                 <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>render<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 217</span>              <span class="k2">}</span>
<span class="number"> 218</span>              <span class="c">//std::cout &lt;&lt; "entities: " &lt;&lt; count &lt;&lt; "\n";</span>
<span class="number"> 219</span>                 
<span class="number"> 220</span>              <span class="c">//Render overlay</span>
<span class="number"> 221</span>              <a href="http://www.allegro.cc/manual/al_draw_textf"><span class="a">al_draw_textf</span></a><span class="k2">(</span>font18, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span>, WIDTH <span class="k3">-</span> <span class="n">70</span>, HEIGHT <span class="k3">-</span> <span class="n">20</span>, <span class="n">0</span>, <span class="s">"FPS: %i"</span>, gameFPS<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 222</span>              
<span class="number"> 223</span>              <span class="c">//Flip render buffers.</span>
<span class="number"> 224</span>              <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 225</span>              <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 226</span>          <span class="k2">}</span>
<span class="number"> 227</span>    <span class="k2">}</span>
<span class="number"> 228</span>    
<span class="number"> 229</span>    <span class="c">//Destroy project objects</span>
<span class="number"> 230</span>    <span class="k1">for</span> <span class="k2">(</span>iter <span class="k3">=</span> entities.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> iter <span class="k3">!</span><span class="k3">=</span> entities.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>iter<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 231</span>        <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>destroy<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 232</span>        <span class="k1">delete</span> <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 233</span>        iter <span class="k3">=</span> entities.erase<span class="k2">(</span>iter<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 234</span>    <span class="k2">}</span>
<span class="number"> 235</span>    
<span class="number"> 236</span>    <span class="c">//Destroy allegro objects</span>
<span class="number"> 237</span>    <a href="http://www.allegro.cc/manual/al_destroy_font"><span class="a">al_destroy_font</span></a><span class="k2">(</span>font18<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 238</span>    <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 239</span>    <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 240</span>    <span class="k1">delete</span> image<span class="k2">;</span>
<span class="number"> 241</span>    <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 242</span>    
<span class="number"> 243</span>    
<span class="number"> 244</span>    <span class="k1">return</span> EXIT_SUCCESS<span class="k2">;</span>
<span class="number"> 245</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 246</span>
<span class="number"> 247</span><span class="k1">float</span> __cdecl cursorX<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 248</span>    <span class="k1">return</span> cursor-&gt;getX<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 249</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 250</span>
<span class="number"> 251</span><span class="k1">float</span> __cdecl cursorY<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> 
<span class="number"> 252</span>     <span class="k1">return</span> cursor-&gt;getY<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 253</span><span class="k2">}</span><span class="k2">;</span>
</div></div><p>

Thanks for your time guys. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Aniconic)</author>
		<pubDate>Sat, 18 Jan 2014 14:29:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I suppose it depends on what exactly you want your game to feel like, but I see two ways of doing it:</p><p>1. Keep a list of spawns and a list of delays. Spawn all enemies contained in the group spawns[i], wait for delays[i] seconds, increment, repeat.</p><p>2. Keep a list of spawns. Spawn all enemies contained in the group spawns[i]. When all enemies in spawns[i] have been destroyed, increment and repeat.</p><p>I think you could also mix those two strategies, if you want to go a more advanced route.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Schyfis)</author>
		<pubDate>Sat, 18 Jan 2014 17:02:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Personally, I&#39;m not a fan of using polymorphism for trivial cases like this. Compositions are a lot easier, IMO.</p><p>If you want to spawn enemy ships you have a couple options:</p><p>1) Player can&#39;t move beyond screen: enemies show up at timed intervals.<br />2) Player scrolls the screen: enemies are at specific coordinates.</p><p>Either way, what you want to do is to distill the data that makes each enemy unique. Let&#39;s take the first example, because that one is simpler IMO.</p><p>In order to make an enemy appear we need to know how far along the screen you want him to show up, when he shows up, what type of enemy, and possibly what level. I&#39;ll represent this data as a struct, but you can do classes or whathaveyou.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">struct</span> gen_enemy <span class="k2">{</span>
    <span class="k1">unsigned</span> <span class="k1">int</span> secs<span class="k2">;</span> <span class="c">//how long until he shows up</span>
    <span class="k1">float</span> x<span class="k2">;</span> <span class="c">//how far along the screen</span>
    <span class="k1">unsigned</span> <span class="k1">int</span> type<span class="k2">;</span> <span class="c">//the type (good use for enumeration?)</span>
    <span class="k1">unsigned</span> <span class="k1">int</span> lvl<span class="k2">;</span> <span class="c">//level if applicable</span>
    <span class="c">//more custom data</span>
<span class="k2">}</span>
</pre></div></div><p>

Basically each level will consist of a list of these structs. Every second, have your code check the list for new enemy arrivals (checked vs secs since the start of the level). If it is time to make new friends... er... enemies place enemy of type, x pixels over, and have him start doing his thing.</p><p>Remove enemies when they fall below the screen or die.</p><p>The level ends when <b>both</b> the list is empty and there are no enemies alive.</p><p>As for game states, you will have to think ahead about that. It is rarely covered, but all that it takes is planning!</p><p>EDIT:</p><p>Ah! Schyfis beat me to it.</p><p>Note that despite our similar answers we both had slightly different ideas as to what to do and how to implement it. The trick is to break your problems down in the manner you see fit.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (furinkan)</author>
		<pubDate>Sat, 18 Jan 2014 17:22:37 +0000</pubDate>
	</item>
</rss>
