<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Is there a way to wait before drawing a bitmap in Allegro5?</title>
		<link>http://www.allegro.cc/forums/view/618491</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 05 Sep 2021 23:08:27 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m have two characters, one is playable and the second is not. A keyboard event changes the variable that draws the attack bitmaps of the playable character. Is there a way to wait before the variable of the second character is changed? They need to get triggered by the same keyboard event, but I don&#39;t want the bitmaps to be be drawn at the same time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (tylerchwz)</author>
		<pubDate>Mon, 30 Aug 2021 09:19:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m not any kind of game programming expert but I think something like this might work</p><p>Let&#39;s say it&#39;s ALLEGRO_KEY_ENTER that is the keyboard event that changes the variable that draws the attack bitmaps.</p><p>First, have one variable for each player.</p><p>Usually a switch is used for events so you might have something like</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="number">  2</span><span class="p">#define PLAYER_2_ATTACK_DELAY_TIME 500</span>
<span class="number">  3</span>
<span class="number">  4</span>
<span class="number">  5</span><span class="k1">bool</span> enter_key_pressed <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  6</span><a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a> <span class="k3">*</span>timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">60</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span><a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span><a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>queue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span> .... ......... ...
<span class="number"> 10</span>
<span class="number"> 11</span>
<span class="number"> 12</span>pseudo <span class="k2">:</span> have a main loop starting here <span class="k2">:</span>
<span class="number"> 13</span>
<span class="number"> 14</span><span class="c">/* pseudo : */</span>
<span class="number"> 15</span><span class="k1">while</span><span class="k2">(</span><span class="c">/*there's still events in the queue*/</span><span class="k2">)</span> 
<span class="number"> 16</span><span class="k2">{</span>
<span class="number"> 17</span>    <span class="k1">switch</span><span class="k2">(</span>event.type<span class="k2">)</span>
<span class="number"> 18</span>    <span class="k2">{</span>
<span class="number"> 19</span>       <span class="k1">case</span> ALLEGRO_KEYBOARD_EVENT:
<span class="number"> 20</span>           <span class="k1">switch</span><span class="k2">(</span>event.keyboard.keycode<span class="k2">)</span>
<span class="number"> 21</span>           <span class="k2">{</span>
<span class="number"> 22</span>               <span class="k1">case</span> ALLEGRO_KEY_ENTER:
<span class="number"> 23</span>                  <span class="c">//pseudo : change player one's variable</span>
<span class="number"> 24</span>                  enter_key_pressed <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 25</span>                  time_of_enter_keypress <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>timer<span class="k2">)</span><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="k2">}</span>
<span class="number"> 29</span>
<span class="number"> 30</span><span class="c">/* process input : */</span>
<span class="number"> 31</span>
<span class="number"> 32</span><span class="k1">if</span><span class="k2">(</span>enter_key_pressed <span class="k3">=</span><span class="k3">=</span> <span class="k1">true</span> <span class="k3">&amp;</span><span class="k3">&amp;</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>timer<span class="k2">)</span> <span class="k3">&gt;</span> time_of_enter_keypress <span class="k3">+</span> PLAYER_2_ATTACK_DELAY_TIME<span class="k2">)</span>
<span class="number"> 33</span><span class="k2">{</span>
<span class="number"> 34</span>   <span class="c">//pseudo : change player two's variable.</span>
<span class="number"> 35</span>
<span class="number"> 36</span><span class="k2">}</span> 
<span class="number"> 37</span>
<span class="number"> 38</span>pseudo <span class="k2">:</span> end of main loop <span class="k2">(</span>i.e. go back to the beginning<span class="k2">)</span>.
</div></div><p>

