<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Another vector+class problem?</title>
		<link>http://www.allegro.cc/forums/view/591691</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 02 Jun 2007 03:41:43 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Problem <img src="http://www.allegro.cc/forums/smileys/cry.gif" alt=":&#39;(" />:</p><p>I&#39;m now working on transferring enemies from a vector of classes called queued_enemies to a vector of classes that looks exactly like the class containing the processed enemies called enemies.</p><p>vector&lt;enemy&gt; queued_enemies;//queued enemies.<br />vector&lt;enemy&gt; enemies;//processed enemies.</p><p>when a condition between a value in the queued_enemies vector and a value representing level progress is equal they trigger a set of functions which does the following:
</p><div class="source-code snippet"><div class="inner"><pre>  game::enemies::enemies.push_back<span class="k2">(</span>enemy<span class="k2">(</span>
  game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.visual,
  game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Xpos,
  game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Ypos,
  game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Xspeed,
  game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Yspeed,
  game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Xacc,
  game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Yacc,
  game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.SpawnTime,
  game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.mov_progress,
  game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.mov_scheme
  <span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
      
  game::enemies::queued_enemies.erase<span class="k2">(</span>game::enemies::queued_enemies.begin<span class="k2">(</span><span class="k2">)</span><span class="k3">+</span>enyNR<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

What I&#39;m doing(trying to do) is that I&#39;m moving an element from one vector to another.<br />but for some reason i get REALLY strange results.. as strange effects from bitmaps<br />used by enemies created this way, i can&#39;t understand why the enemies created this way acts so strangely. if the data passes correctly it should be acting correctly! :S.. I&#39;m totally lost, and this time i really mean it..</p><p>any suggestions on a better way of transferring elements?</p><p>another problem is that the following condition:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span><span class="k2">(</span>game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.SpawnTime <span class="k3">=</span><span class="k3">=</span> game::progress<span class="k3">*</span><span class="n">1000</span><span class="k2">)</span>
</pre></div></div><p>
which triggers the functions i mentioned above doesn&#39;t work! <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" />, i&#39;m thinking that maybe SpawnTime is equal to 0 or NULL but it can&#39;t be 0 and i don&#39;t know the effects of NULL. trying to check a value from an element that doesn&#39;t exist would result in a crash right?</p><p>The condition isn&#39;t used of course.</p><p>I&#39;ll upload and answer to anything that would help with solving this!<br />THANK YOU VERY MUCH!!!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Albin Engström)</author>
		<pubDate>Sat, 02 Jun 2007 01:12:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>1) Why are you copying them in such a convoluted scheme instead of just using the copy constructor?<br />2) CODE PLEASE.<br />3) NULL and 0 are (practically) the same value.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Sat, 02 Jun 2007 01:21:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">X-G said:</div><div class="quote"><p>
