<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Bad Input system in my code?</title>
		<link>http://www.allegro.cc/forums/view/573101</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 15 Mar 2006 23:49:17 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In my program there are a lot of computations. If the user presses &#39;q&#39; the program must quit. If the user presses &#39;r&#39; some stuff must be drawed and then pause before the compuations continue.<br />Here is my not-working code:<br />void run()<br /> {<br /> while(1)<br />  {<br />  do_sim();<br />  if(!user_input()) return;<br />  }<br /> }</p><p>void do_sim()<br /> {<br /> }</p><p>bool user_input()<br /> {<br /> if(keypressed())<br />  {<br />  char c=readkey()&amp;0xff;<br />  switch(c)<br />   {<br />   case &#39;q&#39;:return false;<br />   case &#39;r&#39;:/*here I draw some things*/break;<br />   default:break;<br />   }<br />  wait();//here I display everything on the screen<br />  }<br /> return true;<br /> }</p><p>void wait()<br /> {<br /> while(!key[KEY_ESC])<br />  blit(buffer,screen,0,0,0,0,1024,768);<br /> }
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Zdravko)</author>
		<pubDate>Wed, 15 Mar 2006 23:22:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If I was you, I would clean up your code at first. Separate your drawing functions from your key input functions. Maybe the problem solves itself after that ... <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>[EDIT]<br />Indentation would help a lot, too.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Faerber)</author>
		<pubDate>Wed, 15 Mar 2006 23:44:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Please use code tags next time. That&#39;s pretty difficult to read as is.</p><p>Anyways, I would suggest you change your input to be more like this:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">// input</span></td></tr><tr><td class="number">2</td><td>  <span class="k1">while</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> </td></tr><tr><td class="number">3</td><td>  <span class="k2">{</span> <span class="c">// while there are keypresses left in the buffer...</span></td></tr><tr><td class="number">4</td><td>    <span class="k1">switch</span> <span class="k2">(</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="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">8</span><span class="k2">)</span> </td></tr><tr><td class="number">5</td><td>    <span class="k2">{</span> <span class="c">// readkey automatically has that pause and keyboard</span></td></tr><tr><td class="number">6</td><td>      <span class="c">// repeat...which is handy when used to toggle things</span></td></tr><tr><td class="number">7</td><td>      <span class="k1">case</span> KEY_Q:</td></tr><tr><td class="number">8</td><td>        bQuitVar <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span> <span class="c">// set the quit variable.</span></td></tr><tr><td class="number">9</td><td>        <span class="c">// when the quit variable is true, our main loop</span></td></tr><tr><td class="number">10</td><td>        <span class="c">// should break lose and exit the program.</span></td></tr><tr><td class="number">11</td><td>      <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>      <span class="k1">case</span> KEY_R:</td></tr><tr><td class="number">14</td><td>        do_pause<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>      <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>      <span class="c">// whatever else keyboard input you want that</span></td></tr><tr><td class="number">18</td><td>      <span class="c">// follows the keypress and repeat input type</span></td></tr><tr><td class="number">19</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">20</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td><span class="c">// pause function</span></td></tr><tr><td class="number">24</td><td><span class="k1">void</span> do_pause<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">25</td><td><span class="k2">{</span></td></tr><tr><td class="number">26</td><td><span class="c">// notice we display the buffer BEFORE our pause while-loop.</span></td></tr><tr><td class="number">27</td><td><span class="c">// if the appearance of the screen will not change during pause</span></td></tr><tr><td class="number">28</td><td><span class="c">// then there is no need to constantly push the buffer onto screen.</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td>  <span class="c">/* put the "Other" stuff you said you wanted to draw here... */</span></td></tr><tr><td class="number">31</td><td>&#160;</td></tr><tr><td class="number">32</td><td>  <a href="http://www.allegro.cc/manual/textout_ex" target="_blank"><span class="a">textout_ex</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="s">"Game paused. Press R to continue."</span>, <span class="n">16</span>, <span class="n">16</span>, <span class="n">0xFFFFFF</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>  <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, buffer-&gt;w, buffer-&gt;h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td>  <span class="k1">while</span><span class="k2">(</span> <span class="n">1</span> <span class="k2">)</span></td></tr><tr><td class="number">36</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">37</td><td>    <span class="c">// so we aren't doing 19 billion repetetions a second...</span></td></tr><tr><td class="number">38</td><td>    <span class="c">// and wasting processor time</span></td></tr><tr><td class="number">39</td><td>    <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>    </td></tr><tr><td class="number">41</td><td>    <span class="c">// update keyboard information</span></td></tr><tr><td class="number">42</td><td>    <span class="k1">if</span><span class="k2">(</span> <a href="http://www.allegro.cc/manual/keyboard_needs_poll" target="_blank"><span class="a">keyboard_needs_poll</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k2">)</span></td></tr><tr><td class="number">43</td><td>      <a href="http://www.allegro.cc/manual/poll_keyboard" target="_blank"><span class="a">poll_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>    </td></tr><tr><td class="number">45</td><td>    <span class="c">// clear keyboard input and</span></td></tr><tr><td class="number">46</td><td>    <span class="c">// break from our infanite loop</span></td></tr><tr><td class="number">47</td><td>    <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_R<span class="k2">]</span> <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">48</td><td>      <a href="http://www.allegro.cc/manual/clear_keybuf" target="_blank"><span class="a">clear_keybuf</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>      <span class="k1">break</span><span class="k2">;</span> <span class="k2">}</span></td></tr><tr><td class="number">50</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">51</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>


I haven&#39;t actually tested this code, but it should work. I&#39;ve written similar code to this for doing pause screens (with embedded menus even), so the idea behind it works, though there might be a bug here or there. I hope this helps you in some way.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elverion)</author>
		<pubDate>Wed, 15 Mar 2006 23:49:17 +0000</pubDate>
	</item>
</rss>
