<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Key Delay And Turn-Based Movement</title>
		<link>http://www.allegro.cc/forums/view/606288</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 03 Feb 2011 10:06:48 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Before I start working with real-time sprite movement and timers, I decided to try something turn-based. So I programmed a simple set of functions to draw ASCII characters to the screen and am building a roguelike engine. But the main problem I keep running into is getting keyboard input. I can collect it just fine, the problem is that it&#39;s collected <i>way too fast</i>. Even tapping the key as lightly as possible detects two events at once! Is there a simple way to delay detection of key events?</p><p>Current game loop (The Draw functions near the bottom blit ASCII characters to the screen):
</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>game_is_running<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_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>event_queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span><span class="c">//if(ev.type == ALLEGRO_EVENT_TIMER)</span>
<span class="number">  5</span><span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_DOWN<span class="k2">]</span><span class="k2">)</span>
<span class="number">  6</span><span class="k2">{</span>
<span class="number">  7</span><span class="c">//Game.y++;</span>
<span class="number">  8</span>turn<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number">  9</span>y<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 10</span><span class="k2">}</span>
<span class="number"> 11</span><span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_UP<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 12</span><span class="k2">{</span>
<span class="number"> 13</span><span class="c">//Game.y--;</span>
<span class="number"> 14</span>turn<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 15</span>y--<span class="k2">;</span>
<span class="number"> 16</span><span class="k2">}</span>
<span class="number"> 17</span><span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_LEFT<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 18</span><span class="k2">{</span>
<span class="number"> 19</span><span class="c">//Game.x--;</span>
<span class="number"> 20</span>turn<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 21</span>x--<span class="k2">;</span>
<span class="number"> 22</span><span class="k2">}</span>
<span class="number"> 23</span><span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_RIGHT<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 24</span><span class="k2">{</span>
<span class="number"> 25</span><span class="c">//Game.x++;</span>
<span class="number"> 26</span>turn<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 27</span>x<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 28</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><span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span>
<span class="number"> 31</span><span class="k2">{</span>
<span class="number"> 32</span><span class="k1">break</span><span class="k2">;</span>
<span class="number"> 33</span><span class="k2">}</span>
<span class="number"> 34</span><span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN<span class="k2">)</span>
<span class="number"> 35</span><span class="k2">{</span>
<span class="number"> 36</span>         <span class="k1">switch</span><span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 37</span>            <span class="k1">case</span> ALLEGRO_KEY_UP:
<span class="number"> 38</span>               <a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_UP<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 39</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 40</span> 
<span class="number"> 41</span>            <span class="k1">case</span> ALLEGRO_KEY_DOWN:
<span class="number"> 42</span>               <a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_DOWN<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 43</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 44</span> 
<span class="number"> 45</span>            <span class="k1">case</span> ALLEGRO_KEY_LEFT: 
<span class="number"> 46</span>               <a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_LEFT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 47</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 48</span> 
<span class="number"> 49</span>            <span class="k1">case</span> ALLEGRO_KEY_RIGHT:
<span class="number"> 50</span>               <a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_RIGHT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 51</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 52</span>         <span class="k2">}</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>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_UP<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 55</span>         <span class="k1">switch</span><span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 56</span>            <span class="k1">case</span> ALLEGRO_KEY_UP:
<span class="number"> 57</span>               <a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_UP<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 58</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 59</span> 
<span class="number"> 60</span>            <span class="k1">case</span> ALLEGRO_KEY_DOWN:
<span class="number"> 61</span>               <a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_DOWN<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 62</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 63</span> 
<span class="number"> 64</span>            <span class="k1">case</span> ALLEGRO_KEY_LEFT: 
<span class="number"> 65</span>               <a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_LEFT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 66</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 67</span> 
<span class="number"> 68</span>            <span class="k1">case</span> ALLEGRO_KEY_RIGHT:
<span class="number"> 69</span>               <a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_RIGHT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 70</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 71</span> 
<span class="number"> 72</span>            <span class="k1">case</span> ALLEGRO_KEY_ESCAPE:
<span class="number"> 73</span>               game_is_running <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 74</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 75</span>         <span class="k2">}</span>
<span class="number"> 76</span><span class="k2">}</span>
<span class="number"> 77</span><span class="k1">if</span><span class="k2">(</span>redraw <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 78</span><span class="k2">{</span>
<span class="number"> 79</span>redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 80</span>
<span class="number"> 81</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"> 82</span>Win_Fill<span class="k2">(</span><span class="n">46</span>,Game,<span class="s">"green"</span>,<span class="s">"black"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 83</span>Draw_Char<span class="k2">(</span><span class="n">1</span>,Game,x,y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 84</span><span class="c">//Draw_Str("Main Deck, Sector 7",Game,0,0,"white","blue",0);</span>
<span class="number"> 85</span>Win_Box<span class="k2">(</span>Game,<span class="n">219</span>,<span class="s">"darkgrey"</span>,<span class="s">"blue"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 86</span>Win_Box<span class="k2">(</span>Info,<span class="n">219</span>,<span class="s">"darkgrey"</span>,<span class="s">"blue"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 87</span>Win_Box<span class="k2">(</span>Message,<span class="n">219</span>,<span class="s">"green"</span>,<span class="s">"blue"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 88</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_517.html" target="_blank">itoa</a><span class="k2">(</span>turn,yis,<span class="n">10</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 89</span>Draw_Str<span class="k2">(</span><span class="s">"Turn:"</span>,Info,<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="number"> 90</span>Draw_Str<span class="k2">(</span>yis,Info,<span class="n">5</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 91</span><span class="c">//Win_FillRand(Game);</span>
<span class="number"> 92</span><a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 93</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gatleos)</author>
		<pubDate>Thu, 03 Feb 2011 06:56:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s not your fault, but I&#39;m so tired of seeing people struggle with getting key input. Allegro 4 should have higher level input functions. You&#39;re welcome to use my <a href="http://www.allegro.cc/files/attachment/603297">keyboard_handler</a>.</p><p>It&#39;s use is simple. Call SetupKeyHandler() near the beginning of your program. In your logic loop, call UpdateKeyHandler(time_passed), and then use :
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span> <span class="k2">(</span>key_press<span class="k2">(</span>KEY_DOWN<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
   do_stuff<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

It also has support for key release, key holds, keys open, key double clicks, and key_held_for(duration) as well as extending allegro&#39;s key codes to support various combinations of SHIFT, CTRL, and ALT.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 03 Feb 2011 07:06:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>[EDIT]<br />Didn&#39;t see that the OP was using Allegro 5.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Thu, 03 Feb 2011 07:24:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Looks great! Where is KEY_MAX defined, though? I keep getting undefined errors.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gatleos)</author>
		<pubDate>Thu, 03 Feb 2011 07:49:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You confused me. Without scrolling down to see the rest of your code I thought you were using Allegro 4 because you are checking <span class="source-code"><span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_DOWN<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span><span class="c">/*...*/</span><span class="k2">}</span></span>. Now that I look further down, you are using Allegro 5 and are trying to emulate A4 with it. My keyboard_handler is for Allegro 4 only at this point.</p><p>So now, my advice is to drop use of your key array, and simply use the key press and release events that Allegro 5 provides for you. Ie... move the code for <span class="source-code"><span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>KEY_<span class="k3">*</span><span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>DoStuff<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span></span> into
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN<span class="k2">)</span>
<span class="k2">{</span>
         <span class="k1">switch</span><span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span> <span class="k2">{</span>
            <span class="k1">case</span> ALLEGRO_KEY_UP:
<span class="c">//               key[KEY_UP] = true;</span>
<div class="highlight">               DoStuff<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></div>
               <span class="k1">break</span><span class="k2">;</span>
</pre></div></div><p>

The problem is that an entry from your key array will be true for several logic loops at a time. It takes at least a certain amount of time between key press and key release.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 03 Feb 2011 07:58:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Someone <i>really</i> needs to update that input tutorial if it&#39;s using jury-rigged code like that. It works much better now. One more question: what about key holds, double-taps, etc.? Is there a separate event for that or will I just have to make them myself?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gatleos)</author>
		<pubDate>Thu, 03 Feb 2011 09:27:33 +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/606288/901743#target">Gatleos</a> said:</div><div class="quote"><p>
Someone really needs to update that input tutorial if it&#39;s using jury-rigged code like that.
</p></div></div><p>
What input tutorial? What&#39;s the link to it?</p><div class="quote_container"><div class="title">Gatleos said:</div><div class="quote"><p>
One more question: what about key holds, double-taps, etc.? Is there a separate event for that or will I just have to make them myself?
</p></div></div><p>
There aren&#39;t any separate events for those, you&#39;ll have to track the state yourself. If you got a key down event, but haven&#39;t received a key up event then you have a key hold. For double clicks, you&#39;ll have to track the time of the last key down event and compare it to the time of the new key down event that matches it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 03 Feb 2011 09:44:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><a href="http://wiki.allegro.cc/index.php?title=Allegro_5_Tutorial">This one on the wiki.</a></p><p>Anyway, thanks for the help! Keyboard input is a lot easier than it seemed with that odd emulation of Allegro 4 the tutorial was trying to pull off.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gatleos)</author>
		<pubDate>Thu, 03 Feb 2011 09:49: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/606288/901743#target">Gatleos</a> said:</div><div class="quote"><p>Someone really needs to update that input tutorial if it&#39;s using jury-rigged code like that. </p></div></div><p>The code there is really only for really basic input needs. Something that only needs to know if a key is pressed at any given time. Trying to show something more complex would probably just confuse things more.</p><p>I&#39;m open to a second Keyboard tutorial showing more advanced concepts though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Thu, 03 Feb 2011 10:02:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, it&#39;s odd that the <a href="http://wiki.allegro.cc/index.php?title=Allegro_5_Tutorial/Input">Allegro 5 Input Tutorial</a> uses a key array instead of checking the key state with the Allegro 5 functions <span class="source-code"><a href="http://www.allegro.cc/manual/al_get_keyboard_state"><span class="a">al_get_keyboard_state</span></a></span> and <span class="source-code"><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a></span>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 03 Feb 2011 10:05:06 +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/606288/901753#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>Yes, it&#39;s odd that the Allegro 5 Input Tutorial uses a key array instead of checking the key state with the Allegro 5 functions al_get_keyboard_state and al_key_down.</p></div></div><p>Not really. The keystate stuff is a dirty hack, imo worse than storing your own key array. Also its far less efficient. The tutorial only stores keys it needs, where as the keystate stuff stores all of them regardless. and copies them...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Thu, 03 Feb 2011 10:06:48 +0000</pubDate>
	</item>
</rss>
