<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[A5] multiple key events</title>
		<link>http://www.allegro.cc/forums/view/613062</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 04 Aug 2013 09:44:44 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I am working on my Allegro 5 game, which is coming along nicely, I am really loving the library.</p><p>I do have one &quot;problem&quot; which I am not sure there is a solution to, but I thought I would throw this out there and see if anyone has any ideas.</p><p>I had the same &quot;problem&quot; with Allegro 4.  It&#39;s not a library problem really though, at least I don&#39;t think so.</p><p>What happens in my Pacman style game is that a player can be moving along, say to the right in the maze.  They wish to turn up.  They get so wrapped up in the game and the ghosts chasing them that they forget to let go of the right cursor key and press UP key, so they have both keys pressed at the same time.  This is fairly common.  To their dismay, their character keeps going right and doesn&#39;t turn up at all and they end up dying and cursing the programmer.</p><p>I have tried to change how I code this, by clearing the key_pressed[] array when a new key is pressed and the player will then turn as expected, even with a new key pressed, but then the game won&#39;t respond to the right keypress until that key is released.  Now obviously they should have released it and I have advised against holding keys down as you don&#39;t need to hold a key down at all in my game, just tap the direction you wish to go then let go of the key and your character will happily travel in that direction unless told otherwise.  But is there a better solution to this do you think?  I haven&#39;t tested if this happens in other games yet.  Just thought I would throw this out there just in case there is something I am missing.</p><p>Thanks in advance.</p><p>Example code I use (edited to keep things brief)
</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="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>pacman.dead<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</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>event<span class="k2">)</span><span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span>   <span class="k1">if</span><span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  5</span>      done <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  6</span>   <span class="k2">}</span>
<span class="number">  7</span>
<span class="number">  8</span>   <span class="c">// check for key input and process it</span>
<span class="number">  9</span>   <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 10</span>      <a href="http://www.allegro.cc/manual/al_get_keyboard_state"><span class="a">al_get_keyboard_state</span></a><span class="k2">(</span><span class="k3">&amp;</span>keys<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>      <span class="k1">switch</span><span class="k2">(</span>event.keyboard.keycode<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 12</span>         <span class="k1">case</span> ALLEGRO_KEY_ESCAPE:
<span class="number"> 13</span>            <span class="c">// Do stuff for ESCAPE (removed for brevity)</span>
<span class="number"> 14</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 15</span>         default:
<span class="number"> 16</span>            pressed_key<span class="k2">[</span>event.keyboard.keycode<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 17</span>      <span class="k2">}</span>
<span class="number"> 18</span>   <span class="k2">}</span>
<span class="number"> 19</span>   <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_UP<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 20</span>      <a href="http://www.allegro.cc/manual/al_get_keyboard_state"><span class="a">al_get_keyboard_state</span></a><span class="k2">(</span><span class="k3">&amp;</span>keys<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>      pressed_key<span class="k2">[</span>event.keyboard.keycode<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 22</span>   <span class="k2">}</span>
<span class="number"> 23</span>
<span class="number"> 24</span>   <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 25</span>      <span class="k1">if</span><span class="k2">(</span>event.timer.source <span class="k3">=</span><span class="k3">=</span> pacman.timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 26</span>         redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 27</span>         redraw_timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_timer_count"><span class="a">al_get_timer_count</span></a><span class="k2">(</span>setting.redraw_timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>
<span class="number"> 29</span>         <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_UP<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 30</span>            <span class="c">// do stuff for up</span>
<span class="number"> 31</span>         <span class="k2">}</span>
<span class="number"> 32</span>         <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_DOWN<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 33</span>            <span class="c">// do stuff for down</span>
<span class="number"> 34</span>         <span class="k2">}</span>
<span class="number"> 35</span>         <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_LEFT<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 36</span>            <span class="c">// do stuff for left</span>
<span class="number"> 37</span>         <span class="k2">}</span>
<span class="number"> 38</span>         <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_RIGHT<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 39</span>            <span class="c">// do stuff for right</span>
<span class="number"> 40</span>         <span class="k2">}</span>
<span class="number"> 41</span>         <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_LCTRL<span class="k2">]</span> <span class="k3">|</span><span class="k3">|</span> pressed_key<span class="k2">[</span>ALLEGRO_KEY_RCTRL<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 42</span>            <span class="c">// do stuff for CTRL</span>
<span class="number"> 43</span>         <span class="k2">}</span>
<span class="number"> 44</span>         <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 45</span>            <span class="c">// do other stuff</span>
<span class="number"> 46</span>         <span class="k2">}</span>
<span class="number"> 47</span>         <span class="c">/*** CHEAT KEYS ***</span>
<span class="number"> 48</span><span class="c">            You don't want to know these :)</span>
<span class="number"> 49</span><span class="c">         */</span>
<span class="number"> 50</span>         <span class="k1">if</span><span class="k2">(</span>setting.cheat_mode<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 51</span>         <span class="k2">}</span>
<span class="number"> 52</span>
<span class="number"> 53</span>         <span class="c">// etc... </span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Roy)</author>
		<pubDate>Fri, 02 Aug 2013 03:28:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;d probably have a variable that can only hold 4 states, and the last direction key would set that state.  Otherwise, you might check out the <a href="https://www.allegro.cc/manual/5/ALLEGRO_EVENT">keyboard.timestamp</a> field to see which was pressed last.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Fri, 02 Aug 2013 03:56:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I modified your code to reflect Arthur&#39;s suggestion.</p><p>If you want to make it more advanced, you would check which directions are available, and if that key is pressed you allow pacman to move that direction (so if you press left and up and he can only move up, he still moves up)</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="c">//store the direction pacman is moving in</span>
