<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Keyboard input buffer.</title>
		<link>http://www.allegro.cc/forums/view/585162</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 17 May 2006 20:10:18 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello there. I&#39;ve developed a menu for a game. I&#39;m using the keyboard to interact with it. However the input speed is far too fast. Is there a way of buffering the input without cutting the actual timer speed down. I have a background being drawn which requires my set FPS. Obviously I need to turn this buffer off once the game is actually playing. Any suggetsions or ideas would help me greatly. I&#39;m thinking of some sort of loop but I know this would slow down the game speed.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Rob Johnson)</author>
		<pubDate>Wed, 17 May 2006 19:38:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Depends on what you&#39;re asking.</p><p>If it&#39;s &quot;how do I register each keypress only once?&quot;: just copy the key array to your own buffer and compare them when checking for a key press. If they&#39;re both the same, the key is being held down. If key[] is set but keybuf[] isn&#39;t, the key was just pressed. If it&#39;s the other way around, the key was just released.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">char</span> keybuf<span class="k2">[</span>KEY_MAX<span class="k2">]</span><span class="k2">;</span>

<span class="k1">void</span> check_input<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="k2">{</span>
 <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_A<span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>keybuf<span class="k2">[</span>KEY_A<span class="k2">]</span><span class="k2">)</span>
   do_something<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>

 <span class="c">//copy the key[] array to your own buffer</span>
 <a href="http://www.delorie.com/djgpp/doc/libc/libc_566.html" target="_blank">memcpy</a><span class="k2">(</span><span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span>keybuf, <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a>, <span class="k1">sizeof</span><span class="k2">(</span>keybuf<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

If it&#39;s &quot;how do I slow certain things down&quot;: set a counter which you decrement each cycle. When it&#39;s zero, the action may be taken again.</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#define NUMBER_OF_CYCLES 5</span>

<span class="k1">int</span> cooldown_key_a <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>

<span class="k1">void</span> check_input<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="k2">{</span>
 <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_A<span class="k2">]</span><span class="k2">)</span>
     <span class="k1">if</span> <span class="k2">(</span>cooldown_key_a <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
         do_something<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
         cooldown_key_a <span class="k3">=</span> NUMBER_OF_CYCLES<span class="k2">;</span>
        <span class="k2">}</span>
        
 cooldown_key_a--<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Code typed directly into the reply box, so YMMV.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Wed, 17 May 2006 19:54:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ah many thanks, especially for the super fast response. I think option two would be far easier for me to implement into this setup.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Rob Johnson)</author>
		<pubDate>Wed, 17 May 2006 20:04:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Another option would be:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/keypressed" target="_blank"><span class="a">keypressed</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="k2">{</span>
    k <span class="k3">=</span> <a href="http://www.allegro.cc/manual/readkey" target="_blank"><span class="a">readkey</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Wed, 17 May 2006 20:10:18 +0000</pubDate>
	</item>
</rss>