Why are you copying them in such a convoluted scheme instead of just using the copy constructor?
</p></div></div><p> Probably because i didn&#39;t know of any copy constructor... - -. what is the copy constructor?</p><div class="quote_container"><div class="title">X-G said:</div><div class="quote"><p>
CODE PLEASE
</p></div></div><p> YES SIR!.. </p><p>hmm, i would if i could but i can&#39;t figure out what could be relevant and not, here&#39;s everything i could think of:</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="k1">void</span> process_level<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>  game::progress<span class="k3">+</span><span class="k3">=</span><span class="n">0</span>.<span class="n">001</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>  </td></tr><tr><td class="number">5</td><td>  <span class="k1">if</span><span class="k2">(</span>game::enemies::queued_enemies.size<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">6</td><td>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> enyNR <span class="k3">=</span> game::enemies::queued_enemies.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> enyNR <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> enyNR--<span class="k2">)</span></td></tr><tr><td class="number">7</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">8</td><td>    <span class="k1">if</span><span class="k2">(</span>game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.SpawnTime <span class="k3">=</span><span class="k3">=</span> game::progress<span class="k3">*</span><span class="n">1000</span><span class="k2">)</span></td></tr><tr><td class="number">9</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">10</td><td>    game::enemies::enemies.push_back<span class="k2">(</span>enemy<span class="k2">(</span></td></tr><tr><td class="number">11</td><td>    game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.visual,</td></tr><tr><td class="number">12</td><td>    game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Xpos,</td></tr><tr><td class="number">13</td><td>    game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Ypos,</td></tr><tr><td class="number">14</td><td>    game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Xspeed,</td></tr><tr><td class="number">15</td><td>    game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Yspeed,</td></tr><tr><td class="number">16</td><td>    game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Xacc,</td></tr><tr><td class="number">17</td><td>    game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Yacc,</td></tr><tr><td class="number">18</td><td>    game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.SpawnTime,</td></tr><tr><td class="number">19</td><td>    game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.mov_progress,</td></tr><tr><td class="number">20</td><td>    game::enemies::queued_enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.mov_scheme</td></tr><tr><td class="number">21</td><td>    <span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>    game::enemies::queued_enemies.erase<span class="k2">(</span>game::enemies::queued_enemies.begin<span class="k2">(</span><span class="k2">)</span><span class="k3">+</span>enyNR<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">24</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">25</td><td>  </td></tr><tr><td class="number">26</td><td><span class="k2">}</span><span class="k2">;</span></td></tr></tbody></table></div></div><p> this section is supposed to handle all the events of the level such as spawning and such..</p><div class="source-code snippet"><div class="inner"><pre>    <span class="k1">if</span><span class="k2">(</span>sys::console::input <span class="k3">=</span><span class="k3">=</span> <span class="s">"NEW TEST A                                "</span><span class="k2">)</span>
    <span class="k2">{</span>
     game::enemies::queued_enemies.push_back<span class="k2">(</span>enemy<span class="k2">(</span><span class="n">3</span>, <span class="n">200</span>, <span class="k3">-</span><span class="n">100</span>, <span class="n">0</span>, <span class="n">0</span>.<span class="n">012</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">7000</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="k2">}</span>
</pre></div></div><p>Adding to the quene using the horrible bad excuse called &quot;console&quot; that i&#39;m using to test stuff.</p><div class="source-code snippet"><div class="inner"><pre>    <span class="k1">if</span><span class="k2">(</span>sys::console::input <span class="k3">=</span><span class="k3">=</span> <span class="s">"NEW ENEMY D                               "</span><span class="k2">)</span>
    game::enemies::enemies.push_back<span class="k2">(</span>enemy<span class="k2">(</span><span class="n">3</span>, <span class="n">200</span>, <span class="n">100</span>, <span class="n">0</span>, <span class="n">0</span>.<span class="n">001</span>, <span class="n">0</span>, <span class="n">0</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> Adding enemies to the processed enemies. adding enemies the &#39;normal&#39; way.<br />this way work perfectly.</p><p>need even more? this is pretty much everything concerning the transfer.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Albin Engström)</author>
		<pubDate>Sat, 02 Jun 2007 01:26:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>First off, this looks awfully suspicious:</p><p><span class="source-code">game::enemies::enemies</span></p><p>Second, I would use a vector of pointers to your different enemy instances and then just move the pointer from vector to vector.  Also, if all your doing is &quot;processing&quot; the enemies, why not just have a flag in the class that says whether it is queued or not instead?</p><p>[edit]
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
what is the copy constructor?
</p></div></div><p>
You should code it in your class.  Look it up on google, you&#39;ll see...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Onewing)</author>
		<pubDate>Sat, 02 Jun 2007 01:28:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Every class has these methods, even if you don&#39;t explicitly declare and define them.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> Enemy
<span class="k2">{</span>
public:
    Enemy<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//default constructor</span>
    Enemy<span class="k2">(</span><span class="k1">const</span> Enemy<span class="k3">&amp;</span> o<span class="k2">)</span><span class="k2">;</span> <span class="c">//copy constructor</span>
    ~Enemy<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//default destructor</span>

    Enemy<span class="k3">&amp;</span> <span class="k1">operator</span><span class="k3">=</span><span class="k2">(</span><span class="k1">const</span> Enemy<span class="k3">&amp;</span> rhs<span class="k2">)</span><span class="k2">;</span> <span class="c">//copy assignment operator</span>
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Sat, 02 Jun 2007 01:29:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>See edit i made on the post before this.</p><div class="quote_container"><div class="title">Onewing said:</div><div class="quote"><p>
First off, this looks awfully suspicious:
</p></div></div><p> yes, the namespace has the same name as the vector. problem? <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /></p><div class="quote_container"><div class="title">Onewing said:</div><div class="quote"><p>
Second, I would use a vector of pointers to your different enemy instances and then just move the pointer from vector to vector. Also, if all your doing is &quot;processing&quot; the enemies, why not just have a flag in the class that says whether it is queued or not instead?
</p></div></div><p> I thought it would be better this way since all the enemies works the same way yet the uniqueness will be to great to make one vector for every type.. the vector holding the enemies that should be processed is used in for loops more than one time, instead of checking the flag more than one time i do this to only have to check it one time. i might be thinking wrong..</p><div class="quote_container"><div class="title">Kibiz0r said:</div><div class="quote"><p>
Every class has these methods, even if you don&#39;t explicitly declare and define them.
</p></div></div><p> never heard of the copy constructor until now. will look it up.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Albin Engström)</author>
		<pubDate>Sat, 02 Jun 2007 01:42:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Okay, took some time to soak in the code you posted.</p><p>First impression: It&#39;s a crime against programming. <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /></p><p>Second impression:</p><p>I bet the graphical problem is that you release the sprite in the destructor, which is called when you erase the enemy from the queued vector. However, the copy in the enemies vector has a copy of the pointer, and therefore points to the memory you just kersploded!</p><p>Store pointers in the vectors, not the objects themselves. But don&#39;t use naked pointers, use a smart pointer like the shared_ptr from Boost.org. Or the TR1 smart pointer (whatever it&#39;s called), if you like it better for some reason.</p><p>The shared_ptr keeps track of how many pointers are referencing it and when the last pointer is gone, it calls the destructor of whatever it points to. This is handy because you don&#39;t have to worry about the messy destructor problem with the sprite data, but it still cleans up after itself when you .erase() it.</p><p>Use .at() instead of [], .at() does bounds-checking.</p><p>Check out <a href="http://www.cppreference.com/cppalgorithm/iter_swap.html">iter_swap()</a></p><p>It calls one copy constructor and two operator= assignments.</p><p>That ought to be cheaper than calling .erase(), ~Enemy(), Enemy(), and push_back()</p><p>At least, I think so.</p><p>Edit: Also, don&#39;t use <tt>for (int i ...)</tt> loops with vectors, use iterators in the form of:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">for</span> <span class="k2">(</span>std::vector<span class="k3">&lt;</span>Enemy&gt;::iterator i <span class="k3">=</span> enemies.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> i <span class="k3">!</span><span class="k3">=</span> enemies.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="k2">{</span>
    <span class="c">//do stuff</span>
<span class="k2">}</span>
</pre></div></div><p>

Just be careful about using .erase() in it. If you use .erase(), do it like this:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">for</span> <span class="k2">(</span>std::vector<span class="k3">&lt;</span>Enemy&gt;::iterator i <span class="k3">=</span> enemies.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> i <span class="k3">!</span><span class="k3">=</span> enemies.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">)</span>
<span class="k2">{</span>
    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span><span class="k3">*</span>i<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>KillMe<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
        i <span class="k3">=</span> enemies.erase<span class="k2">(</span>i<span class="k2">)</span><span class="k2">;</span>
    <span class="k1">else</span>
    <span class="k2">{</span>
        <span class="c">//do stuff</span>
    <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>

Note that, when using this form, you don&#39;t need to check the size of the vector, because if it is 0, i will be equal to enemies.end() and will bail out immediately.</p><p>Phew. How come I&#39;ve been helping people all day, but my ONE topic has 2 replies, one of which is from me?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Sat, 02 Jun 2007 02:17:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Kibiz0r said:</div><div class="quote"><p>
It&#39;s a crime against programming
</p></div></div><p> great.. ^^&#39;</p><div class="quote_container"><div class="title">Kibiz0r said:</div><div class="quote"><p>
I bet the graphical problem is that you release the sprite in the destructor, which is called when you erase the enemy from the queued vector. However, the copy in the enemies vector has a copy of the pointer, and therefore points to the memory you just kersploded!
</p></div></div><p> Enemies doesn&#39;t hold their own sprites, they have a int value that represents their looks. :/</p><div class="quote_container"><div class="title">Kibiz0r said:</div><div class="quote"><p>
Store pointers in the vectors, not the objects themselves. But don&#39;t use naked pointers, use a smart pointer like the shared_ptr from Boost.org. Or the TR1 smart pointer (whatever it&#39;s called), if you like it better for some reason.
</p></div></div><p> Ok.. but what would i point to?.. and what&#39;s the difference between a naked pointer and a smart pointer?...</p><div class="quote_container"><div class="title">Kibiz0r said:</div><div class="quote"><p>
Use .at() instead of [], .at() does bounds-checking.
</p></div></div><p> Bounds checking??</p><div class="quote_container"><div class="title">Kibiz0r said:</div><div class="quote"><p>
Check out iter_swap() [cppreference.com]</p><p>It calls one copy constructor and two operator= assignment</p><p>That ought to be cheaper than calling .erase(), ~Enemy(), Enemy(), and push_back()</p><p>At least, I think so.
</p></div></div><p> iter_swap: isn&#39;t there a iter_move?? <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>Thanks for your help!!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Albin Engström)</author>
		<pubDate>Sat, 02 Jun 2007 02:52:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh yeah, I forgot you were also removing and adding... uh, I&#39;ve never tried it, but maybe swapping with .end() might work if the STL has a certain element of magic to it. But probably not.</p><p>Best bet is to make the super-cheap move of copying the pointer over, then erasing it from the original vector.</p><p>Bounds-checking is to make sure you don&#39;t try to access something that doesn&#39;t exist ie. isn&#39;t in the vector. Really just a habit thing.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Enemies doesn&#39;t hold their own sprites, they have a int value that represents their looks. :/
</p></div></div><p>

Then we NEED MOAR KODE!</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Ok.. but what would i point to?.. and what&#39;s the difference between a naked pointer and a smart pointer?...
</p></div></div><p>

Point to a dynamically-allocated object.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">typedef</span> boost::shared_ptr<span class="k3">&lt;</span>Enemy&gt; EnemyPtr<span class="k2">;</span>
EnemyPtr p <span class="k3">=</span> EnemyPtr<span class="k2">(</span><span class="k1">new</span> Enemy<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

A naked pointer is just a type and a memory address. A smart pointer keeps track of how many pointers are pointing to the data, so shared data doesn&#39;t mysteriously disappear. It also calls delete automatically when no more pointers point to the data.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Sat, 02 Jun 2007 03:08:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Kibiz0r said:</div><div class="quote"><p>
Best bet is to make the super-cheap move of copying the pointer over, then erasing it from the original vector.
</p></div></div><p> sounds ideal, but i don&#39;t get the &quot;dynamic pointer to not a vector&quot; (very confuding)... have to sleep before i get to that.</p><div class="quote_container"><div class="title">Kibiz0r said:</div><div class="quote"><p>

Bounds-checking is to make sure you don&#39;t try to access something that doesn&#39;t exist ie. isn&#39;t in the vector. Really just a habit thing.
</p></div></div><p> Noted.</p><div class="quote_container"><div class="title">Kibiz0r said:</div><div class="quote"><p>
Then we NEED MOAR KODE!
</p></div></div><p> and more code you&#39;ll get:</p><p>This is the code that draws the enemies... very complex isn&#39;t it?:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> draw_enemies<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer<span class="k2">)</span>
<span class="k2">{</span>
  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> nr <span class="k3">=</span> game::enemies::enemies.size<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="n">1</span><span class="k2">;</span> nr <span class="k3">!</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span> nr--<span class="k2">)</span>
  <span class="k2">{</span>
    <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span>buffer, <span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k2">)</span>datafiles::sprites_enemies<span class="k2">[</span>game::enemies::enemies<span class="k2">[</span>nr<span class="k2">]</span>.visual<span class="k2">]</span>.dat, game::enemies::enemies<span class="k2">[</span>nr<span class="k2">]</span>.Xpos, game::enemies::enemies<span class="k2">[</span>nr<span class="k2">]</span>.Ypos<span class="k2">)</span><span class="k2">;</span>
  <span class="k2">}</span>
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>

the main ingame drawing loop..
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> main_ingame_draw_loop<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer<span class="k2">)</span>
<span class="k2">{</span>
  draw_enemies<span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span>
  draw_projectiles<span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span>
  draw_player<span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span>
  draw_interface<span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>
I&#39;m really starting to get dry here...</p><p>What can i say...:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> process_enemies<span class="k2">(</span><span class="k2">)</span>
<span class="k2">{</span>
  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> enyNR <span class="k3">=</span> game::enemies::enemies.size<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="n">1</span><span class="k2">;</span> enyNR <span class="k3">!</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span> enyNR--<span class="k2">)</span>
  <span class="k2">{</span>
    game::enemies::enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Xpos <span class="k3">+</span><span class="k3">=</span> game::enemies::enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Xspeed<span class="k2">;</span>
    game::enemies::enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Ypos <span class="k3">+</span><span class="k3">=</span> game::enemies::enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Yspeed<span class="k2">;</span>
    
    game::enemies::enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Xspeed <span class="k3">+</span><span class="k3">=</span> game::enemies::enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Xacc<span class="k2">;</span>
    game::enemies::enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Yspeed <span class="k3">+</span><span class="k3">=</span> game::enemies::enemies<span class="k2">[</span>enyNR<span class="k2">]</span>.Yacc<span class="k2">;</span>
  <span class="k2">}</span>
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>

enemy constructor:
</p><div class="source-code snippet"><div class="inner"><pre>enemy::enemy<span class="k2">(</span><span class="k1">int</span> Cvisual, <span class="k1">int</span> CXpos, <span class="k1">int</span> CYpos, <span class="k1">float</span> CXspeed, <span class="k1">float</span> CYspeed, <span class="k1">float</span> CXacc, <span class="k1">float</span> CYacc, <span class="k1">int</span> CSpawnTime, <span class="k1">int</span> Cmov_progress, <span class="k1">int</span> Cmov_scheme<span class="k2">)</span>
<span class="k2">{</span>
  Xpos <span class="k3">=</span> CXpos<span class="k2">;</span>
  
  SpawnTime <span class="k3">=</span> CSpawnTime<span class="k2">;</span>
  
  Xspeed <span class="k3">=</span> CXspeed<span class="k2">;</span>
  
  Yspeed <span class="k3">=</span> CYspeed<span class="k2">;</span>
  
  Ypos <span class="k3">=</span> CYpos<span class="k2">;</span>
  
  visual <span class="k3">=</span> Cvisual<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

i really can&#39;t figure out any other important pieces.. any suggestions?</p><div class="quote_container"><div class="title">Kibiz0r said:</div><div class="quote"><p>
Point to a dynamically-allocated object.
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">typedef</span> boost::shared_ptr<span class="k3">&lt;</span>Enemy&gt; EnemyPtr<span class="k2">;</span>
EnemyPtr p <span class="k3">=</span> EnemyPtr<span class="k2">(</span><span class="k1">new</span> Enemy<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
A naked pointer is just a type and a memory address. A smart pointer keeps track of how many pointers are pointing to the data, so shared data doesn&#39;t mysteriously disappear. It also calls delete automatically when no more pointers point to the data.
</p></div></div><p> ouch!, i knew i shouldn&#39;t have tried to make a game before i know some more.. this is getting confusing, but i guess it&#39;s because i should have gone to sleep several hours ago..</p><p>when i wake up tomorrow i give it all a serious shot!<br />Thanks so much for you help! <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Albin Engström)</author>
		<pubDate>Sat, 02 Jun 2007 03:41:43 +0000</pubDate>
	</item>
</rss>
