<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Problems deleting bitmap</title>
		<link>http://www.allegro.cc/forums/view/615342</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 14 May 2015 22:07:05 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi All</p><p>Hope someone can help me with this issue. I&#39;m currently doing a project to make a 2d rpg style game.</p><p>Im using Visual Studio 2013, Windows 7 64bit and Allegro 5.</p><p>I have come to a section whereby I cannot seem to resolve an error.</p><p>What I am trying to do is allow the player to go up to a quest giver and if the quest is available then once the user has pressed space the quest will appear on screen. Then once the player has decided to accept or decline the quest then the quest image disappears and the player can continue on with the game.</p><p>I&#39;m not sure if this is the right way to do it, but my quest is a bitmap which I am loading and trying to delete in an else if statement.</p><p>I have tried putting the al_destroy_bitmap code in lots of places inside the QuestInfo function and also in the &quot;state = Playing&quot; section and everytime I run it, either nothing happens onscreen or VisualStudio crashed with a Access Violation reading location error</p><p>As a heads up I am coding without the use of classes (This is part of the project requirements)</p><p>I am also very new to C++/Allegro5 so my coding may not be implemented the best way.</p><p>Any help is very much appreciated.</p><p>This is my code section of where I am trying to do this
</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="number">  2</span><span class="k1">void</span> QuestInfo<span class="k2">(</span>Quests <span class="k3">&amp;</span>Status, <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>event_queue, <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> <span class="k3">&amp;</span>ev<span class="k2">)</span>
<span class="number">  3</span><span class="k2">{</span>
<span class="number">  4</span>  Status.ID <span class="k3">=</span> QUESTS<span class="k2">;</span>
<span class="number">  5</span>  Status.Available <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  6</span>  Status.Accepted <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  7</span>  Status.Completed <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  8</span>  NPCQuestOne.QuestHere <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>  <span class="k1">if</span> <span class="k2">(</span>NPCQuestOne.QuestHere <span class="k3">=</span><span class="k3">=</span> <span class="k1">true</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> Status.Available <span class="k3">=</span><span class="k3">=</span> <span class="k1">true</span><span class="k2">)</span>
<span class="number"> 11</span>  <span class="k2">{</span>
<span class="number"> 12</span>    DrawQuestWindow<span class="k2">(</span>Status<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</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"> 14</span>  <span class="k2">}</span>
<span class="number"> 15</span>  <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>NPCQuestOne.QuestHere <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> Status.Available <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span><span class="k2">)</span>
<span class="number"> 16</span>    <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>Status.image<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>    <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span> ALLEGRO_EVENT_MOUSE_BUTTON_DOWN<span class="k2">)</span>
<span class="number"> 19</span>    <span class="k2">{</span>
<span class="number"> 20</span>      <span class="k1">if</span> <span class="k2">(</span>ev.mouse.button <span class="k3">&amp;</span> <span class="n">1</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.mouse.x <span class="k3">&gt;</span> <span class="n">70</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.mouse.x <span class="k3">&lt;</span> <span class="n">245</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.mouse.y <span class="k3">&gt;</span> <span class="n">470</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.mouse.y <span class="k3">&lt;</span> <span class="n">515</span><span class="k2">)</span>
<span class="number"> 21</span>      <span class="k2">{</span>
<span class="number"> 22</span>        Status.Available <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 23</span>        Status.Accepted <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 24</span>        NPCQuestOne.QuestHere <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 25</span><span class="c">//I've tried al_destroy_bitmap here</span>
<span class="number"> 26</span>      <span class="k2">}</span>
<span class="number"> 27</span>      <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.mouse.button <span class="k3">&amp;</span> <span class="n">1</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.mouse.x <span class="k3">&gt;</span> <span class="n">285</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.mouse.x <span class="k3">&lt;</span> <span class="n">460</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.mouse.y <span class="k3">&gt;</span> <span class="n">470</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.mouse.y <span class="k3">&lt;</span> <span class="n">515</span><span class="k2">)</span>
<span class="number"> 28</span>      <span class="k2">{</span>
<span class="number"> 29</span>        Status.Available <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 30</span>        Status.Accepted <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 31</span>        NPCQuestOne.QuestHere <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 32</span>      <span class="k2">}</span>
<span class="number"> 33</span><span class="c">//I've tried al_destroy_bitmap here</span>
<span class="number"> 34</span>    <span class="k2">}</span>
<span class="number"> 35</span><span class="c">//I've tried al_destroy_bitmap here</span>
<span class="number"> 36</span><span class="k2">}</span>
<span class="number"> 37</span>
<span class="number"> 38</span><span class="k1">void</span> DrawQuestWindow<span class="k2">(</span>Quests <span class="k3">&amp;</span>Status<span class="k2">)</span>
<span class="number"> 39</span><span class="k2">{</span>
<span class="number"> 40</span>  <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>Status.image, Status.x, Status.y, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span><span class="k2">}</span>
</div></div><p>