<span class="number">  2</span><span class="k1">int</span> direction <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>done <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>pacman.dead<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  5</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>event<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>   <span class="k1">if</span><span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  8</span>      done <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  9</span>   <span class="k2">}</span>
<span class="number"> 10</span>
<span class="number"> 11</span>   <span class="c">// check for key input and process it</span>
<span class="number"> 12</span>   <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 13</span>      <a href="http://www.allegro.cc/manual/al_get_keyboard_state"><span class="a">al_get_keyboard_state</span></a><span class="k2">(</span><span class="k3">&amp;</span>keys<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>      <span class="k1">switch</span><span class="k2">(</span>event.keyboard.keycode<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 15</span>         <span class="k1">case</span> ALLEGRO_KEY_ESCAPE:
<span class="number"> 16</span>            <span class="c">// Do stuff for ESCAPE (removed for brevity)</span>
<span class="number"> 17</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 18</span>         default:
<span class="number"> 19</span>            pressed_key<span class="k2">[</span>event.keyboard.keycode<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 20</span>      <span class="k2">}</span>
<span class="number"> 21</span>   <span class="k2">}</span>
<span class="number"> 22</span>   <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_UP<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 23</span>      <a href="http://www.allegro.cc/manual/al_get_keyboard_state"><span class="a">al_get_keyboard_state</span></a><span class="k2">(</span><span class="k3">&amp;</span>keys<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>      pressed_key<span class="k2">[</span>event.keyboard.keycode<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 25</span>   <span class="k2">}</span>
<span class="number"> 26</span>
<span class="number"> 27</span>   <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 28</span>      <span class="k1">if</span><span class="k2">(</span>event.timer.source <span class="k3">=</span><span class="k3">=</span> pacman.timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 29</span>         redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 30</span>         redraw_timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_timer_count"><span class="a">al_get_timer_count</span></a><span class="k2">(</span>setting.redraw_timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>
<span class="number"> 32</span>         <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_UP<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 33</span>            direction <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 34</span>         <span class="k2">}</span><span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_DOWN<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 35</span>            direction <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 36</span>         <span class="k2">}</span><span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_LEFT<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 37</span>            direction <span class="k3">=</span> <span class="n">2</span><span class="k2">;</span>
<span class="number"> 38</span>         <span class="k2">}</span><span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_RIGHT<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 39</span>            direction <span class="k3">=</span> <span class="n">3</span><span class="k2">;</span>
<span class="number"> 40</span>         <span class="k2">}</span>
<span class="number"> 41</span>
<span class="number"> 42</span>         <span class="c">//changed to direction instead of key inputs</span>
<span class="number"> 43</span>         <span class="k1">if</span><span class="k2">(</span>direction<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 44</span>            <span class="c">// do stuff for up</span>
<span class="number"> 45</span>         <span class="k2">}</span>
<span class="number"> 46</span>         <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>direction<span class="k3">=</span><span class="k3">=</span><span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 47</span>            <span class="c">// do stuff for down</span>
<span class="number"> 48</span>         <span class="k2">}</span>
<span class="number"> 49</span>         <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>direction<span class="k3">=</span><span class="k3">=</span><span class="n">2</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 50</span>            <span class="c">// do stuff for left</span>
<span class="number"> 51</span>         <span class="k2">}</span>
<span class="number"> 52</span>         <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>direction<span class="k3">=</span><span class="k3">=</span><span class="n">3</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 53</span>            <span class="c">// do stuff for right</span>
<span class="number"> 54</span>         <span class="k2">}</span>
<span class="number"> 55</span>         <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_LCTRL<span class="k2">]</span> <span class="k3">|</span><span class="k3">|</span> pressed_key<span class="k2">[</span>ALLEGRO_KEY_RCTRL<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 56</span>            <span class="c">// do stuff for CTRL</span>
<span class="number"> 57</span>         <span class="k2">}</span>
<span class="number"> 58</span>         <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 59</span>            <span class="c">// do other stuff</span>
<span class="number"> 60</span>         <span class="k2">}</span>
<span class="number"> 61</span>         <span class="c">/*** CHEAT KEYS ***</span>
<span class="number"> 62</span><span class="c">            You don't want to know these :)</span>
<span class="number"> 63</span><span class="c">         */</span>
<span class="number"> 64</span>         <span class="k1">if</span><span class="k2">(</span>setting.cheat_mode<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 65</span>         <span class="k2">}</span>
<span class="number"> 66</span>
<span class="number"> 67</span>         <span class="c">// etc... </span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ph03nix)</author>
		<pubDate>Fri, 02 Aug 2013 04:09:07 +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/613062/988299#target">Arthur Kalliokoski</a> said:</div><div class="quote"><p>
