<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Optimizing Isometric Tiles</title>
		<link>http://www.allegro.cc/forums/view/609898</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 01 Apr 2012 12:59:30 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I just yesterday decided to switch from using Allegro 4 to 5.<br />This game I&#39;m working on works with 5 now, but just like with 4, I am having terrible performance problems while trying to draw the isometric tiles. Kinda defeats the purpose of me switching... I was hoping the hardware acceleration would improve it.</p><p>What I&#39;m trying to do is draw a fairly large number of tiles... probably comparable to as many as you&#39;d see in your average session of Roller Coaster Tycoon.</p><p>I have tile culling in place, but it&#39;s still very slow when the map fills the screen. When the camera is on the edges, it&#39;s better.</p><p>Right now the game is VERY simple. More of a skeleton. So maybe I made some kind of error somewhere.</p><p>My INIT function:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">int</span> init<span class="k2">(</span><span class="k2">)</span> <span class="c">//start up necessary allegro tools and other objects</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</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="c">//allegro itself</span>
<span class="number">  4</span>
<span class="number">  5</span>    <a href="http://www.allegro.cc/manual/al_set_new_display_flags"><span class="a">al_set_new_display_flags</span></a><span class="k2">(</span>ALLEGRO_FULLSCREEN<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>    <span class="k1">int</span> dsk_w <span class="k3">=</span> <span class="n">1360</span>, dsk_h <span class="k3">=</span><span class="n">768</span><span class="k2">;</span> <span class="c">//my monitor's native res</span>
<span class="number">  8</span>    <span class="c">//get_desktop_resolution(&amp;dsk_w,&amp;dsk_h); //something left over from AL4</span>
<span class="number">  9</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>dsk_w, dsk_h<span class="k2">)</span><span class="k2">;</span> <span class="c">//create display</span>
<span class="number"> 10</span>
<span class="number"> 11</span>
<span class="number"> 12</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="c">//bitmaps, pngs, jpegs etc</span>
<span class="number"> 13</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="c">//for fonts, just bitmap ones</span>
<span class="number"> 14</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="c">//rectangles, circles, triangles etc</span>
<span class="number"> 15</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="c">// true type fonts (scalable vector fonts)</span>
<span class="number"> 16</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="c">//the mouse</span>
<span class="number"> 17</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="c">//the keyboard</span>
<span class="number"> 18</span>    <a href="http://www.allegro.cc/manual/al_install_audio"><span class="a">al_install_audio</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//for audio, WAVs,</span>
<span class="number"> 19</span>    <a href="http://www.allegro.cc/manual/al_init_acodec_addon"><span class="a">al_init_acodec_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//audio codecs like OGG and FLAC</span>
<span class="number"> 20</span>
<span class="number"> 21</span>
<span class="number"> 22</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_739.html" target="_blank">srand</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span>    font_default <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">"font/calibri.ttf"</span>, <span class="n">14</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>
<span class="number"> 26</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 27</span><span class="k2">}</span>
</div></div><p>

This is the main part of the screen refreshing function, very basic:
</p><div class="source-code snippet"><div class="inner"><pre>    <a href="http://www.allegro.cc/manual/al_wait_for_vsync"><span class="a">al_wait_for_vsync</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</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>

    <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>
</pre></div></div><p>