I did trying posting all my code but it was 40k over the limit, so if you require anymore please let me know
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Lasaqus7)</author>
		<pubDate>Wed, 06 May 2015 00:03:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/615342/1012888#target">Lasaqus7</a> said:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre> <span class="k1">if</span> <span class="k2">(</span>NPCQuestOne.QuestHere <span class="k3">=</span><span class="k3">=</span> <span class="k1">true</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> Status.Available <span class="k3">=</span><span class="k3">=</span> <span class="k1">true</span><span class="k2">)</span> <span class="k2">{</span>
  DrawQuestWindow<span class="k2">(</span>Status<span class="k2">)</span><span class="k2">;</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="k2">}</span>
 <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>NPCQuestOne.QuestHere <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> Status.Available <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span><span class="k2">)</span>
  <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>Status.image<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

<span class="source-code"><span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>NPCQuestOne.QuestHere <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> Status.Available <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span><span class="k2">)</span></span>
</p></div></div><p>

What do these have to do with destroying your bitmap?</p><p>You may have meant 
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span><span class="k3">!</span>NPCQuestOne.QuestHere <span class="k3">|</span><span class="k3">|</span> <span class="k3">!</span>Status.Available<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
   <span class="c">// destroy image and exit quest screen</span>
<span class="k2">}</span>
</pre></div></div><p>
Because you would want to quit the quest screen if the NPC didn&#39;t have a Quest or if the quest was unavailable. But that&#39;s not what you&#39;re doing. You have hardcoded values in your function that will never change so it always does the same thing.</p><p>You want to load your bitmap once at the beginning of the game (checking to make sure it didn&#39;t return 0 indicating it didn&#39;t load properly) or at the beginning of the scene and then al_destroy_bitmap once at the end of the game or scene you are on. This way it is only in memory during your hero&#39;s visit to the quest giver. Or if it is a common occurrence, then keep it around longer - before and after the quest(s) is(are) sought.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> quest_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span><span class="c">// negative one indicates there is no quest</span>
<span class="k1">if</span> <span class="k2">(</span><span class="k3">-</span><span class="n">1</span> <span class="k3">!</span><span class="k3">=</span> <span class="k2">(</span>quest_num <span class="k3">=</span> CheckForQuestEvent<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
 Quest q <span class="k3">=</span> GetQuest<span class="k2">(</span>quest_num<span class="k2">)</span><span class="k2">;</span>
 q.Image <span class="k3">=</span> GetImageForQuest<span class="k2">(</span>quest_num<span class="k2">)</span><span class="k2">;</span>
 <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>q.Image<span class="k2">)</span> <span class="k2">{</span>
  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Error. Failed to load %s\n"</span> , GetImageNameForQuest<span class="k2">(</span>quest_num<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k1">return</span><span class="k2">;</span>
 <span class="k2">}</span>
 ShowQuest<span class="k2">(</span>q<span class="k2">)</span><span class="k2">;</span>
 <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>q.Image<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 06 May 2015 01:56:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Edgar to the rescue ! <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Wed, 06 May 2015 02:33:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks Edgar for the reply</p><div class="quote_container"><div class="title"><a href="http://">Edgar Reynaldo</a> said:</div><div class="quote"><p>

</p><div class="quote_container"><div class="title"><a href="http://">Lasaqus7</a> said:</div><div class="quote"><p>
 if (NPCQuestOne.QuestHere == true &amp;&amp; Status.Available == true) {<br />  DrawQuestWindow(Status);<br />  al_wait_for_event(event_queue, &amp;ev);<br /> }<br /> else if (NPCQuestOne.QuestHere == false &amp;&amp; Status.Available == false)<br />  al_destroy_bitmap(Status.image);<br />else if (NPCQuestOne.QuestHere == false &amp;&amp; Status.Available == false)
</p></div></div><p>
What do these have to do with destroying your bitmap?
</p></div></div><p>

That code ended up that way after trying to figure this out. It was the result of trying to add in code to try and get the action I wanted, but really all it is supposed to be is if there is a quest available at the quest giver then display a bitmap.<br />I did have everything working up to the point the user chooses Accept/Decline. So i know the bitmap was loading fine, then I ended up with this problem of trying to remove it on a mouse click event(that&#39;s why the mouse event is inside the function too).</p><p>Pretty difficult learning this and the only resource we got given was &quot;watch youtube tutorials&quot; and sometimes they just don&#39;t really cover the parts your doing.</p><p>I&#39;ll look at your code and figure out how to implement that into mine as it looks very different, and i&#39;ll get back to you if I can&#39;t :-) </p><p>Thanks again for the reply
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Lasaqus7)</author>
		<pubDate>Wed, 06 May 2015 02:53:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
I think what you&#39;re struggling with is the states of the quest operation that you want to operate on. There needs to be init code that deals with allocating memory and there needs to be destruction code that cleans it up when you&#39;re done. This means you can&#39;t hardcode the values for the quest inside the function, or else you need to wrap it with another function like I did.</p><p>The basic scheme should look like this :
</p><div class="source-code snippet"><div class="inner"><pre>Result WrapperFunction<span class="k2">(</span>Parameters p<span class="k2">)</span> <span class="k2">{</span>
  Data<span class="k3">*</span> dat <span class="k3">=</span> InitData<span class="k2">(</span>p<span class="k2">)</span><span class="k2">;</span>
  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>dat<span class="k2">)</span> <span class="k2">{</span>Fail<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span>
  Result result <span class="k3">=</span> UseData<span class="k2">(</span>dat<span class="k2">)</span><span class="k2">;</span>
  FreeData<span class="k2">(</span>dat<span class="k2">)</span><span class="k2">;</span>
  <span class="k1">return</span> result<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Now your UseData function doesn&#39;t have to worry about allocating any memory at all, only using it properly.</p><p>So the UseData function, or in your case, the QuestInfo function, would simply display the image for the quest passed into it by the wrapper function until the user clicked on one of your onscreen mouse buttons.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 06 May 2015 04:00:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Most likely you are still drawing the bitmap after you destroyed it. I&#39;d load the bitmap a bit earlier and unload it later.</p><p>Apart from this problem, there is al_draw_text and, in allegro 5.1.9 al_draw_multiline_text, with which you could display the text of the quest without the need for a bitmap.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Wed, 06 May 2015 10:45:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for your input but I couldn&#39;t get the bitmap section to work, but then again I was re-doing the code over and over and now it&#39;s all changed, although I do have 1 section of the quest working now.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Lasaqus7)</author>
		<pubDate>Sun, 10 May 2015 20:29:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Couldn&#39;t you just check against NULL before deleting the bitmap, at least to get past crashing!</p><p>Something like:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span><span class="k2">(</span>myBitmap <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span>
<span class="k2">{</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="k2">}</span>
</pre></div></div><p>

If that stops it crashing at least you&#39;ll know the root cause, and can start fixing it from there?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dizzy Egg)</author>
		<pubDate>Thu, 14 May 2015 15:13:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It works now Dizzy, After getting to code working for the text showing on/off I decided to try and add in the bitmap for it. It was kinda the same issue and it works great.</p><p>Thanks for the reply
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Lasaqus7)</author>
		<pubDate>Thu, 14 May 2015 22:07:05 +0000</pubDate>
	</item>
</rss>