I&#39;d probably have a variable that can only hold 4 states, and the last direction key would set that state.  Otherwise, you might check out the keyboard.timestamp field to see which was pressed last.
</p></div></div><p>

Oooh... that looks interesting. I&#39;m just not exactly sure how I would implement it.  Make a <span class="source-code"><span class="k1">struct</span></span> for the <span class="source-code">key_pressed<span class="k2">[</span><span class="k2">]</span></span> array perhaps which would include a member to store the time it was pressed perhaps... </p><p>Edit: ph03nix, I don&#39;t see how your code changes anything.</p><p>Edit2: Okay, fixed the problem!  Thanks for the great idea with the timestamp!  I remade my <span class="source-code">key_pressed<span class="k2">[</span><span class="k2">]</span></span> array so that it used a <span class="source-code"><span class="k1">struct</span></span> which included a <span class="source-code"><span class="k1">bool</span></span> for whether or not it was pressed and a <span class="source-code"><span class="k1">double</span></span> for the timestamp.</p><p>I then check the time for each direction and set a direction variable based on which key was pressed most recently and act accordingly...</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">double</span> timest <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number">  2</span>                  <span class="k1">short</span> dir <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span>                  <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_UP<span class="k2">]</span>.down<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  5</span>                     timest <span class="k3">=</span> pressed_key<span class="k2">[</span>ALLEGRO_KEY_UP<span class="k2">]</span>.<a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">;</span>
<span class="number">  6</span>                     dir <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  7</span>                  <span class="k2">}</span>
<span class="number">  8</span>                  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_DOWN<span class="k2">]</span>.down<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  9</span>                     <span class="k1">if</span><span class="k2">(</span>timest<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 10</span>                        timest <span class="k3">=</span> pressed_key<span class="k2">[</span>ALLEGRO_KEY_DOWN<span class="k2">]</span>.<a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">;</span>
<span class="number"> 11</span>                        dir <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 12</span>                     <span class="k2">}</span>
<span class="number"> 13</span>                     <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 14</span>                        <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_DOWN<span class="k2">]</span>.<a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span> timest<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 15</span>                           timest <span class="k3">=</span> pressed_key<span class="k2">[</span>ALLEGRO_KEY_DOWN<span class="k2">]</span>.<a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">;</span>
<span class="number"> 16</span>                           dir <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 17</span>                        <span class="k2">}</span>
<span class="number"> 18</span>                     <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>pressed_key<span class="k2">[</span>ALLEGRO_KEY_LEFT<span class="k2">]</span>.down<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 21</span>                     <span class="k1">if</span><span class="k2">(</span>timest<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 22</span>                        timest <span class="k3">=</span> pressed_key<span class="k2">[</span>ALLEGRO_KEY_LEFT<span class="k2">]</span>.<a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">;</span>
<span class="number"> 23</span>                        dir <span class="k3">=</span> <span class="n">3</span><span class="k2">;</span>
<span class="number"> 24</span>                     <span class="k2">}</span>
<span class="number"> 25</span>                     <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 26</span>                        <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_LEFT<span class="k2">]</span>.<a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span> timest<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 27</span>                           timest <span class="k3">=</span> pressed_key<span class="k2">[</span>ALLEGRO_KEY_LEFT<span class="k2">]</span>.<a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">;</span>
<span class="number"> 28</span>                           dir <span class="k3">=</span> <span class="n">3</span><span class="k2">;</span>
<span class="number"> 29</span>                        <span class="k2">}</span>
<span class="number"> 30</span>                     <span class="k2">}</span>
<span class="number"> 31</span>                  <span class="k2">}</span>
<span class="number"> 32</span>                  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_RIGHT<span class="k2">]</span>.down<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 33</span>                     <span class="k1">if</span><span class="k2">(</span>timest<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 34</span>                        timest <span class="k3">=</span> pressed_key<span class="k2">[</span>ALLEGRO_KEY_RIGHT<span class="k2">]</span>.<a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">;</span>
<span class="number"> 35</span>                        dir <span class="k3">=</span> <span class="n">4</span><span class="k2">;</span>
<span class="number"> 36</span>                     <span class="k2">}</span>
<span class="number"> 37</span>                     <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 38</span>                        <span class="k1">if</span><span class="k2">(</span>pressed_key<span class="k2">[</span>ALLEGRO_KEY_RIGHT<span class="k2">]</span>.<a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span> timest<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 39</span>                           timest <span class="k3">=</span> pressed_key<span class="k2">[</span>ALLEGRO_KEY_RIGHT<span class="k2">]</span>.<a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">;</span>
<span class="number"> 40</span>                           dir <span class="k3">=</span> <span class="n">4</span><span class="k2">;</span>
<span class="number"> 41</span>                        <span class="k2">}</span>
<span class="number"> 42</span>                     <span class="k2">}</span>
<span class="number"> 43</span>                  <span class="k2">}</span>
<span class="number"> 44</span>
<span class="number"> 45</span>                  <span class="k1">if</span><span class="k2">(</span>dir <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 46</span>                     <span class="c">// UP</span>
<span class="number"> 47</span>                  <span class="k2">}</span>
<span class="number"> 48</span>                  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>dir <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 49</span>                     <span class="c">// DOWN</span>
<span class="number"> 50</span>                  <span class="k2">}</span>
<span class="number"> 51</span>                  <span class="k1">if</span><span class="k2">(</span>dir <span class="k3">=</span><span class="k3">=</span> <span class="n">3</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 52</span>                     <span class="c">// LEFT</span>
<span class="number"> 53</span>                  <span class="k2">}</span>
<span class="number"> 54</span>                  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>dir <span class="k3">=</span><span class="k3">=</span> <span class="n">4</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 55</span>                     <span class="c">// RIGHT</span>
<span class="number"> 56</span>                  <span class="k2">}</span>
</div></div><p>

