<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Collision detection and keyboard input question..</title>
		<link>http://www.allegro.cc/forums/view/610000</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 12 Apr 2012 22:17:38 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is my first attempt at collision detection and I&#39;m going to use bounding box / rectangle collision detection, do I need to check with all the objects on the map? If I have 100 different platforms, boxes and other stuff do I need to check with all of them if they collide with the player? This seems really tedious and inefficient..</p><p>I also have a problem with the keyboard input / events in my game, when I press left / right arrow key then press the up arrow key to jump while holding left / right it stops moving to the left / right.</p><p>What I thought would happen, if this is the event queue: right, right, right, up, right, right, right, etc etc.</p><p>What actually happens: Right, right, right, up then it stops.</p><p>Sorry if my explaining is a bit confusing. Here&#39;s some code.</p><p>Player.cpp Move 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">void</span> Player::Move<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a><span class="k3">*</span> events<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>
<span class="number">  4</span>  <span class="k1">if</span><span class="k2">(</span>events-&gt;type <span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN<span class="k2">)</span>
<span class="number">  5</span>  <span class="k2">{</span>
<span class="number">  6</span>    <span class="k1">switch</span><span class="k2">(</span>events-&gt;keyboard.keycode<span class="k2">)</span>
<span class="number">  7</span>    <span class="k2">{</span>
<span class="number">  8</span>    <span class="k1">case</span> ALLEGRO_KEY_DOWN:
<span class="number">  9</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 10</span>    <span class="k1">case</span> ALLEGRO_KEY_UP:
<span class="number"> 11</span>      Player::Jump<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 13</span>    <span class="k1">case</span> ALLEGRO_KEY_RIGHT:
<span class="number"> 14</span>      <span class="k1">if</span><span class="k2">(</span>Player::vel_X <span class="k3">&lt;</span><span class="k3">=</span><span class="n">10</span><span class="k2">)</span>Player::vel_X <span class="k3">+</span><span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 15</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 16</span>    <span class="k1">case</span> ALLEGRO_KEY_LEFT:
<span class="number"> 17</span>      <span class="k1">if</span><span class="k2">(</span>Player::vel_X <span class="k3">&gt;</span><span class="k3">=</span><span class="k3">-</span><span class="n">10</span><span class="k2">)</span>Player::vel_X <span class="k3">-</span><span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 18</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 19</span>    <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 20</span>  <span class="k2">}</span>
<span class="number"> 21</span><span class="k2">}</span>
</div></div><p>

The jumping function only sets the vel_Y to -20 and sets jumping = true</p><p>My game 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><span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>done<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> events<span class="k2">;</span>
<span class="number">  5</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_wait_for_event_timed"><span class="a">al_wait_for_event_timed</span></a><span class="k2">(</span>event_queue, <span class="k3">&amp;</span>events, <span class="n">0</span>.<span class="n">0001</span><span class="k2">)</span><span class="k2">)</span> player.Move<span class="k2">(</span><span class="k3">&amp;</span>events<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>  game.update<span class="k2">(</span><span class="k3">&amp;</span>player<span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>  game.draw<span class="k2">(</span><span class="k3">&amp;</span>player<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>  <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">030</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span><span class="k2">}</span>
</div></div><p>