This object&#39;s draw event is called once each frame. It draw the world tiles:<br />Note that BMP[&quot;filename&quot;] is the resource map that retrieves a pointer to a loaded bitmap, and loads it if it hasn&#39;t already been loaded. It&#39;s not in use in the loop.
</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>Session::Session<span class="k2">(</span><span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    Grid_Tiles <span class="k3">=</span> Grid<span class="k3">&lt;</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span><span class="n">128</span>,<span class="n">128</span>,NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>    camX<span class="k3">=</span><span class="n">500</span><span class="k2">;</span>
<span class="number">  6</span>    camY<span class="k3">=</span><span class="k3">-</span><span class="n">200</span><span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span>    <span class="k1">int</span> seed<span class="k3">=</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span> tiletest1 <span class="k3">=</span> BMP<span class="k2">[</span><span class="s">"tiletest1.png"</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 11</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span> tiletest2 <span class="k3">=</span> BMP<span class="k2">[</span><span class="s">"tiletest2.png"</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span>
<span class="number"> 14</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> a<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> a<span class="k3">&lt;</span>Grid_Tiles.w<span class="k2">;</span> a<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 15</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> b<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> b<span class="k3">&lt;</span>Grid_Tiles.h<span class="k2">;</span> b<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 16</span>    <span class="k2">{</span>
<span class="number"> 17</span>        <span class="k1">if</span> <span class="k2">(</span>perlin<span class="k2">(</span>a, b, <span class="n">3</span>, seed<span class="k2">)</span><span class="k3">&gt;</span><span class="n">0</span>.<span class="n">4</span><span class="k2">)</span>
<span class="number"> 18</span>        <span class="k2">{</span>
<span class="number"> 19</span>            Grid_Tiles.set<span class="k2">(</span>a,b,tiletest1<span class="k2">)</span><span class="k2">;</span> 
<span class="number"> 20</span>        <span class="k2">}</span>
<span class="number"> 21</span>        <span class="k1">else</span>
<span class="number"> 22</span>            Grid_Tiles.set<span class="k2">(</span>a,b,tiletest2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    <span class="k2">}</span>
<span class="number"> 24</span>
<span class="number"> 25</span><span class="k2">}</span>
<span class="number"> 26</span>
<span class="number"> 27</span><span class="k1">void</span> Session::draw<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 28</span><span class="k2">{</span>
<span class="number"> 29</span>
<span class="number"> 30</span>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>ALLEGRO_KEY_UP<span class="k2">]</span><span class="k2">)</span> camY-<span class="k3">=</span><span class="n">3</span><span class="k2">;</span>
<span class="number"> 31</span>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>ALLEGRO_KEY_DOWN<span class="k2">]</span><span class="k2">)</span> camY<span class="k3">+</span><span class="k3">=</span><span class="n">3</span><span class="k2">;</span>
<span class="number"> 32</span>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>ALLEGRO_KEY_RIGHT<span class="k2">]</span><span class="k2">)</span> camX<span class="k3">+</span><span class="k3">=</span><span class="n">6</span><span class="k2">;</span>
<span class="number"> 33</span>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>ALLEGRO_KEY_LEFT<span class="k2">]</span><span class="k2">)</span> camX-<span class="k3">=</span><span class="n">6</span><span class="k2">;</span>
<span class="number"> 34</span>
<span class="number"> 35</span>    selectX<span class="k3">=</span><span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 36</span>    selectY<span class="k3">=</span><span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 37</span>
<span class="number"> 38</span>    <span class="k1">int</span> drawX, drawY<span class="k2">;</span>
<span class="number"> 39</span>
<span class="number"> 40</span>    <span class="k1">int</span> viewX1<span class="k3">=</span>std::max<span class="k2">(</span><span class="n">0</span>,<span class="k2">(</span><span class="k2">(</span><span class="k2">(</span>camX<span class="k2">)</span><span class="k3">/</span><span class="k2">(</span>TILE_W-1<span class="k2">)</span><span class="k2">)</span><span class="k3">+</span><span class="k2">(</span>camY<span class="k3">/</span>TILE_H<span class="k2">)</span><span class="k2">)</span><span class="k3">-</span><span class="n">3</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>    <span class="k1">int</span> viewX2<span class="k3">=</span>std::min<span class="k2">(</span>Grid_Tiles.w,<span class="k2">(</span><span class="k2">(</span><span class="k2">(</span><span class="k2">(</span>camX<span class="k2">)</span><span class="k3">+</span><a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a><span class="k2">)</span><span class="k3">/</span><span class="k2">(</span>TILE_W-1<span class="k2">)</span><span class="k2">)</span><span class="k3">+</span><span class="k2">(</span><span class="k2">(</span>camY<span class="k2">)</span><span class="k3">+</span><a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k3">/</span>TILE_H<span class="k2">)</span><span class="k3">+</span><span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>    <span class="k1">int</span> viewY1<span class="k3">=</span>std::min<span class="k2">(</span>Grid_Tiles.h-1,<span class="k2">(</span><span class="k2">(</span><span class="k2">(</span><span class="k2">(</span>camX<span class="k2">)</span><span class="k3">+</span><a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a><span class="k2">)</span><span class="k3">/</span><span class="k2">(</span>TILE_W-1<span class="k2">)</span><span class="k2">)</span><span class="k3">-</span><span class="k2">(</span>camY<span class="k2">)</span><span class="k3">/</span>TILE_H<span class="k2">)</span><span class="k3">+</span><span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 43</span>    <span class="k1">int</span> viewY2<span class="k3">=</span>std::max<span class="k2">(</span><span class="n">0</span>,<span class="k2">(</span><span class="k2">(</span><span class="k2">(</span>camX<span class="k2">)</span><span class="k3">/</span><span class="k2">(</span>TILE_W<span class="k2">)</span><span class="k2">)</span><span class="k3">-</span><span class="k2">(</span><span class="k2">(</span><span class="k2">(</span>camY<span class="k2">)</span><span class="k3">+</span><a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k3">/</span>TILE_H<span class="k2">)</span><span class="k2">)</span><span class="k3">-</span><span class="n">3</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span>
<span class="number"> 45</span>    <span class="c">//ALLEGRO_BITMAP* selectorback = BMP["tileselector_back.png"];</span>
<span class="number"> 46</span>    <span class="c">//ALLEGRO_BITMAP* selectorfront = BMP["tileselector_front.png"];</span>
<span class="number"> 47</span>
<span class="number"> 48</span>
<span class="number"> 49</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> a<span class="k3">=</span>viewX1<span class="k2">;</span> a<span class="k3">&lt;</span>viewX2<span class="k2">;</span> a<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 50</span>    <span class="k2">{</span>
<span class="number"> 51</span>        <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> b<span class="k3">=</span>viewY1<span class="k2">;</span> b&gt;<span class="k3">=</span>viewY2<span class="k2">;</span> b--<span class="k2">)</span>
<span class="number"> 52</span>        <span class="k2">{</span>
<span class="number"> 53</span>            drawX<span class="k3">=</span><span class="k2">(</span>b<span class="k3">*</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>TILE_W<span class="k3">/</span><span class="n">2</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k3">+</span><span class="k2">(</span>a<span class="k3">*</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>TILE_W<span class="k3">/</span><span class="n">2</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k3">-</span>camX<span class="k2">;</span>
<span class="number"> 54</span>            <span class="k1">if</span> <span class="k2">(</span>drawX<span class="k3">&lt;</span><span class="k3">-</span>TILE_W <span class="k3">|</span><span class="k3">|</span> drawX&gt;SCREEN_W<span class="k2">)</span>
<span class="number"> 55</span>            <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 56</span>
<span class="number"> 57</span>            drawY<span class="k3">=</span><span class="k2">(</span>a<span class="k3">*</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>TILE_H<span class="k3">/</span><span class="n">2</span><span class="k2">)</span><span class="k2">)</span><span class="k3">-</span><span class="k2">(</span>b<span class="k3">*</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>TILE_H<span class="k3">/</span><span class="n">2</span><span class="k2">)</span><span class="k2">)</span><span class="k3">-</span>camY<span class="k2">;</span>
<span class="number"> 58</span>            <span class="k1">if</span><span class="k2">(</span>drawY<span class="k3">&lt;</span><span class="k3">-</span><span class="n">200</span> <span class="k3">|</span><span class="k3">|</span> drawY&gt;SCREEN_H<span class="k2">)</span>
<span class="number"> 59</span>            <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 60</span>
<span class="number"> 61</span>
<span class="number"> 62</span>
<span class="number"> 63</span>            <span class="c">//TODO: Set selectX and selectY based on where the mouse is pointing</span>
<span class="number"> 64</span>
<span class="number"> 65</span>            <span class="c">//if (selectX==a &amp;&amp; selectY==b)</span>
<span class="number"> 66</span>            <span class="c">//    al_draw_bitmap(selectorback, drawX, drawY, 0);</span>
<span class="number"> 67</span>
<span class="number"> 68</span>            <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>Grid_Tiles.get<span class="k2">(</span>a,b<span class="k2">)</span>, drawX, drawY, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 69</span>
<span class="number"> 70</span>            <span class="k1">if</span> <span class="k2">(</span>Grid_Actors-&gt;get<span class="k2">(</span>a,b<span class="k2">)</span><span class="k3">!</span><span class="k3">=</span>NULL<span class="k2">)</span>
<span class="number"> 71</span>            <span class="k2">{</span>
<span class="number"> 72</span>                  Grid_Actors-&gt;get<span class="k2">(</span>a,b<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>draw<span class="k2">(</span>drawX, drawY<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 73</span>            <span class="k2">}</span>
<span class="number"> 74</span>
<span class="number"> 75</span>            <span class="c">/*if (selectX==a &amp;&amp; selectY==b)</span>
<span class="number"> 76</span><span class="c">            {</span>
<span class="number"> 77</span><span class="c">                al_draw_bitmap(selectorfront, drawX, drawY, 0);</span>
<span class="number"> 78</span><span class="c">                al_draw_textf(font_default,al_map_rgb(255,150,30),drawX-20,drawY-10,0, "(%d,%d)",a,b);</span>
<span class="number"> 79</span><span class="c">            }*/</span>
<span class="number"> 80</span>        <span class="k2">}</span>
<span class="number"> 81</span>    <span class="k2">}</span>
<span class="number"> 82</span>
<span class="number"> 83</span><span class="k2">}</span>
</div></div><p>


Here is the Bitmap resource handler. Maybe I&#39;m loading them incorrectly?
</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 "bitmaps.h"</span>
<span class="number">  2</span><span class="p">#include &lt;allegro5/allegro_native_dialog.h&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;allegro5/allegro_image.h&gt;</span>
<span class="number">  4</span>
<span class="number">  5</span>
<span class="number">  6</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span> BitmapHandler::operator<span class="k2">[</span><span class="k2">]</span><span class="k2">(</span>std::string filename<span class="k2">)</span>
<span class="number">  7</span><span class="k2">{</span>
<span class="number">  8</span>
<span class="number">  9</span>        <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span> result <span class="k3">=</span> my_map<span class="k2">[</span>filename<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>        <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>result<span class="k2">)</span> <span class="c">//file hasn't been loaded yet</span>
<span class="number"> 12</span>        <span class="k2">{</span>
<span class="number"> 13</span>            result<span class="k3">=</span>load<span class="k2">(</span>filename<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>        <span class="k2">}</span>
<span class="number"> 15</span>        <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>result<span class="k2">)</span> <span class="c">//load error</span>
<span class="number"> 16</span>        <span class="k2">{</span>
<span class="number"> 17</span>            my_map.erase<span class="k2">(</span>filename<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>        <span class="k2">}</span>
<span class="number"> 19</span>
<span class="number"> 20</span>        <span class="k1">return</span> result<span class="k2">;</span>
<span class="number"> 21</span><span class="k2">}</span>
<span class="number"> 22</span>
<span class="number"> 23</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span> BitmapHandler::load<span class="k2">(</span>std::string filename<span class="k2">)</span>
<span class="number"> 24</span><span class="k2">{</span>
<span class="number"> 25</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span> result <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span><span class="k2">(</span><span class="k1">char</span><span class="k3">*</span><span class="k2">)</span><span class="k2">(</span><span class="s">"gfx/"</span><span class="k3">+</span>filename<span class="k2">)</span>.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>
<span class="number"> 27</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>result<span class="k2">)</span>
<span class="number"> 28</span>        <a href="http://www.allegro.cc/manual/al_show_native_message_box"><span class="a">al_show_native_message_box</span></a><span class="k2">(</span>NULL,<span class="s">"ERROR"</span>, <span class="s">"Image Could Not Load"</span>,<span class="k2">(</span><span class="k1">char</span><span class="k3">*</span><span class="k2">)</span>filename.c_str<span class="k2">(</span><span class="k2">)</span>,NULL, ALLEGRO_MESSAGEBOX_ERROR<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>    <span class="k1">else</span>
<span class="number"> 30</span>        my_map<span class="k2">[</span>filename<span class="k2">]</span> <span class="k3">=</span> result<span class="k2">;</span>
<span class="number"> 31</span>
<span class="number"> 32</span>    <span class="k1">return</span> result<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="c">//THIS IS NOT USED ANYWHERE YET:</span>
<span class="number"> 36</span><span class="k1">void</span> BitmapHandler::unload<span class="k2">(</span>std::string filename<span class="k2">)</span>
<span class="number"> 37</span><span class="k2">{</span>
<span class="number"> 38</span>
<span class="number"> 39</span>    <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>my_map<span class="k2">[</span>filename<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span>    my_map.erase<span class="k2">(</span>filename<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span><span class="k2">}</span>
<span class="number"> 42</span>
<span class="number"> 43</span>
<span class="number"> 44</span><span class="c">//THIS IS NOT USED ANYWHERE YET:</span>
<span class="number"> 45</span><span class="k1">void</span> BitmapHandler::reload<span class="k2">(</span>std::string filename<span class="k2">)</span>
<span class="number"> 46</span><span class="k2">{</span>
<span class="number"> 47</span>    unload<span class="k2">(</span>filename<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 48</span>    my_map<span class="k2">[</span>filename<span class="k2">]</span><span class="k3">=</span>load<span class="k2">(</span>filename<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 49</span><span class="k2">}</span>
<span class="number"> 50</span>
<span class="number"> 51</span><span class="k1">void</span> BitmapHandler::clear<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 52</span><span class="k2">{</span>
<span class="number"> 53</span>    std::map<span class="k3">&lt;</span>std::string, <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator it<span class="k2">;</span>
<span class="number"> 54</span>    <span class="k1">for</span> <span class="k2">(</span>it <span class="k3">=</span> my_map.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> my_map.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it <span class="k2">)</span>
<span class="number"> 55</span>    <span class="k2">{</span>
<span class="number"> 56</span>        <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span><span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span>.second<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 57</span>    <span class="k2">}</span>
<span class="number"> 58</span>    my_map.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 59</span><span class="k2">}</span>
</div></div><p>

And the Grid class that I created. [Needed this to have a structure that returns a default value on an out-of-bounds get()]
</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">#pragma once</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="p">#include &lt;vector&gt;</span>
<span class="number">  4</span>
<span class="number">  5</span><span class="k1">template</span><span class="k3">&lt;</span><span class="k1">class</span> T&gt;
<span class="number">  6</span><span class="k1">class</span> Grid
<span class="number">  7</span><span class="k2">{</span>
<span class="number">  8</span>    private:
<span class="number">  9</span>        std::vector<span class="k3">&lt;</span>T&gt; field<span class="k2">;</span>
<span class="number"> 10</span>        T default_value<span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>    public:
<span class="number"> 13</span>        <span class="k1">int</span> w,h,size<span class="k2">;</span>
<span class="number"> 14</span>
<span class="number"> 15</span>        Grid<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 16</span>        <span class="k2">{</span>
<span class="number"> 17</span>                w<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 18</span>                h<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 19</span>                size<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 20</span>                default_value<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 21</span>        <span class="k2">}</span>
<span class="number"> 22</span>
<span class="number"> 23</span>        Grid<span class="k2">(</span><span class="k1">int</span> W, <span class="k1">int</span> H, T def<span class="k2">)</span>
<span class="number"> 24</span>        <span class="k2">{</span>
<span class="number"> 25</span>            w<span class="k3">=</span>W<span class="k2">;</span>
<span class="number"> 26</span>            h<span class="k3">=</span>H<span class="k2">;</span>
<span class="number"> 27</span>            size<span class="k3">=</span>w<span class="k3">*</span>h<span class="k2">;</span>
<span class="number"> 28</span>            default_value<span class="k3">=</span>def<span class="k2">;</span>
<span class="number"> 29</span>            <span class="k1">for</span> <span class="k2">(</span> <span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> size<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span> <span class="k2">)</span>
<span class="number"> 30</span>            <span class="k2">{</span>
<span class="number"> 31</span>                field.push_back<span class="k2">(</span>default_value<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>            <span class="k2">}</span>
<span class="number"> 33</span>        <span class="k2">}</span>
<span class="number"> 34</span>
<span class="number"> 35</span>        T get<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span>
<span class="number"> 36</span>        <span class="k2">{</span>
<span class="number"> 37</span>            <span class="k1">if</span> <span class="k2">(</span>x<span class="k3">&lt;</span><span class="n">0</span> <span class="k3">|</span><span class="k3">|</span> y<span class="k3">&lt;</span><span class="n">0</span> <span class="k3">|</span><span class="k3">|</span> x&gt;<span class="k3">=</span>w <span class="k3">|</span><span class="k3">|</span> y&gt;<span class="k3">=</span>h<span class="k2">)</span> <span class="k1">return</span> default_value<span class="k2">;</span>
<span class="number"> 38</span>            <span class="k1">return</span>  field<span class="k2">[</span>x <span class="k3">+</span> y<span class="k3">*</span>w<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 39</span>        <span class="k2">}</span>
<span class="number"> 40</span>
<span class="number"> 41</span>        <span class="k1">void</span> set<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, T val<span class="k2">)</span>
<span class="number"> 42</span>        <span class="k2">{</span>
<span class="number"> 43</span>            <span class="k1">if</span> <span class="k2">(</span>x<span class="k3">&lt;</span><span class="n">0</span> <span class="k3">|</span><span class="k3">|</span> y<span class="k3">&lt;</span><span class="n">0</span> <span class="k3">|</span><span class="k3">|</span> x&gt;<span class="k3">=</span>w <span class="k3">|</span><span class="k3">|</span> y&gt;<span class="k3">=</span>h<span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 44</span>            field<span class="k2">[</span>x <span class="k3">+</span> y<span class="k3">*</span>w<span class="k2">]</span> <span class="k3">=</span> val<span class="k2">;</span>
<span class="number"> 45</span>        <span class="k2">}</span>
<span class="number"> 46</span>
<span class="number"> 47</span>        <span class="k1">void</span> fill<span class="k2">(</span>T val<span class="k2">)</span>
<span class="number"> 48</span>        <span class="k2">{</span>
<span class="number"> 49</span>            <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> a<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> a<span class="k3">&lt;</span>size<span class="k2">;</span> a<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 50</span>            <span class="k2">{</span>
<span class="number"> 51</span>                field<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">=</span> val<span class="k2">;</span>
<span class="number"> 52</span>            <span class="k2">}</span>
<span class="number"> 53</span>        <span class="k2">}</span>
<span class="number"> 54</span><span class="k2">}</span><span class="k2">;</span>
</div></div><p>


I&#39;ll get yelled at for this, but here&#39;s my &quot;global.h&quot;. To the main CPP, it declares and initializes global variables. Outside the main.cpp, it declares them as external.
</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">#pragma once</span>
<span class="number">   2</span>
<span class="number">   3</span><span class="p">#include &lt;vector&gt;</span>
<span class="number">   4</span><span class="p">#include &lt;algorithm&gt;</span>
<span class="number">   5</span>
<span class="number">   6</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   7</span><span class="p">#include &lt;allegro5/allegro_font.h&gt;</span>
<span class="number">   8</span><span class="p">#include &lt;allegro5/allegro_audio.h&gt;</span>
<span class="number">   9</span><span class="p">#include &lt;allegro5/allegro_acodec.h&gt;</span>
<span class="number">  10</span><span class="p">#include &lt;allegro5/allegro_ttf.h&gt;</span>
<span class="number">  11</span><span class="p">#include &lt;allegro5/allegro_image.h&gt;</span>
<span class="number">  12</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">  13</span><span class="p">#include &lt;allegro5/allegro_native_dialog.h&gt;</span>
<span class="number">  14</span>
<span class="number">  15</span><span class="p">#include "game.h"</span>
<span class="number">  16</span><span class="p">#include "gameobject.h"</span>
<span class="number">  17</span><span class="p">#include "clarionmath.h"</span>
<span class="number">  18</span><span class="p">#include "grid.h"</span>
<span class="number">  19</span><span class="p">#include "bitmaps.h"</span>
<span class="number">  20</span>
<span class="number">  21</span><span class="p">#ifndef MAINCPP</span>
<span class="number">  22</span><span class="p">#define GLOB(X,V) extern X;</span>
<span class="number">  23</span><span class="p">#else</span>
<span class="number">  24</span><span class="p">#define GLOB(X,V) X V;</span>
<span class="number">  25</span><span class="p">#undef MAINCPP</span>
<span class="number">  26</span><span class="p">#endif</span>
<span class="number">  27</span>
<span class="number">  28</span>
<span class="number">  29</span><span class="c">///GLOBAL DEFINES</span>
<span class="number">  30</span><span class="p">#define SCREEN_W al_get_display_width(display)</span>
<span class="number">  31</span><span class="p">#define SCREEN_H al_get_display_height(display)</span>
<span class="number">  32</span><span class="p">#define SCREEN_BITMAP al_get_backbuffer(display)</span>
<span class="number">  33</span>
<span class="number">  34</span><span class="c">///ENUMS</span>
<span class="number">  35</span><span class="k1">namespace</span> ROOM
<span class="number">  36</span><span class="k2">{</span>
<span class="number">  37</span><span class="k1">enum</span> ENUM
<span class="number">  38</span><span class="k2">{</span>
<span class="number">  39</span>    <a href="http://www.allegro.cc/manual/MENU"><span class="a">MENU</span></a>,
<span class="number">  40</span>    GAME
<span class="number">  41</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  42</span><span class="k2">}</span>
<span class="number">  43</span>
<span class="number">  44</span><span class="k1">namespace</span> DIR
<span class="number">  45</span><span class="k2">{</span>
<span class="number">  46</span><span class="k1">enum</span> ENUM
<span class="number">  47</span><span class="k2">{</span>
<span class="number">  48</span>    NORTH,
<span class="number">  49</span>    EAST,
<span class="number">  50</span>    SOUTH,
<span class="number">  51</span>    WEST,
<span class="number">  52</span>    UP,
<span class="number">  53</span>    DOWN
<span class="number">  54</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  55</span><span class="k2">}</span>
<span class="number">  56</span>
<span class="number">  57</span>
<span class="number">  58</span><span class="k1">enum</span> MOUSE_BUTTONS
<span class="number">  59</span><span class="k2">{</span>
<span class="number">  60</span>    MBLEFT<span class="k3">=</span><span class="n">0</span>,
<span class="number">  61</span>    MBRIGHT<span class="k3">=</span><span class="n">1</span>,
<span class="number">  62</span>    MBMIDDLE<span class="k3">=</span><span class="n">2</span>
<span class="number">  63</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  64</span>
<span class="number">  65</span>
<span class="number">  66</span><span class="c">///GLOBAL VARS</span>
<span class="number">  67</span><span class="c">//remember to use GLOB(Declaration,Definition) to define global variables and avoid linker errors</span>
<span class="number">  68</span>
<span class="number">  69</span>GLOB<span class="k2">(</span>Game<span class="k3">*</span> Clarion,<span class="k2">)</span>
<span class="number">  70</span>
<span class="number">  71</span>GLOB<span class="k2">(</span><span class="k1">const</span> <span class="k1">int</span> MASK,<span class="k3">=</span><span class="n">16711935</span><span class="k2">)</span>
<span class="number">  72</span>
<span class="number">  73</span>GLOB<span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> LAST_CLOCK,<span class="k3">=</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  74</span>GLOB<span class="k2">(</span><span class="k1">double</span> FPS,<span class="k3">=</span><span class="n">1</span><span class="k2">)</span>
<span class="number">  75</span>GLOB<span class="k2">(</span><span class="k1">int</span> TARGET_FPS,<span class="k3">=</span><span class="n">60</span><span class="k2">)</span>
<span class="number">  76</span>
<span class="number">  77</span><span class="c">//dimensions of various things</span>
<span class="number">  78</span>GLOB<span class="k2">(</span><span class="k1">int</span> TILE_W,<span class="k3">=</span><span class="n">50</span><span class="k2">)</span>
<span class="number">  79</span>GLOB<span class="k2">(</span><span class="k1">int</span> TILE_H,<span class="k3">=</span><span class="n">25</span><span class="k2">)</span>
<span class="number">  80</span>GLOB<span class="k2">(</span><span class="k1">int</span> UI_W,<span class="k3">=</span><span class="n">200</span><span class="k2">)</span>
<span class="number">  81</span>GLOB<span class="k2">(</span><span class="k1">int</span> UI_H,<span class="k3">=</span><span class="n">120</span><span class="k2">)</span>
<span class="number">  82</span>
<span class="number">  83</span><span class="c">//resource holders (hold maps of resources)</span>
<span class="number">  84</span>GLOB<span class="k2">(</span>BitmapHandler BMP,<span class="k2">)</span>
<span class="number">  85</span>
<span class="number">  86</span><span class="c">//keyboard data</span>
<span class="number">  87</span>GLOB<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_KEYBOARD_STATE"><span class="a">ALLEGRO_KEYBOARD_STATE</span></a> KBSTATE,<span class="k2">)</span>
<span class="number">  88</span>GLOB<span class="k2">(</span><span class="k1">bool</span> <a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>ALLEGRO_KEY_MAX<span class="k2">]</span>,<span class="k2">)</span>
<span class="number">  89</span>GLOB<span class="k2">(</span><span class="k1">bool</span> key_was<span class="k2">[</span>ALLEGRO_KEY_MAX<span class="k2">]</span>,<span class="k2">)</span>
<span class="number">  90</span>GLOB<span class="k2">(</span><span class="k1">bool</span> key_pressed<span class="k2">[</span>ALLEGRO_KEY_MAX<span class="k2">]</span>,<span class="k2">)</span>
<span class="number">  91</span>GLOB<span class="k2">(</span><span class="k1">bool</span> key_released<span class="k2">[</span>ALLEGRO_KEY_MAX<span class="k2">]</span>,<span class="k2">)</span>
<span class="number">  92</span>
<span class="number">  93</span><span class="c">//mouse data</span>
<span class="number">  94</span>GLOB<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_MOUSE_STATE"><span class="a">ALLEGRO_MOUSE_STATE</span></a> MOUSE,<span class="k2">)</span>
<span class="number">  95</span>GLOB<span class="k2">(</span><span class="k1">bool</span> mouse_was<span class="k2">[</span><span class="n">3</span><span class="k2">]</span>,<span class="k2">)</span>
<span class="number">  96</span>GLOB<span class="k2">(</span><span class="k1">bool</span> mouse_pressed<span class="k2">[</span><span class="n">3</span><span class="k2">]</span>,<span class="k2">)</span>
<span class="number">  97</span>GLOB<span class="k2">(</span><span class="k1">bool</span> mouse_released<span class="k2">[</span><span class="n">3</span><span class="k2">]</span>,<span class="k2">)</span>
<span class="number">  98</span>
<span class="number">  99</span><span class="c">//fonts</span>
<span class="number"> 100</span>GLOB<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a><span class="k3">*</span> font_default,<span class="k2">)</span>
<span class="number"> 101</span>
<span class="number"> 102</span><span class="c">//display</span>
<span class="number"> 103</span>GLOB<span class="k2">(</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"> 104</span>
<span class="number"> 105</span>
<span class="number"> 106</span>
<span class="number"> 107</span>
<span class="number"> 108</span><span class="c">///FUNCTIONS</span>
<span class="number"> 109</span><span class="k1">int</span> init<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//start up necessary allegro tools and other objects</span>
<span class="number"> 110</span>
<span class="number"> 111</span><span class="k1">void</span> update_input<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 112</span>
<span class="number"> 113</span><span class="c">/*void soundplay(ALLEGRO_SAMPLES* S);</span>
<span class="number"> 114</span><span class="c">void soundloop(ALLEGRO_SAMPLES* S);*/</span>
<span class="number"> 115</span>
<span class="number"> 116</span><span class="k1">void</span> refresh_screen<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//flips screen</span>
<span class="number"> 117</span>
<span class="number"> 118</span><span class="c">//draw a UI frame using a small picture as the base</span>
<span class="number"> 119</span><span class="k1">void</span> draw_frame<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span> frame, <span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> w, <span class="k1">int</span> h, <span class="k1">bool</span> inner<span class="k3">=</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 120</span>
<span class="number"> 121</span><span class="k1">int</span> color_compare<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> c1, <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> c2<span class="k2">)</span><span class="k2">;</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Collins)</author>
		<pubDate>Sun, 01 Apr 2012 10:30:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>tl;dr all of it. But I have one tip anyway. Using individual bitmaps is going to be slow on OpenGL or D3D. What you should do is put your tiles in one sheet (if possible, or 2, 3 sheets if not). Then draw everything in one swoop. Something like this:</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_hold_bitmap_drawing"><span class="a">al_hold_bitmap_drawing</span></a><span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="c">// loop drawing sub bitmaps must be the same parent</span>
<a href="http://www.allegro.cc/manual/al_hold_bitmap_drawing"><span class="a">al_hold_bitmap_drawing</span></a><span class="k2">(</span><span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Like that. Then there are very few OpenGL state changes.</p><p>If you need to keep your tiles in individual files on disk, then load and draw them onto a single large bitmap then destroy them. That big bitmap is called a texture atlas. &lt;shameless plug&gt;If you want something that can easily create atlases from loaded bitmaps (the atlases are static, once you create them they can&#39;t be changed and that&#39;s the main shortcoming), I have an atlas library here: <a href="http://www.nooskewl.com/content/open-source">http://www.nooskewl.com/content/open-source</a>. &lt;/shameless plug&gt;
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 01 Apr 2012 11:03:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, so far there are only TWO kinds of tiles, so I&#39;m not sure if that&#39;s the cause. Since all the tiles are 64x64 I shouldn&#39;t have a problem making this atlas you speak of.</p><p>Can you explain exactly what</p><p>al_hold_bitmap_drawing(true);<br />// loop drawing sub bitmaps must be the same parent<br />al_hold_bitmap_drawing(false);</p><p>does?</p><p>Are you saying that each individual tile should be a sub bitmap of the atlas?</p><p>I&#39;m going to try this out anyhow. Thanks for the tip.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Collins)</author>
		<pubDate>Sun, 01 Apr 2012 11:43:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Two tiles can be just as bad as 1000. What that code does is start collecting vertices in a buffer, each call to al_draw_bitmap is batched up and when you finally call al_hold_bitmap_drawing(false) it only has to bind that one texture (the atlas) once, and then just passes the gpu a bunch of vertex (triangle) data. The really slow part is switching textures and using an atlas avoids that. If you have just two textures you still have to switch over and over between them. Atlases are very very common in games using OpenGL/D3D and that&#39;s why.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 01 Apr 2012 12:33:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Amazing!</p><p>I made a TileHandler, similar to the above BitmapHandler, except it stores sub-bitmaps to a 1024 by 1024 atlas bitmap. You use TILE[&quot;tile.png&quot;]; and it places that tile in the next available spot on the atlas if it hasn&#39;t already been loaded. It returns the pointer to the sub-bitmap.</p><p>After using this instead of the bitmap handler to store the tiles, and adding the al_hold_bitmap_drawing(); function in the world drawing loop, my framerate is through the roof.</p><p>Thanks a ton for the help.</p><p>EDIT: So, this begs the question. How do I get around my hard limit of 256 64x64 tiles?</p><p>I&#39;m thinking I should just make new tile file loads loop back to the start of the atlas (0,0) if it&#39;s full, right? Tricky.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Collins)</author>
		<pubDate>Sun, 01 Apr 2012 12:38:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It depends how many tiles you need per level. If you need no more than 256, reset your atlas each level. If you need more, you&#39;ll need several sheets and a modified drawing algorithm. The drawing algo would look something like this:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">for</span> each layer
  <span class="k1">for</span> each sheet
    hold drawing <span class="k1">true</span>
      loop drawing all tiles on sheet X
    release hold
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 01 Apr 2012 12:59:30 +0000</pubDate>
	</item>
</rss>