Thanks for the ideas. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Roy)</author>
		<pubDate>Fri, 02 Aug 2013 04:21:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sounds like these gentlemen have you sorted out, but do keep in mind that some keyboards won&#39;t correctly report multiple keypresses on the hardware level - I&#39;ve actually had one or two that report completely incorrect keys when the left and up arrows are pressed - so if anyone reports problems, make sure to rule out the keyboard they&#39;re using before you stress too much over your code. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Winfield)</author>
		<pubDate>Fri, 02 Aug 2013 22:13:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>could also just have a direction variable.. as Arthur was aluding to. With an enum for DIR_NORTH, DIR_SOUTH, etc.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 02 Aug 2013 22:54:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Actually, the direction code won&#39;t make a lick of difference because if I am pressing UP and LEFT at the same time, and it hits the code that tests for UP and finds it is pressed, it will set the direction to UP and ignore the other tests, which is what it is doing already.</p><p>With the timestamp it sets the time the key was pressed and then can respond to the most recent keypress.  I set a direction variable with the new code based on the most recent timestamp.</p><p>As for the keyboard problem, I&#39;ll keep that in mind, thanks.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Roy)</author>
		<pubDate>Fri, 02 Aug 2013 23:22:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You&#39;d set the direction variable when you get the key_down event, so it has the &quot;last key pressed&quot; functionality built in. no need to check a key array or key state.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 02 Aug 2013 23:29:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><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">case</span> ALLEGRO_EVENT_KEY_DOWN:
