<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Putting subbitmaps in vectors</title>
		<link>http://www.allegro.cc/forums/view/614421</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 09 Jul 2014 10:34:44 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Can someone please help me fix this so it doesn&#39;t segfault? I assume I&#39;m missing something obvious, though. I assume the issue is something I&#39;m missing about how std::vector works, but I thought that it copies the data. </p><p>This code is based on <a href="https://wiki.allegro.cc/index.php?title=Allegro_5_Tutorial">https://wiki.allegro.cc/index.php?title=Allegro_5_Tutorial</a><br />/Input .
</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;stdio.h&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;vector&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   4</span>
<span class="number">   5</span>    <span class="k1">class</span> Al_container
<span class="number">   6</span>    <span class="k2">{</span>
<span class="number">   7</span>
<span class="number">   8</span>    public:
<span class="number">   9</span>        <span class="k1">int</span> resize<span class="k2">(</span><span class="k1">int</span> w, <span class="k1">int</span> h<span class="k2">)</span>
<span class="number">  10</span>        <span class="k2">{</span>
<span class="number">  11</span>            <span class="k1">if</span><span class="k2">(</span>this-&gt;data <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  12</span>                <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>this-&gt;data<span class="k2">)</span><span class="k2">;</span>
<span class="number">  13</span>            <span class="k2">}</span>
<span class="number">  14</span>            this-&gt;data <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span>w,h<span class="k2">)</span><span class="k2">;</span>
<span class="number">  15</span>            <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  16</span>        <span class="k2">}</span>
<span class="number">  17</span>
<span class="number">  18</span>        <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>data<span class="k2">;</span>
<span class="number">  19</span>
<span class="number">  20</span>        Al_container<span class="k2">(</span><span class="k2">)</span>
<span class="number">  21</span>        <span class="k2">{</span>
<span class="number">  22</span>            this-&gt;data <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  23</span>        <span class="k2">}</span>
<span class="number">  24</span>
<span class="number">  25</span>        ~Al_container<span class="k2">(</span><span class="k2">)</span>
<span class="number">  26</span>        <span class="k2">{</span>
<span class="number">  27</span>            <span class="k1">if</span><span class="k2">(</span>this-&gt;data <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  28</span>                <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>this-&gt;data<span class="k2">)</span><span class="k2">;</span>
<span class="number">  29</span>            <span class="k2">}</span>
<span class="number">  30</span>        <span class="k2">}</span>
<span class="number">  31</span>
<span class="number">  32</span>
<span class="number">  33</span>    <span class="k2">}</span><span class="k2">;</span>
<span class="number">  34</span>
<span class="number">  35</span>    <span class="k1">class</span> Image
<span class="number">  36</span>    <span class="k2">{</span>
<span class="number">  37</span>    public:
<span class="number">  38</span>        Al_container image<span class="k2">;</span>
<span class="number">  39</span>        Image<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span>
<span class="number">  40</span>        ~Image<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span>
<span class="number">  41</span>    <span class="k2">}</span><span class="k2">;</span>
<span class="number">  42</span>
<span class="number">  43</span>    <span class="k1">const</span> <span class="k1">float</span> FPS <span class="k3">=</span> <span class="n">60</span><span class="k2">;</span>
<span class="number">  44</span>    <span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a> <span class="k3">=</span> <span class="n">640</span><span class="k2">;</span>
<span class="number">  45</span>    <span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a> <span class="k3">=</span> <span class="n">480</span><span class="k2">;</span>
<span class="number">  46</span>    <span class="k1">const</span> <span class="k1">int</span> BOUNCER_SIZE <span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number">  47</span>
<span class="number">  48</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">  49</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">  50</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">  51</span>        <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a> <span class="k3">*</span>timer <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  52</span>        <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>bouncer <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  53</span>        <span class="k1">float</span> bouncer_x <span class="k3">=</span> <a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a> <span class="k3">/</span> <span class="n">2</span>.<span class="n">0</span> <span class="k3">-</span> BOUNCER_SIZE <span class="k3">/</span> <span class="n">2</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number">  54</span>        <span class="k1">float</span> bouncer_y <span class="k3">=</span> <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a> <span class="k3">/</span> <span class="n">2</span>.<span class="n">0</span> <span class="k3">-</span> BOUNCER_SIZE <span class="k3">/</span> <span class="n">2</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number">  55</span>        <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  56</span>
<span class="number">  57</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">  58</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">  59</span>            <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  60</span>        <span class="k2">}</span>
<span class="number">  61</span>
<span class="number">  62</span>        <span class="k1">if</span><span class="k2">(</span><span class="k3">!</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="k2">{</span>
<span class="number">  63</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 the mouse!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  64</span>            <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  65</span>        <span class="k2">}</span>
<span class="number">  66</span>
<span class="number">  67</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> FPS<span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>        <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  69</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 timer!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  70</span>            <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  71</span>        <span class="k2">}</span>
<span class="number">  72</span>
<span class="number">  73</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><a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number">  74</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">  75</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">  76</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">  77</span>            <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  78</span>        <span class="k2">}</span>
<span class="number">  79</span>
<span class="number">  80</span>        bouncer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span>BOUNCER_SIZE, BOUNCER_SIZE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  81</span>        <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bouncer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  82</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 bouncer bitmap!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</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">  84</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">  85</span>            <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  86</span>        <span class="k2">}</span>
<span class="number">  87</span>
<span class="number">  88</span>        <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span>
<span class="number">  90</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">255</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  91</span>
<span class="number">  92</span>        <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  93</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>        <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>event_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  96</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 event_queue!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  97</span>            <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  98</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">  99</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"> 100</span>            <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 101</span>        <span class="k2">}</span>
<span class="number"> 102</span>
<span class="number"> 103</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_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 104</span>
<span class="number"> 105</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"> 106</span>
<span class="number"> 107</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"> 108</span>
<span class="number"> 109</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"> 110</span>
<span class="number"> 111</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"> 112</span>
<span class="number"> 113</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"> 114</span>
<span class="number"> 115</span>
<span class="number"> 116</span><span class="c">/// NEW</span>
<span class="number"> 117</span>
<span class="number"> 118</span>
<span class="number"> 119</span>        <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>myBitmap <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span><span class="n">96</span>,<span class="n">32</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 120</span>        <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>myBitmap<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 121</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">255</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 122</span>        <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 123</span>
<span class="number"> 124</span>        Image temp_Image<span class="k2">;</span>
<span class="number"> 125</span>        std::vector<span class="k3">&lt;</span>Image&gt; new_Images<span class="k2">;</span>
<span class="number"> 126</span>
<span class="number"> 127</span>        <span class="k1">int</span> i<span class="k2">;</span>
<span class="number"> 128</span>        <span class="k1">for</span><span class="k2">(</span>i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span><span class="n">3</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 129</span>            <span class="k1">if</span><span class="k2">(</span>temp_Image.image.data <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 130</span>                temp_Image.image.data <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 131</span>            <span class="k2">}</span>
<span class="number"> 132</span>            temp_Image.image.data <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_sub_bitmap"><span class="a">al_create_sub_bitmap</span></a><span class="k2">(</span>myBitmap,i<span class="k3">*</span><span class="n">32</span>, <span class="n">0</span>, <span class="n">32</span>, <span class="n">32</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 133</span>            new_Images.push_back<span class="k2">(</span>temp_Image<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 134</span>
<span class="number"> 135</span>        <span class="k2">}</span>
<span class="number"> 136</span>
<span class="number"> 137</span><span class="c">/// TO HERE</span>
<span class="number"> 138</span>
<span class="number"> 139</span>        <span class="k1">while</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 140</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"> 141</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"> 142</span>
<span class="number"> 143</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"> 144</span>                redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 145</span>            <span class="k2">}</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_DISPLAY_CLOSE<span class="k2">)</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="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="k3">|</span><span class="k3">|</span>
<span class="number"> 148</span>                      ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 149</span>
<span class="number"> 150</span>                bouncer_x <span class="k3">=</span> ev.mouse.x<span class="k2">;</span>
<span class="number"> 151</span>                bouncer_y <span class="k3">=</span> ev.mouse.y<span class="k2">;</span>
<span class="number"> 152</span>            <span class="k2">}</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_UP<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 153</span>                <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 154</span>            <span class="k2">}</span>
<span class="number"> 155</span>
<span class="number"> 156</span>            <span class="k1">if</span><span class="k2">(</span>redraw <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"> 157</span>                redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 158</span>
<span class="number"> 159</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"> 160</span>
<span class="number"> 161</span><span class="c">/// NEW</span>
<span class="number"> 162</span>                <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>new_Images.at<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>.image.data, <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="number"> 163</span>                <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>new_Images.at<span class="k2">(</span><span class="n">1</span><span class="k2">)</span>.image.data, <span class="n">32</span><span class="k3">+</span><span class="n">32</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 164</span>                <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>new_Images.at<span class="k2">(</span><span class="n">2</span><span class="k2">)</span>.image.data, <span class="n">64</span><span class="k3">+</span><span class="n">32</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 165</span><span class="c">///</span>
<span class="number"> 166</span>                <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bouncer, bouncer_x, bouncer_y, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 167</span>
<span class="number"> 168</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"> 169</span>            <span class="k2">}</span>
<span class="number"> 170</span>        <span class="k2">}</span>
<span class="number"> 171</span>
<span class="number"> 172</span><span class="c">/// NEW</span>
<span class="number"> 173</span>        <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>myBitmap<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 174</span><span class="c">///</span>
<span class="number"> 175</span>        <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 176</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"> 177</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"> 178</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"> 179</span>
<span class="number"> 180</span>        <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 181</span>    <span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (User9000)</author>
		<pubDate>Tue, 01 Jul 2014 10:46:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="source-code">std::vector</span> will invoke the copy constructor (in your case, it is a simple memberwise copy because you don&#39;t implement a custom copy constructor), and then delete the original, when adding elements (because the backing array needs resized). Your destructor deallocates the image that the default copy constructor just copied.</p><p>Perhaps the easiest way is to fix this is make a <span class="source-code">std::vector</span> of pointers to images. You&#39;ll have to manually deallocate the images, however, when necessary.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Erin Maus)</author>
		<pubDate>Tue, 01 Jul 2014 17:24:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Is there a way to use the al_clone_bitmap thing?</p><p>I want dinit to be self managed. What about a stateful funtor holding the vector of Bitmaps that shuts itself down at the end?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (User9000)</author>
		<pubDate>Tue, 01 Jul 2014 23:05:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, you can make a deep copy of an ALLEGRO_BITMAP by using al_clone_bitmap, but why do you want to make copies of your images? It takes time and cpu and memory. You&#39;d be better off using a vector of pointers to images that you add using new and destroy using delete.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 01 Jul 2014 23:44:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span> newedBitmap <span class="k3">=</span> <span class="k1">new</span> <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k2">;</span></span></p><p>fails with 2 errors:
</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"> 2</span>error: invalid use of incomplete type <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k2">{</span>aka <span class="k1">struct</span> <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k2">}</span>
<span class="number"> 3</span>error: forward declaration of <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k2">{</span>aka <span class="k1">struct</span> <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k2">}</span>
</div></div><p>

So I assume I can&#39;t actually new / delete them. :/</p><p>Also, what happens when you al_create_bitmap twice to the same pointer?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (User9000)</author>
		<pubDate>Thu, 03 Jul 2014 10:02:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You can&#39;t create an ALLEGRO_BITMAP with <span class="source-code"><span class="k1">new</span></span>. You have to use one of the allegro functions. ALLEGRO_BITMAP is also an opaque struct so you can&#39;t access its members.</p><p>You can however new your Image class.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 03 Jul 2014 10:05:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wait. Why do I need to access its members to new? And rather, why would encapsulating it make this any better and work?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (User9000)</author>
		<pubDate>Thu, 03 Jul 2014 11:19:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You don&#39;t need to access it&#39;s members. But the way that you make a struct opaque in C also means you can&#39;t access it&#39;s members or new/malloc it, since you don&#39;t know its size.</p><p>Encapsulating it makes it so people can&#39;t access the internals, and make it impossible for us to change internal things when we need to.</p><p>Also new wouldn&#39;t know how to &quot;create&quot; an <span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a></span>. an <span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a></span> is a C type, that requires certain members to be set in a specific way. C does not have constructors, or proper objects/classes for that matter, so you have to use functions that know how to create them. ie: <span class="source-code"><a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a></span>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Thu, 03 Jul 2014 11:27:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok.</p><p>Why doesn&#39;t allegro internally have a linked list that gets added to on al_create_bitmap and is used during allegro&#39;s deinit such that al_destroy_bitmap isn&#39;t required?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (User9000)</author>
		<pubDate>Thu, 03 Jul 2014 11:46:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>al_destroy_bitmap() would be needed anyway, because graphic memory is a precious resource shared by your entire system.<br />If your game has very few graphics (ex: a Sokoban with many maps but always the same tiles), you can probably load all graphics at beginning and keep them until the game stops.<br />But for example a game with different graphics for each level (Ice world, Lava World, Haunted house etc.) should rather keep only one level in memory. While the graphics of the player character can be kept for the whole duration of the program.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Thu, 03 Jul 2014 13:14:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Steam hardware survey says the average video card has 1Gb of ram.</p><p><a href="http://store.steampowered.com/hwsurvey/">http://store.steampowered.com/hwsurvey/</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Thu, 03 Jul 2014 13:20:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you use truetype font and &quot;leak&quot; the bitmap of the text every time you redraw the screen, you will run out, just by leaving the game idle.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Thu, 03 Jul 2014 23:06:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>My suggestion, as always, would be to use plain C and not C++ until you thoroughly understand <i>both</i> of them.  Allegro is a C library, so you should understand C to use it. If you just know C++, then you don&#39;t know enough C to use Allegro, as the essential design of the two languages is fundamentally different. </p><p>C++ vectors require you to have a deep understanding of C++ to be able to use them correctly in all cases. C++ is often like that, on the face it looks easy to use, but to do anything that isn&#39;t a very simple construct correctly you have to know many fine details of C++.</p><p>Below and attached is a pure C solution that doesn&#39;t use any vectors but that makes specific types for games, namely Sprite and SpriteList. It&#39;s a bit longer than the C++ code, but now you have full control of what is going on, as well as the beginnings of a generic sprite list system that will be useful for many types of games. Not to mention that since C doesn&#39;t do anything behind your back, so it&#39;s easy to see what is going on. </p><p>This Spritelist also keeps track of all bitmaps allocated indirectly, so just calling spritelist_done will clean up the allocated sprites for you.</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;stdio.h&gt; </span>
<span class="number">   2</span><span class="p">#include &lt;stdlib.h&gt; </span>
<span class="number">   3</span><span class="p">#include &lt;allegro5/allegro.h&gt; </span>
<span class="number">   4</span>
<span class="number">   5</span><span class="k1">const</span> <span class="k1">int</span> FPS <span class="k3">=</span> <span class="n">60</span><span class="k2">;</span>
<span class="number">   6</span><span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a> <span class="k3">=</span> <span class="n">640</span><span class="k2">;</span>
<span class="number">   7</span><span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a> <span class="k3">=</span> <span class="n">480</span><span class="k2">;</span>
<span class="number">   8</span><span class="k1">const</span> <span class="k1">int</span> BOUNCER_SIZE <span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number">   9</span>
<span class="number">  10</span><span class="k1">const</span> <span class="k1">int</span> SPRITELIST_START_SIZE <span class="k3">=</span> <span class="n">1000</span><span class="k2">;</span>
<span class="number">  11</span><span class="k1">const</span> <span class="k1">int</span> SPRITELIST_INCREMENT  <span class="k3">=</span>  <span class="n">100</span><span class="k2">;</span>
<span class="number">  12</span>
<span class="number">  13</span><span class="c">/* Enum for different statuses for return values of functions that can fail. */</span>
<span class="number">  14</span><span class="k1">enum</span> GameStatus <span class="k2">{</span>
<span class="number">  15</span>  GameStatusOK     <span class="k3">=</span> <span class="n">0</span>,
<span class="number">  16</span>  GameStatusNoMemory  <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span>,
<span class="number">  17</span>  GameStatusBadArgument  <span class="k3">=</span> <span class="k3">-</span><span class="n">2</span>,
<span class="number">  18</span>  GameStatusAllegroError<span class="k3">=</span> <span class="k3">-</span><span class="n">3</span>,
<span class="number">  19</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  20</span>
<span class="number">  21</span>
<span class="number">  22</span><span class="c">/* A set of x and Y coordinaes. */</span>
<span class="number">  23</span><span class="k1">struct</span> Point <span class="k2">{</span>
<span class="number">  24</span>  <span class="k1">float</span> x<span class="k2">;</span>
<span class="number">  25</span>  <span class="k1">float</span> y<span class="k2">;</span>
<span class="number">  26</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  27</span>
<span class="number">  28</span><span class="k1">struct</span> Point point_make<span class="k2">(</span><span class="k1">float</span> x, <span class="k1">float</span> y<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  29</span>  <span class="k1">struct</span> Point point<span class="k2">;</span>
<span class="number">  30</span>  point.x <span class="k3">=</span> x<span class="k2">;</span>
<span class="number">  31</span>  point.y <span class="k3">=</span> y<span class="k2">;</span>
<span class="number">  32</span>  <span class="k1">return</span> point<span class="k2">;</span>
<span class="number">  33</span><span class="k2">}</span>
<span class="number">  34</span>
<span class="number">  35</span><span class="k1">struct</span> Point point_add<span class="k2">(</span><span class="k1">struct</span> Point self, <span class="k1">struct</span> Point other<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  36</span>  <span class="k1">return</span> point_make<span class="k2">(</span>self.x <span class="k3">+</span> other.x, self.y <span class="k3">+</span> other.y<span class="k2">)</span><span class="k2">;</span>
<span class="number">  37</span><span class="k2">}</span>
<span class="number">  38</span>
<span class="number">  39</span><span class="c">/* A sprite keeps thack of the visualisation, position and speed of an in-game entity. */</span>
<span class="number">  40</span><span class="k1">struct</span> Sprite <span class="k2">{</span>
<span class="number">  41</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span> bitmap<span class="k2">;</span>
<span class="number">  42</span>  <span class="k1">struct</span> Point     position<span class="k2">;</span>
<span class="number">  43</span>  <span class="k1">struct</span> Point     speed<span class="k2">;</span>
<span class="number">  44</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  45</span>
<span class="number">  46</span><span class="k1">void</span> sprite_init<span class="k2">(</span><span class="k1">struct</span> Sprite <span class="k3">*</span> self, <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span> bitmap,
<span class="number">  47</span>                 <span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> vx, <span class="k1">int</span> vy<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  48</span>  self-&gt;bitmap   <span class="k3">=</span> bitmap<span class="k2">;</span>
<span class="number">  49</span>  self-&gt;position <span class="k3">=</span> point_make<span class="k2">(</span>x, y<span class="k2">)</span><span class="k2">;</span>
<span class="number">  50</span>  self-&gt;speed    <span class="k3">=</span> point_make<span class="k2">(</span>vx, vy<span class="k2">)</span><span class="k2">;</span>
<span class="number">  51</span><span class="k2">}</span>
<span class="number">  52</span>
<span class="number">  53</span><span class="k1">void</span> sprite_done<span class="k2">(</span><span class="k1">struct</span> Sprite <span class="k3">*</span> self<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  54</span>  <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>self-&gt;bitmap<span class="k2">)</span><span class="k2">;</span>
<span class="number">  55</span>  self-&gt;bitmap <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  56</span><span class="k2">}</span>
<span class="number">  57</span>
<span class="number">  58</span>
<span class="number">  59</span><span class="c">/* </span>
<span class="number">  60</span><span class="c">  We don't need a generic vector. We need a list of sprites to draw. </span>
<span class="number">  61</span><span class="c">*/</span>
<span class="number">  62</span><span class="k1">struct</span> SpriteList <span class="k2">{</span>
<span class="number">  63</span>  <span class="k1">struct</span> Sprite <span class="k3">*</span> sprites<span class="k2">;</span>
<span class="number">  64</span>  <span class="k1">int</span>      size<span class="k2">;</span>
<span class="number">  65</span>  <span class="k1">int</span>      in_use<span class="k2">;</span>
<span class="number">  66</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  67</span>
<span class="number">  68</span>
<span class="number">  69</span><span class="c">/* Initialize the sprite list. */</span>
<span class="number">  70</span><span class="k1">int</span> spritelist_init<span class="k2">(</span><span class="k1">struct</span> SpriteList <span class="k3">*</span> self<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  71</span>  self-&gt;in_use  <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  72</span>  self-&gt;size    <span class="k3">=</span> SPRITELIST_START_SIZE<span class="k2">;</span>
<span class="number">  73</span>  self-&gt;sprites <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_81.html" target="_blank">calloc</a><span class="k2">(</span>self-&gt;size, <span class="k1">sizeof</span><span class="k2">(</span><span class="k1">struct</span> Sprite<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  74</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>self-&gt;sprites<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  75</span>    self-&gt;size <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  76</span>    <span class="k1">return</span> GameStatusNoMemory<span class="k2">;</span>
<span class="number">  77</span>  <span class="k2">}</span>
<span class="number">  78</span>  <span class="k1">return</span> GameStatusOK<span class="k2">;</span>
<span class="number">  79</span><span class="k2">}</span>
<span class="number">  80</span>
<span class="number">  81</span>
<span class="number">  82</span>
<span class="number">  83</span><span class="c">/* Grows the sprite list */</span>
<span class="number">  84</span><span class="k1">int</span> spritelist_grow<span class="k2">(</span><span class="k1">struct</span> SpriteList <span class="k3">*</span> self, <span class="k1">int</span> grow_by<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  85</span>  <span class="k1">struct</span> Sprite <span class="k3">*</span> new_list<span class="k2">;</span>
<span class="number">  86</span>  <span class="k1">if</span> <span class="k2">(</span>grow_by <span class="k3">&lt;</span> <span class="n">1</span><span class="k2">)</span> <span class="k1">return</span> GameStatusBadArgument<span class="k2">;</span>
<span class="number">  87</span>  new_list <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_648.html" target="_blank">realloc</a><span class="k2">(</span>self-&gt;sprites, self-&gt;size <span class="k3">+</span> grow_by<span class="k2">)</span><span class="k2">;</span>
<span class="number">  88</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>new_list<span class="k2">)</span> <span class="k1">return</span> GameStatusNoMemory<span class="k2">;</span>
<span class="number">  89</span>  self-&gt;size   <span class="k3">+</span><span class="k3">=</span> grow_by<span class="k2">;</span>
<span class="number">  90</span>  self-&gt;sprites <span class="k3">=</span> new_list<span class="k2">;</span>
<span class="number">  91</span>  <span class="k1">return</span> GameStatusOK<span class="k2">;</span>
<span class="number">  92</span><span class="k2">}</span>
<span class="number">  93</span>
<span class="number">  94</span><span class="c">/* Gets a pointer to a sprite in the list. */</span>
<span class="number">  95</span><span class="k1">struct</span> Sprite <span class="k3">*</span> spritelist_get<span class="k2">(</span><span class="k1">struct</span> SpriteList <span class="k3">*</span> self, <span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  96</span>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number">  97</span>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">&gt;</span> self-&gt;size<span class="k2">)</span> <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number">  98</span>  <span class="k1">return</span> self-&gt;sprites<span class="k3">+</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">;</span>
<span class="number">  99</span><span class="k2">}</span>
<span class="number"> 100</span>
<span class="number"> 101</span><span class="c">/* Cleans up the sprite list. */</span>
<span class="number"> 102</span><span class="k1">void</span> spritelist_done<span class="k2">(</span><span class="k1">struct</span> SpriteList <span class="k3">*</span>self<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 103</span>  <span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">;</span>
<span class="number"> 104</span>  <span class="k1">for</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">=</span> <span class="n">0</span> <span class="k2">;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">&lt;</span> self-&gt;in_use<span class="k2">;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 105</span>    <span class="k1">struct</span> Sprite <span class="k3">*</span> sprite <span class="k3">=</span> spritelist_get<span class="k2">(</span>self, <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 106</span>    sprite_done<span class="k2">(</span>sprite<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 107</span>  <span class="k2">}</span>
<span class="number"> 108</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>self-&gt;sprites<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 109</span>  self-&gt;in_use <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 110</span>  self-&gt;size <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 111</span><span class="k2">}</span>
<span class="number"> 112</span>
<span class="number"> 113</span>
<span class="number"> 114</span><span class="c">/* Adds a sprite to the list. returns the index at which it is , or a negative value if it failed to ad the item to the list.  */</span>
<span class="number"> 115</span><span class="k1">int</span> spritelist_add_sprite<span class="k2">(</span><span class="k1">struct</span> SpriteList <span class="k3">*</span> self, <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span> bitmap, 
<span class="number"> 116</span>                         <span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> vx, <span class="k1">int</span> vy<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 117</span>  <span class="k1">int</span> result<span class="k2">;</span>
<span class="number"> 118</span>  <span class="k1">struct</span> Sprite <span class="k3">*</span> sprite<span class="k2">;</span>
<span class="number"> 119</span>  <span class="k1">if</span><span class="k2">(</span>self-&gt;in_use <span class="k3">&gt;</span><span class="k3">=</span> self-&gt;size<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 120</span>    <span class="k1">int</span> res <span class="k3">=</span> spritelist_grow<span class="k2">(</span>self, SPRITELIST_INCREMENT<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 121</span>    <span class="k1">if</span> <span class="k2">(</span>res <span class="k3">!</span><span class="k3">=</span> GameStatusOK<span class="k2">)</span> <span class="k1">return</span> res<span class="k2">;</span>
<span class="number"> 122</span>  <span class="k2">}</span>
<span class="number"> 123</span>  sprite <span class="k3">=</span> spritelist_get<span class="k2">(</span>self, self-&gt;in_use<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 124</span>  sprite_init<span class="k2">(</span>sprite, bitmap, x, y, vx, vy<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 125</span>  result <span class="k3">=</span> self-&gt;in_use<span class="k2">;</span>
<span class="number"> 126</span>  self-&gt;in_use<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 127</span>  <span class="k1">return</span> result<span class="k2">;</span>
<span class="number"> 128</span><span class="k2">}</span>
<span class="number"> 129</span>
<span class="number"> 130</span><span class="c">/* Adds a sprite to the list and also allocate a bitmap for it with the given sizes. */</span>
<span class="number"> 131</span><span class="k1">int</span> spritelist_add_sprite_with_size<span class="k2">(</span><span class="k1">struct</span> SpriteList <span class="k3">*</span> self, <span class="k1">int</span> bitmap_w, <span class="k1">int</span> bitmap_h, <span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> vx, <span class="k1">int</span> vy<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 132</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span> bitmap<span class="k2">;</span>
<span class="number"> 133</span>  bitmap <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span>bitmap_w, bitmap_h<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 134</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>bitmap<span class="k2">)</span> <span class="k1">return</span> GameStatusAllegroError<span class="k2">;</span>
<span class="number"> 135</span>  <span class="k1">return</span> spritelist_add_sprite<span class="k2">(</span>self, bitmap, x, y, vx, vy<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 136</span><span class="k2">}</span>
<span class="number"> 137</span>
<span class="number"> 138</span><span class="c">/* Adds a sprite to the list and also allocate a bitmap for it with the given size and color. */</span>
<span class="number"> 139</span><span class="k1">int</span> spritelist_add_sprite_with_size_and_color<span class="k2">(</span><span class="k1">struct</span> SpriteList <span class="k3">*</span> self, <span class="k1">int</span> bitmap_w, <span class="k1">int</span> bitmap_h, <span class="k1">int</span> r, <span class="k1">int</span> g, <span class="k1">int</span> b, <span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> vx, <span class="k1">int</span> vy<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 140</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span> bitmap<span class="k2">;</span>
<span class="number"> 141</span>  bitmap <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span>bitmap_w, bitmap_h<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 142</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>bitmap<span class="k2">)</span> <span class="k1">return</span> GameStatusAllegroError<span class="k2">;</span>
<span class="number"> 143</span>  <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>bitmap<span class="k2">)</span><span class="k2">;</span> 
<span class="number"> 144</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>r, g, b<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> 
<span class="number"> 145</span>  <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> 
<span class="number"> 146</span>  <span class="k1">return</span> spritelist_add_sprite<span class="k2">(</span>self, bitmap, x, y, vx, vy<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 147</span><span class="k2">}</span>
<span class="number"> 148</span>
<span class="number"> 149</span><span class="c">/* Draws all sprites in the list. */</span>
<span class="number"> 150</span><span class="k1">void</span> spritelist_draw<span class="k2">(</span><span class="k1">struct</span> SpriteList <span class="k3">*</span> self<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 151</span>  <span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">;</span>
<span class="number"> 152</span>  <span class="k1">for</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">&lt;</span> self-&gt;in_use<span class="k2">;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 153</span>    <span class="k1">struct</span> Sprite <span class="k3">*</span> sprite <span class="k3">=</span> spritelist_get<span class="k2">(</span>self, <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 154</span>    <span class="k1">if</span> <span class="k2">(</span>sprite <span class="k3">&amp;</span><span class="k3">&amp;</span> sprite-&gt;bitmap<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 155</span>      <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>sprite-&gt;bitmap, sprite-&gt;position.x, sprite-&gt;position.y, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 156</span>    <span class="k2">}</span>
<span class="number"> 157</span>  <span class="k2">}</span>
<span class="number"> 158</span><span class="k2">}</span>
<span class="number"> 159</span>
<span class="number"> 160</span><span class="c">/* Updates the position of all sprites in the list based on their speed. */</span>
<span class="number"> 161</span><span class="k1">void</span> spritelist_update<span class="k2">(</span><span class="k1">struct</span> SpriteList <span class="k3">*</span> self<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 162</span>  <span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">;</span>
<span class="number"> 163</span>  <span class="k1">for</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">&lt;</span> self-&gt;in_use<span class="k2">;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 164</span>    <span class="k1">struct</span> Sprite <span class="k3">*</span> sprite <span class="k3">=</span> spritelist_get<span class="k2">(</span>self, <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 165</span>    <span class="k1">if</span> <span class="k2">(</span>sprite<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 166</span>      sprite-&gt;position <span class="k3">=</span> point_add<span class="k2">(</span>sprite-&gt;position, sprite-&gt;speed<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 167</span>    <span class="k2">}</span>
<span class="number"> 168</span>  <span class="k2">}</span>
<span class="number"> 169</span><span class="k2">}</span>
<span class="number"> 170</span>
<span class="number"> 171</span>
<span class="number"> 172</span>
<span class="number"> 173</span>
<span class="number"> 174</span><span class="c">/* A struct to kep all the game state in. */</span>
<span class="number"> 175</span><span class="k1">struct</span> GameState <span class="k2">{</span>
<span class="number"> 176</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a>     <span class="k3">*</span> display<span class="k2">;</span> 
<span class="number"> 177</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="k2">;</span> 
<span class="number"> 178</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"> 179</span>  <span class="k1">struct</span> SpriteList     spritelist<span class="k2">;</span>
<span class="number"> 180</span>  <span class="k1">int</span>                   busy<span class="k2">;</span>
<span class="number"> 181</span>  <span class="k1">int</span>                   redraw<span class="k2">;</span>
<span class="number"> 182</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 183</span>
<span class="number"> 184</span>
<span class="number"> 185</span>
<span class="number"> 186</span><span class="c">/* Initializes the game state. */</span>
<span class="number"> 187</span><span class="k1">int</span> gamestate_init<span class="k2">(</span><span class="k1">struct</span> GameState <span class="k3">*</span> self, <span class="k1">int</span> screen_w, <span class="k1">int</span> screen_h<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 188</span>  <span class="k1">int</span> res<span class="k2">;</span>
<span class="number"> 189</span>
<span class="number"> 190</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"> 191</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"> 192</span>    <span class="k1">return</span> GameStatusAllegroError<span class="k2">;</span>
<span class="number"> 193</span>  <span class="k2">}</span>
<span class="number"> 194</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</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="k2">{</span>
<span class="number"> 195</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 the mouse!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 196</span>     <span class="k1">return</span> GameStatusAllegroError<span class="k2">;</span>
<span class="number"> 197</span>  <span class="k2">}</span>
<span class="number"> 198</span>  self-&gt;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> FPS<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>self-&gt;timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 200</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 timer!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 201</span>    <span class="k1">return</span> GameStatusAllegroError<span class="k2">;</span>
<span class="number"> 202</span>  <span class="k2">}</span>
<span class="number"> 203</span>  
<span class="number"> 204</span>  self-&gt;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>screen_w, screen_h<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 205</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>self-&gt;display<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 206</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"> 207</span>     <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>self-&gt;timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 208</span>     <span class="k1">return</span> GameStatusAllegroError<span class="k2">;</span>
<span class="number"> 209</span>  <span class="k2">}</span>
<span class="number"> 210</span>
<span class="number"> 211</span>  self-&gt;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"> 212</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>self-&gt;event_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 213</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 event_queue!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 214</span>    <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>self-&gt;display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 215</span>    <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>self-&gt;timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 216</span>    <span class="k1">return</span> GameStatusAllegroError<span class="k2">;</span>
<span class="number"> 217</span>  <span class="k2">}</span>
<span class="number"> 218</span>
<span class="number"> 219</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>self-&gt;event_queue,
<span class="number"> 220</span>                           <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>self-&gt;display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 221</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>self-&gt;event_queue,
<span class="number"> 222</span>                           <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>self-&gt;timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 223</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>self-&gt;event_queue,
<span class="number"> 224</span>                           <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"> 225</span>
<span class="number"> 226</span>
<span class="number"> 227</span>  res <span class="k3">=</span> spritelist_init<span class="k2">(</span><span class="k3">&amp;</span>self-&gt;spritelist<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 228</span>  <span class="k1">if</span><span class="k2">(</span>res <span class="k3">!</span><span class="k3">=</span> GameStatusOK<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 229</span>    <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>self-&gt;timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 230</span>    <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>self-&gt;display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 231</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>self-&gt;event_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 232</span>    <span class="k1">return</span> GameStatusAllegroError<span class="k2">;</span>
<span class="number"> 233</span>    <span class="k1">return</span> res<span class="k2">;</span>
<span class="number"> 234</span>  <span class="k2">}</span>
<span class="number"> 235</span>  
<span class="number"> 236</span>  <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>self-&gt;timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 237</span>  
<span class="number"> 238</span>  self-&gt;busy   <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 239</span>  self-&gt;redraw <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 240</span>
<span class="number"> 241</span>  <span class="k1">return</span> GameStatusOK<span class="k2">;</span>
<span class="number"> 242</span><span class="k2">}</span>
<span class="number"> 243</span>
<span class="number"> 244</span>
<span class="number"> 245</span><span class="c">/* Cleans up the game state. */</span>
<span class="number"> 246</span><span class="k1">void</span> gamestate_done<span class="k2">(</span><span class="k1">struct</span> GameState <span class="k3">*</span> self<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 247</span>  <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>self-&gt;timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 248</span>  <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>self-&gt;display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 249</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>self-&gt;event_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 250</span>  spritelist_done<span class="k2">(</span><span class="k3">&amp;</span>self-&gt;spritelist<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 251</span>  self-&gt;timer   <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 252</span>  self-&gt;display <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 253</span>  self-&gt;event_queue <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 254</span>  self-&gt;busy    <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 255</span>  self-&gt;redraw  <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 256</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 257</span>
<span class="number"> 258</span>
<span class="number"> 259</span>
<span class="number"> 260</span><span class="c">/* Handles a single loop when running the game state. Here all the real action happens. */</span>
<span class="number"> 261</span><span class="k1">void</span> gamestate_runloop<span class="k2">(</span><span class="k1">struct</span> GameState <span class="k3">*</span> self<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 262</span>   <span class="k1">struct</span> Sprite <span class="k3">*</span> bouncer<span class="k2">;</span>
<span class="number"> 263</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"> 264</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>self-&gt;event_queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 265</span>   <span class="k1">switch</span><span class="k2">(</span>ev.type<span class="k2">)</span> <span class="k2">{</span> 
<span class="number"> 266</span>     <span class="k1">case</span> ALLEGRO_EVENT_TIMER:
<span class="number"> 267</span>       self-&gt;redraw <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>  <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 268</span>
<span class="number"> 269</span>     <span class="k1">case</span> ALLEGRO_EVENT_MOUSE_BUTTON_UP:
<span class="number"> 270</span>     <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_CLOSE:  
<span class="number"> 271</span>       self-&gt;busy <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="k1">break</span><span class="k2">;</span> 
<span class="number"> 272</span>
<span class="number"> 273</span>     <span class="k1">case</span> ALLEGRO_EVENT_MOUSE_AXES:
<span class="number"> 274</span>     <span class="k1">case</span> ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY:  
<span class="number"> 275</span>       bouncer <span class="k3">=</span> spritelist_get<span class="k2">(</span><span class="k3">&amp;</span>self-&gt;spritelist, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 276</span>       bouncer-&gt;position.x <span class="k3">=</span> ev.mouse.x<span class="k2">;</span> 
<span class="number"> 277</span>       bouncer-&gt;position.y <span class="k3">=</span> ev.mouse.y<span class="k2">;</span> 
<span class="number"> 278</span>       <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 279</span>     default: 
<span class="number"> 280</span>     <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 281</span>   <span class="k2">}</span>
<span class="number"> 282</span>  <span class="c">/* Update and redraw if needed. */</span>
<span class="number"> 283</span>  <span class="k1">if</span><span class="k2">(</span>self-&gt;redraw <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>self-&gt;event_queue<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 284</span>    spritelist_update<span class="k2">(</span><span class="k3">&amp;</span>self-&gt;spritelist<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 285</span>    self-&gt;redraw <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 286</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"> 287</span>    spritelist_draw<span class="k2">(</span><span class="k3">&amp;</span>self-&gt;spritelist<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 288</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"> 289</span>  <span class="k2">}</span>
<span class="number"> 290</span><span class="k2">}</span>
<span class="number"> 291</span>
<span class="number"> 292</span>
<span class="number"> 293</span><span class="c">/* Runs the game state by looping it using gamestate_runloop */</span>
<span class="number"> 294</span><span class="k1">void</span> gamestate_run<span class="k2">(</span><span class="k1">struct</span> GameState <span class="k3">*</span> self<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 295</span>  <span class="k1">while</span><span class="k2">(</span>self-&gt;busy<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 296</span>    gamestate_runloop<span class="k2">(</span>self<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 297</span>  <span class="k2">}</span>
<span class="number"> 298</span><span class="k2">}</span>
<span class="number"> 299</span>
<span class="number"> 300</span>
<span class="number"> 301</span><span class="c">/* Adds a few sprites to the game state. */</span>
<span class="number"> 302</span><span class="k1">int</span> gamestate_addsprites<span class="k2">(</span><span class="k1">struct</span> GameState <span class="k3">*</span> gamestate<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 303</span>  <span class="k1">int</span> res<span class="k2">;</span>
<span class="number"> 304</span>  <span class="k1">float</span> bouncer_x <span class="k3">=</span> <a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a> <span class="k3">/</span> <span class="n">2</span>.<span class="n">0</span> <span class="k3">-</span> BOUNCER_SIZE <span class="k3">/</span> <span class="n">2</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 305</span>  <span class="k1">float</span> bouncer_y <span class="k3">=</span> <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a> <span class="k3">/</span> <span class="n">2</span>.<span class="n">0</span> <span class="k3">-</span> BOUNCER_SIZE <span class="k3">/</span> <span class="n">2</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 306</span>
<span class="number"> 307</span>  res <span class="k3">=</span> spritelist_add_sprite_with_size_and_color<span class="k2">(</span>
<span class="number"> 308</span>          <span class="k3">&amp;</span>gamestate-&gt;spritelist, <span class="n">32</span>, <span class="n">32</span>, <span class="n">255</span>, <span class="n">0</span>, <span class="n">255</span>, 
<span class="number"> 309</span>          bouncer_x, bouncer_y, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 310</span>  <span class="k1">if</span> <span class="k2">(</span>res <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k1">return</span> res<span class="k2">;</span>
<span class="number"> 311</span>  res <span class="k3">=</span> spritelist_add_sprite_with_size_and_color<span class="k2">(</span>
<span class="number"> 312</span>          <span class="k3">&amp;</span>gamestate-&gt;spritelist, <span class="n">32</span>, <span class="n">64</span>, <span class="n">255</span>, <span class="n">255</span>, 
<span class="number"> 313</span>          <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">1</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 314</span>  <span class="k1">if</span> <span class="k2">(</span>res <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k1">return</span> res<span class="k2">;</span>
<span class="number"> 315</span>  <span class="c">/* Etc, add more sprites here if needed.... */</span>
<span class="number"> 316</span>  <span class="k1">return</span> GameStatusOK<span class="k2">;</span>
<span class="number"> 317</span><span class="k2">}</span>
<span class="number"> 318</span>
<span class="number"> 319</span><span class="c">/* The main function is now much simplified. */</span>
<span class="number"> 320</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"> 321</span>  <span class="k1">struct</span> GameState gamestate<span class="k2">;</span>
<span class="number"> 322</span>
<span class="number"> 323</span>  <span class="k1">if</span> <span class="k2">(</span>gamestate_init<span class="k2">(</span><span class="k3">&amp;</span>gamestate, <a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> GameStatusOK<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 324</span>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 325</span>  <span class="k2">}</span>
<span class="number"> 326</span>  <span class="k1">if</span> <span class="k2">(</span>gamestate_addsprites<span class="k2">(</span><span class="k3">&amp;</span>gamestate<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> GameStatusOK<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 327</span>    gamestate_done<span class="k2">(</span><span class="k3">&amp;</span>gamestate<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 328</span>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 329</span>  <span class="k2">}</span>
<span class="number"> 330</span>  gamestate_run<span class="k2">(</span><span class="k3">&amp;</span>gamestate<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 331</span>  gamestate_done<span class="k2">(</span><span class="k3">&amp;</span>gamestate<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 332</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 333</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sat, 05 Jul 2014 13:44:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Got it working with C++ now. It has to be C++ because I do a lot with generic programming. Thanks! </p><p>PS. The C code in interesting and might be very useful for a different project. Is that code under the Allegro License?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (User9000)</author>
		<pubDate>Wed, 09 Jul 2014 10:18:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, personally I don&#39;t need generics or C++ for anything, but if you got it to work then that&#39;s fine. </p><p>As for this C code, it&#39;s only a snippet, so feel free to use, modify, sublicense, etc. it in any way you like, under the Allegro license or any other open source license you might think of. </p><p>However, if you want a full tile and sprite engine look at my project here: <br /><a href="https://github.com/beoran/eruta">https://github.com/beoran/eruta</a></p><p>That is under the Sleepycat license, which is a copyleft, but simpler than GPL. You can do what you want but if you redistribute a modified binary version, you also have to redistribute the modified sources of the engine.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Wed, 09 Jul 2014 10:34:44 +0000</pubDate>
	</item>
</rss>