my Game.update</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">void</span> Game::update<span class="k2">(</span>Player <span class="k3">*</span>p<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  p-&gt;setX<span class="k2">(</span>p-&gt;getfX<span class="k2">(</span><span class="k2">)</span> <span class="k3">+</span> p-&gt;getfVel_X<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>  p-&gt;setY<span class="k2">(</span>p-&gt;getfY<span class="k2">(</span><span class="k2">)</span> <span class="k3">+</span> p-&gt;getfVel_Y<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>  <span class="k1">if</span><span class="k2">(</span>p-&gt;getfVel_X<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">1</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>p-&gt;jumping<span class="k2">)</span> p-&gt;setVel_X<span class="k2">(</span>p-&gt;getfVel_X<span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> <span class="n">0</span>.<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>  <span class="k1">if</span><span class="k2">(</span>p-&gt;getfVel_X<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span> <span class="k3">-</span><span class="n">0</span>.<span class="n">1</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>p-&gt;jumping<span class="k2">)</span> p-&gt;setVel_X<span class="k2">(</span>p-&gt;getfVel_X<span class="k2">(</span><span class="k2">)</span> <span class="k3">+</span> <span class="n">0</span>.<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>  <span class="k1">if</span><span class="k2">(</span>p-&gt;getfY<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span> <span class="n">400</span><span class="k2">)</span> p-&gt;setVel_Y<span class="k2">(</span>p-&gt;getfVel_Y<span class="k2">(</span><span class="k2">)</span> <span class="k3">+</span> <span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>  <span class="k1">if</span><span class="k2">(</span>p-&gt;getfY<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">400</span>.<span class="n">0</span><span class="k2">)</span>
<span class="number">  9</span>  <span class="k2">{</span>  
<span class="number"> 10</span>    p-&gt;setVel_Y<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>    p-&gt;jumping <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 12</span>  <span class="k2">}</span>
<span class="number"> 13</span>  <span class="k1">if</span><span class="k2">(</span>p-&gt;getfY<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">400</span><span class="k2">)</span>
<span class="number"> 14</span>  <span class="k2">{</span>
<span class="number"> 15</span>    p-&gt;setY<span class="k2">(</span><span class="n">400</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    p-&gt;jumping <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 17</span>  <span class="k2">}</span>
<span class="number"> 18</span>
<span class="number"> 19</span><span class="k2">}</span><span class="k2">;</span>
</div></div><p>


Right now it&#39;s only a &quot;P&quot; being drawn on a black background, I&#39;m trying to perfect character movement before I add platforms, images, sound etc</p><p>oh and, whats the difference between Player::vel_X and just typing vel_X in player.cpp?<br />Edit: nevermind, there is no difference between Player::vel_X and typing vel_X, it&#39;s a matter of style for anyone else who might be wondering the same thing <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gnamra)</author>
		<pubDate>Thu, 12 Apr 2012 16:51:39 +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/610000/952320#target">Gnamra</a> said:</div><div class="quote"><p>This is my first attempt at collision detection and I&#39;m going to use bounding box / rectangle collision detection, do I need to check with all the objects on the map? If I have 100 different platforms, boxes and other stuff do I need to check with all of them if they collide with the player? This seems really tedious and inefficient..</p></div></div><p>

If this is your first attempt at collision detection, I&#39;d say you have a long way to go before you get to the point where optimizing bounding box checks becomes a real concern. Concentrate on getting something that feels like a game done, then optimize, if needed. It&#39;s easy to get carried away trying to figure out how to speed things up with space partitioning.</p><p>Well, since I&#39;ve already mentioned it, the general idea is to divide the space into simple, non-intersecting regions, figure a fast algorithm to find out which region an object is inside, then check for collisions only between objects that are in the same region. The most common method for a 2D game is probably a simple grid of squares. You can try quad trees if you want to get fancy, but it&#39;s almost always overkill.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Stas B.)</author>
		<pubDate>Thu, 12 Apr 2012 18:19:46 +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/610000/952325#target">Stas B.</a> said:</div><div class="quote"><p>
Well, since I&#39;ve already mentioned it, the general idea is to divide the space into simple, non-intersecting regions, figure a fast algorithm to find out which region an object is inside, then check for collisions only between objects that are in the same region. The most common method for a 2D game is probably a simple grid of squares. You can try quad trees if you want to get fancy, but it&#39;s almost always overkill.</p></div></div><p>

I see, so checking for collision with all the objects in a level isn&#39;t something that will slow down the game? Even if there are hundreds or perhaps thousands of objects?</p><p>Thanks <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> Only need to workout the keyboard problem now.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gnamra)</author>
		<pubDate>Thu, 12 Apr 2012 18:39:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>A fast and easy way to improve collision detection(if it&#39;s slow) is to check for bounding circles first, and then for bounding boxes. That way your algorithm will only check for boxes if the sprites are close enough to do so.<br />Comparing the squared distances of the sprites centre&#39;s is the fastest way to do it.</p><p>in pseudo-code(actually, I guess this works fine in C):
</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">bool</span> check_collision<span class="k2">(</span>sprite a,sprite b<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    <span class="c">// a's centre x</span>
<span class="number">  4</span>    a.cx <span class="k3">=</span> a.x <span class="k3">+</span> a.w<span class="k3">/</span><span class="n">2</span>
<span class="number">  5</span>    <span class="c">// a's centre y</span>
<span class="number">  6</span>    a.cy <span class="k3">=</span> a.y <span class="k3">+</span> a.h<span class="k3">/</span><span class="n">2</span>
<span class="number">  7</span>
<span class="number">  8</span>    <span class="c">// a's radium. you should get it at creation of the sprite,</span>
<span class="number">  9</span>    <span class="c">// not at collision time, since you only need to get it once.</span>
<span class="number"> 10</span>    <span class="c">// it's simply the distance from the centre to the up-left</span>
<span class="number"> 11</span>    <span class="c">// vertice of the sprite. </span>
<span class="number"> 12</span>    a.r <span class="k3">=</span> distance<span class="k2">(</span>a.x, a.y, a.cx, a.cy<span class="k2">)</span>
<span class="number"> 13</span>
<span class="number"> 14</span>    <span class="c">// Same for "b"</span>
<span class="number"> 15</span>    b.cx <span class="k3">=</span> b.x <span class="k3">+</span> b.w<span class="k3">/</span><span class="n">2</span> <span class="c">// b's centre x</span>
<span class="number"> 16</span>    b.cy <span class="k3">=</span> b.y <span class="k3">+</span> b.h<span class="k3">/</span><span class="n">2</span> <span class="c">// b's centre y</span>
<span class="number"> 17</span>    b.r <span class="k3">=</span> distance<span class="k2">(</span>b.x, b.y, b.cx, b.cy<span class="k2">)</span> <span class="c">// b's radium</span>
<span class="number"> 18</span>
<span class="number"> 19</span>    <span class="c">// forget the sqrt, it's slow. The squared distance will already work.</span>
<span class="number"> 20</span>    distance <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_618.html" target="_blank">pow</a><span class="k2">(</span>a.cx <span class="k3">-</span> b.cx, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_618.html" target="_blank">pow</a><span class="k2">(</span>a.cy <span class="k3">-</span> b.cy, <span class="n">2</span><span class="k2">)</span>
<span class="number"> 21</span>
<span class="number"> 22</span>    <span class="k1">if</span><span class="k2">(</span>distance <span class="k3">&lt;</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_618.html" target="_blank">pow</a><span class="k2">(</span>a.r <span class="k3">+</span> b.r<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 23</span>        <span class="k1">return</span> check_bounding_boxes<span class="k2">(</span>a, b<span class="k2">)</span>
<span class="number"> 24</span>    <span class="k1">else</span>
<span class="number"> 25</span>        <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 26</span><span class="k2">}</span>
</div></div><p>

Could anyone confirm this is a good practice? I sometimes do it this way and it works most time.(guess I turned my answer to a question, <img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" />)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Cassio Renan)</author>
		<pubDate>Thu, 12 Apr 2012 19:27:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You might be better off doing something like:</p><p>I think an angled line could cut corners if you have oddly shaped sprites.</p><p>max(sprite-&gt;w,sprite-&gt;h);
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Sopala)</author>
		<pubDate>Thu, 12 Apr 2012 20:30:16 +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/610000/952329#target">Gnamra</a> said:</div><div class="quote"><p>I see, so checking for collision with all the objects in a level isn&#39;t something that will slow down the game? Even if there are hundreds or perhaps thousands of objects?</p></div></div><p>

Hundreds? Nope. Thousands? Probably not enough to slow down a modern PC, but if you manage to get into that range, it will probably become worthwhile to free up some CPU cycles for the other tasks needed to handle thousands of objects. Note that when you say thousands of objects, I assume that each one of them may collide with any other. That&#39;s not usually the case. Either way, my point is that you shouldn&#39;t worry about this yet, whether it will become a problem in the future or not. Focus on the fun part of making an actual game. Optimizations are a huge time sink and it&#39;s quite demotivating when you realize you&#39;ve spent two weeks trying to implement quad trees but don&#39;t have anything that even remotely resembles a game yet.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/610000/952333#target">Cassio Renan</a> said:</div><div class="quote"><p>A fast and easy way to improve collision detection(if it&#39;s slow) is to check for bounding circles first, and then for bounding boxes. That way your algorithm will only check for boxes if the sprites are close enough to do so.<br />Comparing the squared distances of the sprites centre&#39;s is the fastest way to do it.</p></div></div><p>

Depends on the type of bounding boxes. If they&#39;re axis-aligned, it&#39;s a waste of time, since a method to check wether they intersect should look roughly like this:
</p><div class="source-code snippet"><div class="inner"><pre>    <span class="k1">if</span><span class="k2">(</span>min.x <span class="k3">&gt;</span> other.max.x <span class="k3">|</span><span class="k3">|</span> min.y <span class="k3">&gt;</span> other.max.y <span class="k3">|</span><span class="k3">|</span> other.min.x <span class="k3">&gt;</span> max.x <span class="k3">|</span><span class="k3">|</span> other.min.y <span class="k3">&gt;</span> max.y<span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
    <span class="k1">else</span> <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
</pre></div></div><p>

If they&#39;re allowed to rotate, well, that&#39;s another story, but I think the OP doesn&#39;t really care for rotating bounding boxes yet.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Stas B.)</author>
		<pubDate>Thu, 12 Apr 2012 20:44:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for all the help, I think rotating bounding boxes and quad trees are beyond me right now, so I&#39;ll save that for later!</p><p>Uhm.. about the problem I have with key events. Do all keyboards stop repeating the keystroke when another key was pressed? I&#39;m currently trying to figure out how to keep sending keystrokes of the last button pressed excluding the jump button. If someone has a fix for my problem then please post <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gnamra)</author>
		<pubDate>Thu, 12 Apr 2012 21:50:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>well,<br />doesn&#39;t really solve your problem, but I have a question:<br />why 
</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">  8</span><span class="k1">if</span><span class="k2">(</span>p-&gt;getfY<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">400</span>.<span class="n">0</span><span class="k2">)</span>
<span class="number">  9</span>  <span class="k2">{</span>  
<span class="number"> 10</span>    p-&gt;setVel_Y<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>    p-&gt;jumping <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 12</span>  <span class="k2">}</span>
<span class="number"> 13</span>  <span class="k1">if</span><span class="k2">(</span>p-&gt;getfY<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">400</span><span class="k2">)</span>
<span class="number"> 14</span>  <span class="k2">{</span>
<span class="number"> 15</span>    p-&gt;setY<span class="k2">(</span><span class="n">400</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    p-&gt;jumping <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 17</span>  <span class="k2">}</span>
</div></div><p>

and not</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">  8</span><span class="k1">if</span><span class="k2">(</span>p-&gt;getfY<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">400</span>.<span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span>p-&gt;jumping<span class="k2">)</span>
<span class="number">  9</span>  <span class="k2">{</span>  
<span class="number"> 10</span>    p-&gt;setVel_Y<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>    p-&gt;setY<span class="k2">(</span><span class="n">400</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>    p-&gt;jumping <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 13</span>  <span class="k2">}</span>
</div></div><p>

?</p><p>EDIT: Added &quot;p-&gt;jumping&quot; into the condition, so it only happens during jump.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Cassio Renan)</author>
		<pubDate>Thu, 12 Apr 2012 22:03:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Because I&#39;m stupid sometimes <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /> edited the code to match yours. </p><p>I have a bad habit of creating more if statements than needed, at that point I was trying to figure out why the velocity would sometimes continue to increase even though it hit 400. Then I realized it was because it never actually hit 400 but went past it so I made another if statement for when that happens.</p><p>Also, I found a workaround for the keyboard / key event problem I had.</p><p>For anyone who stumbles into the same problem, here&#39;s how I fixed it</p><p>player.cpp</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">void</span> Player::Move<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a><span class="k3">*</span> events<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <span class="k1">if</span><span class="k2">(</span>keyDown <span class="k3">=</span><span class="k3">=</span> <span class="k1">true</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  4</span>    <span class="k1">switch</span><span class="k2">(</span>lastEvent.keyboard.keycode<span class="k2">)</span>
<span class="number">  5</span>    <span class="k2">{</span>
<span class="number">  6</span>    <span class="k1">case</span> ALLEGRO_KEY_RIGHT:
<span class="number">  7</span>      keyDown <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  8</span>      lastEvent.keyboard.keycode <span class="k3">=</span> ALLEGRO_KEY_RIGHT<span class="k2">;</span>
<span class="number">  9</span>      <span class="k1">if</span><span class="k2">(</span>Player::vel_X <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">10</span><span class="k2">)</span>Player::vel_X <span class="k3">+</span><span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 10</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>    <span class="k1">case</span> ALLEGRO_KEY_LEFT:
<span class="number"> 13</span>      keyDown <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 14</span>      lastEvent.keyboard.keycode <span class="k3">=</span> ALLEGRO_KEY_LEFT<span class="k2">;</span>
<span class="number"> 15</span>      <span class="k1">if</span><span class="k2">(</span>Player::vel_X <span class="k3">&gt;</span><span class="k3">=</span> <span class="k3">-</span><span class="n">10</span><span class="k2">)</span>Player::vel_X <span class="k3">-</span><span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 16</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 17</span>    <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">if</span><span class="k2">(</span>events-&gt;type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN <span class="k3">&amp;</span><span class="k3">&amp;</span> events-&gt;keyboard.keycode <span class="k3">!</span><span class="k3">=</span> ALLEGRO_KEY_UP <span class="k3">|</span><span class="k3">|</span> keyDown <span class="k3">=</span><span class="k3">=</span> <span class="k1">true</span><span class="k2">)</span>
<span class="number"> 21</span>  <span class="k2">{</span>
<span class="number"> 22</span>    <span class="k1">switch</span><span class="k2">(</span>events-&gt;keyboard.keycode<span class="k2">)</span>
<span class="number"> 23</span>    <span class="k2">{</span>
<span class="number"> 24</span>    <span class="k1">case</span> ALLEGRO_KEY_RIGHT:
<span class="number"> 25</span>      keyDown <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 26</span>      lastEvent.keyboard.keycode <span class="k3">=</span> ALLEGRO_KEY_RIGHT<span class="k2">;</span>
<span class="number"> 27</span>      <span class="k1">if</span><span class="k2">(</span>Player::vel_X <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">10</span><span class="k2">)</span>Player::vel_X <span class="k3">+</span><span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 28</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 29</span>
<span class="number"> 30</span>    <span class="k1">case</span> ALLEGRO_KEY_LEFT:
<span class="number"> 31</span>      keyDown <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 32</span>      lastEvent.keyboard.keycode <span class="k3">=</span> ALLEGRO_KEY_LEFT<span class="k2">;</span>
<span class="number"> 33</span>      <span class="k1">if</span><span class="k2">(</span>Player::vel_X <span class="k3">&gt;</span><span class="k3">=</span> <span class="k3">-</span><span class="n">10</span><span class="k2">)</span>Player::vel_X <span class="k3">-</span><span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 34</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 35</span>    <span class="k2">}</span><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>events-&gt;type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_UP <span class="k3">&amp;</span><span class="k3">&amp;</span> events-&gt;keyboard.keycode <span class="k3">!</span><span class="k3">=</span> ALLEGRO_KEY_UP<span class="k2">)</span> keyDown <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 38</span>  <span class="k1">if</span><span class="k2">(</span>events-&gt;type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN <span class="k3">&amp;</span><span class="k3">&amp;</span> events-&gt;keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_UP<span class="k2">)</span> Player::Jump<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</span><span class="k2">}</span>
</div></div><p> </p><p>What I did was I added <br />	bool keyDown;<br />	ALLEGRO_EVENT lastEvent; <br />in the Player.h</p><p>And stored the last keyboard keycode in lastEvent.</p><p>There is most likely a better way to do it <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gnamra)</author>
		<pubDate>Thu, 12 Apr 2012 22:17:38 +0000</pubDate>
	</item>
</rss>