?</p><p>If you don&#39;t get the general idea, I can try to explain it better. It&#39;s not very well explained. I just thought you might get the right idea from it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Tue, 31 Aug 2021 00:16:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>this is the only way to do it. start a timer when you trigger an event, and process it afterward.</p><p>You can technically could track a timer using frames instead of real-world time. But if you don&#39;t understand basic timers yet, it&#39;s a waste of time [ha!] to explain and understand it.</p><p>Another problem is any time you <b>trigger a function</b> when someone presses a keyboard key, someone can simply press the key infinite times regardless of framerate. So if they have an autokey generator they can fire a gun infinitely, for example. [That&#39;s also how &quot;turbo&quot; controllers worked on old videogame systems] The solution is, instead of triggering a timer directly from a key, you separate key <i>sampling</i> from the <i>actions</i> of those keys into two different functions.</p><p>The proper way to sample keyboard is follows:
</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">//pseudo code. NOT REAL CODE.</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="k1">int</span> storedKeys<span class="k2">[</span><span class="n">256</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>oneFrameOfGame<span class="k2">(</span><span class="k2">)</span>
<span class="number">  6</span>   <span class="k2">{</span>
<span class="number">  7</span>   sampleKeys<span class="k2">(</span><span class="k2">)</span> <span class="c">//normal allegro key checks [see below]</span>
<span class="number">  8</span>   reactFromKeys<span class="k2">(</span><span class="k2">)</span> <span class="c">// react to those keys</span>
<span class="number">  9</span>   drawGame<span class="k2">(</span><span class="k2">)</span> <span class="c">// draw the game</span>
<span class="number"> 10</span>   <span class="c">//repeat</span>
<span class="number"> 11</span>   <span class="k2">}</span>
<span class="number"> 12</span>
<span class="number"> 13</span><span class="k1">void</span> sampleKeys<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 14</span> <span class="k2">{</span>
<span class="number"> 15</span> storedKeys<span class="k2">[</span><span class="n">0</span> to <span class="n">255</span><span class="k2">]</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="c">//reset values</span>
<span class="number"> 16</span>
<span class="number"> 17</span> <span class="c">//mark any keys that are down</span>
<span class="number"> 18</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_ESC<span class="k2">]</span><span class="k2">)</span>  storedKeys<span class="k2">[</span>KEY_ESC<span class="k2">]</span> <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> 
<span class="number"> 19</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>  storedKeys<span class="k2">[</span>KEY_UP<span class="k2">]</span> <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> 
<span class="number"> 20</span> <span class="c">//etc ...</span>
<span class="number"> 21</span> <span class="c">//or if using allegro 5 timers, this can be integrated into the Allegro 5 event function [see previous posters code].</span>
<span class="number"> 22</span> <span class="k2">}</span>
<span class="number"> 23</span>
<span class="number"> 24</span><span class="k1">void</span> reactFromKeys<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 25</span> <span class="k2">{</span>
<span class="number"> 26</span> <span class="k1">if</span><span class="k2">(</span>storedKeys<span class="k2">[</span>KEY_UP<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> <span class="k1">true</span><span class="k2">)</span>
<span class="number"> 27</span>    <span class="k2">{</span>
<span class="number"> 28</span>    moveCharacterUp<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//note here that moveCharacterUp can ONLY be called once per frame. It has been "decoupled" from the amount of times you pressed UP. It can only "react" once.</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="number"> 32</span><span class="k2">}</span>
</div></div><p>

This isn&#39;t just for preventing cheating, because this proper way also means anyone with different computer speeds will have the same speed and reactions in game. Without it, even if the game slows down in sections, the effects from the same keyboard inputs will change.</p><p>In the case of the previous posters code, you would mark a key press whenever it hits (in the allegro event code), and then <b>react</b> to it by starting the timer once during the proper game loop. You only want <b>reactions</b> to trigger once for a frame of game.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Tue, 31 Aug 2021 05:39:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Easiest way.</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_A<span class="k2">)</span> <span class="k2">{</span>
   t <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>

<span class="c">// in drawing code</span>

<span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> t <span class="k3">&lt;</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_128.html" target="_blank">delay</a><span class="k2">)</span> <span class="k2">{</span>
   draw_ai_a<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
<span class="k1">else</span> <span class="k2">{</span>
   draw_ai_b<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
All you need is a simple time counter.</p><p><b>EDIT</b><br />Easiestest way.
</p><div class="source-code snippet"><div class="inner"><pre>   draw_ai_a<span class="k2">(</span><span class="k2">)</span><span class="k2">;</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>
   <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">25</span><span class="k2">)</span><span class="k2">;</span>
   draw_ai_b<span class="k2">(</span><span class="k2">)</span><span class="k2">;</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>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 05 Sep 2021 23:08:27 +0000</pubDate>
	</item>
</rss>
