<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Bitmap vector problem</title>
		<link>http://www.allegro.cc/forums/view/591614</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 28 May 2007 20:18:46 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m having some trouble with a vector&lt;BITMAP *&gt;. It&#39;s purpose is to hold an array of tiles, hacked up from a larger tile bitmap. As the loop progresses, it blits the correct tile to the screen, but as soon as that&#39;s over, any reference to specific entries returns only the last tile read.</p><p>A test loop using an iterator, couting each address, returned only one address, so either only one BITMAP * entry is being created, or this program doesn&#39;t access the vector properly.</p><p>level.cpp (partial):
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include "level.h"</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="c">// defined in main.cpp</span></td></tr><tr><td class="number">4</td><td><span class="k1">extern</span> vector<span class="k3">&lt;</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span><span class="k3">&gt;</span> tileset<span class="k2">;</span></td></tr><tr><td class="number">5</td><td><span class="k1">extern</span> LEVELSTRUCT level<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k1">int</span> load_tileset<span class="k2">(</span><span class="k1">int</span> episode<span class="k2">)</span></td></tr><tr><td class="number">8</td><td><span class="k2">{</span></td></tr><tr><td class="number">9</td><td>  <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>tilebitmap<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>  <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>tmptile <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span><span class="n">16</span>, <span class="n">16</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td>  string filename <span class="k3">=</span> int_str<span class="k2">(</span>episode<span class="k2">)</span> <span class="k3">+</span> <span class="s">"til0000.bmp"</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td> </td></tr><tr><td class="number">14</td><td>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><span class="k2">(</span>tilebitmap <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span>filename.c_str<span class="k2">(</span><span class="k2">)</span>, NULL<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">15</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">16</td><td>    cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Couldn't load "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> filename <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>  <span class="k1">int</span> tw <span class="k3">=</span> tilebitmap-&gt;w <span class="k3">/</span> <span class="n">16</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>  <span class="k1">int</span> th <span class="k3">=</span> tilebitmap-&gt;h <span class="k3">/</span> <span class="n">16</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>  tileset.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td>  <span class="k1">int</span> x <span class="k3">=</span> <span class="n">0</span>, y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</td><td>  <span class="k1">for</span> <span class="k2">(</span>y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y <span class="k3">&lt;</span> th<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>y<span class="k2">)</span></td></tr><tr><td class="number">28</td><td>    <span class="k1">for</span> <span class="k2">(</span>x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> tw<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>x<span class="k2">)</span></td></tr><tr><td class="number">29</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">30</td><td>      <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>tilebitmap, tmptile, x <span class="k3">*</span> <span class="n">16</span>, y <span class="k3">*</span> <span class="n">16</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">16</span>, <span class="n">16</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>      tileset.push_back<span class="k2">(</span>tmptile<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>      <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, tileset<span class="k2">[</span>x <span class="k3">+</span> y <span class="k3">*</span> tw<span class="k2">]</span>, x <span class="k3">*</span> <span class="n">16</span>, y <span class="k3">*</span> <span class="n">16</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td>  <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>tilebitmap<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>  <span class="k1">int</span> i<span class="k2">;</span></td></tr><tr><td class="number">38</td><td>&#160;</td></tr><tr><td class="number">39</td><td>  <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> tileset.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span></td></tr><tr><td class="number">40</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">41</td><td>      <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, tileset<span class="k3">&lt;</span>i&gt;, <span class="k2">(</span>i % <span class="n">13</span><span class="k2">)</span> <span class="k3">*</span> <span class="n">16</span>, <span class="k2">(</span>i <span class="k3">/</span> <span class="n">13</span><span class="k2">)</span> <span class="k3">*</span> <span class="n">16</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">43</td><td>&#160;</td></tr><tr><td class="number">44</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jimage)</author>
		<pubDate>Mon, 28 May 2007 09:28:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>tileset.push_back() is adding a pointer to the vector. Since you never change the value of tmptile, it&#39;s always the same pointer. You just overwrite what it points to a ton of times.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Mon, 28 May 2007 10:05:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks. That makes sense. So how do I copy the content of tmptile instead of just a pointer?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jimage)</author>
		<pubDate>Mon, 28 May 2007 11:41:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Create a tmptile each time just before you blit to it and push_back to the vector. It might be better to use <span class="source-code"><a href="http://www.allegro.cc/manual/create_sub_bitmap" target="_blank"><span class="a">create_sub_bitmap</span></a></span> though, so you don&#39;t have to deal with having the image spread out all over memory.</p><p>Just don&#39;t forget to call destroy_bitmap on the pointers in the vector before clearing it!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Mon, 28 May 2007 11:51:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you wanted to have them destroyed automagically, you could wrap them in another class whose destructor calls destroy_bitmap() and use std::auto_ptr instead of a regular pointer.</p><p>It&#39;s a bit of extra work, but at least you can be sure you&#39;re not leaking memory. An ounce of prevention...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Mon, 28 May 2007 15:47:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ah, marvelous. It works great again.
</p><div class="quote_container"><div class="title">Kitty Cat said:</div><div class="quote"><p>
It might be better to use</p><p>create_sub_bitmap</p><p>though, so you don&#39;t have to deal with having the image spread out all over memory.
</p></div></div><p>
Sounds useful. I&#39;ll read into it. </p><div class="quote_container"><div class="title">Kibiz0r said:</div><div class="quote"><p>
you could wrap them in another class whose destructor calls destroy_bitmap() and use std::auto_ptr
</p></div></div><p>
Good thing you mentioned that or I&#39;d have overlooked freeing the pointers. However, I&#39;m not dealing with classes yet. Though I&#39;m using certain C++ features, everything&#39;s still coded procedurally. Is there a tutorial or example around that might shed some more light on the subject anyway?</p><p>A WIP screenshot is attached if anyone&#39;s interested.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jimage)</author>
		<pubDate>Mon, 28 May 2007 19:28:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Get a C++ primer book, then get used to C++ for a while, then get Effective C++.</p><p>Classes are the win. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>I would recommend a specific C++ primer book, but I really don&#39;t know. I read one C++ book and it was terrible. I mostly learned by absorbing code from these forums, documentation... anywhere there was semi-reliable C++ code. Looking back it was a dumb way to go about it, but it worked. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>Also, screenshot looks nice!</p><p>Oh, and you will also need a C++ design patterns book.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Mon, 28 May 2007 20:18:46 +0000</pubDate>
	</item>
</rss>