<span class="number">  2</span>        <span class="k2">{</span>
<span class="number">  3</span>          <span class="k1">int</span> k <span class="k3">=</span> event.keyboard.keycode<span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>          <span class="k1">if</span> <span class="k2">(</span>k <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_ESCAPE<span class="k2">)</span>
<span class="number">  6</span>          <span class="k2">{</span>
<span class="number">  7</span>            quit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  8</span>          <span class="k2">}</span>
<span class="number">  9</span>
<span class="number"> 10</span>          <span class="k1">else</span>
<span class="number"> 11</span>          <span class="k1">if</span><span class="k2">(</span> <span class="k2">(</span>k <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_UP<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>k <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_PAD_8<span class="k2">)</span> <span class="k2">)</span>
<span class="number"> 12</span>          <span class="k2">{</span>
<span class="number"> 13</span>            direction <span class="k3">=</span> NORTH<span class="k2">;</span>
<span class="number"> 14</span>          <span class="k2">}</span>
<span class="number"> 15</span>
<span class="number"> 16</span>          <span class="k1">else</span>
<span class="number"> 17</span>          <span class="k1">if</span><span class="k2">(</span> <span class="k2">(</span>k <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_LEFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>k <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_PAD_4<span class="k2">)</span> <span class="k2">)</span>
<span class="number"> 18</span>          <span class="k2">{</span>
<span class="number"> 19</span>            direction <span class="k3">=</span> WEST<span class="k2">;</span>
<span class="number"> 20</span>          <span class="k2">}</span>
<span class="number"> 21</span>
<span class="number"> 22</span>          <span class="k1">else</span>
<span class="number"> 23</span>          <span class="k1">if</span><span class="k2">(</span> <span class="k2">(</span>k <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_RIGHT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>k <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_PAD_6<span class="k2">)</span> <span class="k2">)</span>
<span class="number"> 24</span>          <span class="k2">{</span>
<span class="number"> 25</span>            direction <span class="k3">=</span> EAST<span class="k2">;</span>
<span class="number"> 26</span>          <span class="k2">}</span>
<span class="number"> 27</span>
<span class="number"> 28</span>          <span class="k1">else</span>
<span class="number"> 29</span>          <span class="k1">if</span><span class="k2">(</span> <span class="k2">(</span>k <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_DOWN<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>k <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_PAD_2<span class="k2">)</span> <span class="k2">)</span>
<span class="number"> 30</span>          <span class="k2">{</span>
<span class="number"> 31</span>            direction <span class="k3">=</span> SOUTH<span class="k2">;</span>
<span class="number"> 32</span>          <span class="k2">}</span>
<span class="number"> 33</span>
<span class="number"> 34</span>          key_array<span class="k2">[</span>k<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 35</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 36</span>        <span class="k2">}</span>
<span class="number"> 37</span>
<span class="number"> 38</span>        <span class="k1">case</span> ALLEGRO_EVENT_KEY_UP:
<span class="number"> 39</span>        <span class="k2">{</span>
<span class="number"> 40</span>          key_array<span class="k2">[</span>event.keyboard.keycode<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 41</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 42</span>        <span class="k2">}</span>
</div></div><p>

Bear in mind that you can have several different event loops, based on what you&#39;re doing (selecting from menus vs. playing the game, etc.).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Sat, 03 Aug 2013 00:28:18 +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/613062/988342#target">Thomas Fjellstrom</a> said:</div><div class="quote"><p>
You&#39;d set the direction variable when you get the key_down event, so it has the &quot;last key pressed&quot; functionality built in. no need to check a key array or key state.
</p></div></div><p>

Ah, okay, I see what you mean now.  The key array will hold the fact that both keys are pressed, where as the direction variable is a result of only the last key pressed.</p><p>I guess it&#39;s a result of rewriting old Allegro 4 code that brought this problem on in the first place.</p><p>I&#39;ll give that a go then.  I suppose had I started programming with Allegro 5 in the first place and never even seen Allegro 4 or earlier this is probably the way I would have went now that I think about it.</p><p>Thanks.<br />It looked the same to me when you first mentioned it, I couldn&#39;t understand where there was a difference until now. <b>D&#39;OH</b></p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/613062/988343#target">Arthur Kalliokoski</a> said:</div><div class="quote"><p>
Bear in mind that you can have several different event loops, based on what you&#39;re doing (selecting from menus vs. playing the game, etc.).
</p></div></div><p>

Thanks for that.  And I like your idea of adding the keypad, I think I&#39;ll add that as well, nice idea. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Roy)</author>
		<pubDate>Sun, 04 Aug 2013 09:44:44 +0000</pubDate>
	</item>
</rss>
