<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>keyboard event Switch Statement</title>
		<link>http://www.allegro.cc/forums/view/618801</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 31 Mar 2023 23:34:04 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>All,</p><p>I&#39;ve got a program that will react depending on which key is pressed (A~X).  Currently I&#39;m using a switch statement that reacts to 8 different keys.  I&#39;m wanting to expand that to 24.  Do I really need 24 case statements or is there a better / compact way of accomplishing this?</p><p>Thanks
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AceBlkwell)</author>
		<pubDate>Fri, 31 Mar 2023 18:59:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Using a switch statement with 24 case statements is a reasonable approach, especially if each key has a unique action associated with it. However, there might be more compact ways to achieve this, depending on your requirements.</p><p>One alternative is to use an array or a map to store the function pointers or objects representing the actions for each key. This solution works well if the actions can be easily represented as functions or objects and can generally make the code more manageable and potentially more extensible.</p><p>Here&#39;s an example using an array of function pointers:</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="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="c">// Define a function type for your key actions</span>
<span class="number">  4</span><span class="k1">typedef</span> <span class="k1">void</span> <span class="k2">(</span><span class="k3">*</span>KeyAction<span class="k2">)</span><span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="c">// Implement action functions for each key</span>
<span class="number">  7</span><span class="k1">void</span> actionA<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <span class="c">/* Do something for A key */</span> <span class="k2">}</span>
<span class="number">  8</span><span class="k1">void</span> actionB<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <span class="c">/* Do something for B key */</span> <span class="k2">}</span>
<span class="number">  9</span><span class="c">// ... (other actions)</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="c">// Create an array of function pointers</span>
<span class="number"> 12</span>KeyAction keyActions<span class="k2">[</span><span class="n">26</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span>actionA, actionB, <span class="c">/* ... other actions */</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 13</span>
<span class="number"> 14</span><span class="c">// In your event handling function</span>
<span class="number"> 15</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> event<span class="k2">;</span>
<span class="number"> 16</span><span class="c">// ... (get the event)</span>
<span class="number"> 17</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"> 18</span>    <span class="k1">int</span> keyCode <span class="k3">=</span> event.keyboard.keycode<span class="k2">;</span>
<span class="number"> 19</span>    <span class="k1">if</span> <span class="k2">(</span>keyCode <span class="k3">&gt;</span><span class="k3">=</span> ALLEGRO_KEY_A <span class="k3">&amp;</span><span class="k3">&amp;</span> keyCode <span class="k3">&lt;</span><span class="k3">=</span> ALLEGRO_KEY_Z<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 20</span>        <span class="c">// Call the appropriate action function from the array</span>
<span class="number"> 21</span>        <span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">=</span> keyCode <span class="k3">-</span> ALLEGRO_KEY_A<span class="k2">;</span>
<span class="number"> 22</span>        keyActions<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">]</span><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    <span class="k2">}</span>
<span class="number"> 24</span><span class="k2">}</span>
</div></div><p>

If you find that there&#39;s a pattern to the actions or if they share some common logic, you might be able to simplify the code further by creating a single function that handles multiple keys based on their attributes. In this case, you can still use a switch statement or if-else conditions to determine which group of keys was pressed and perform the appropriate action.</p><p>It&#39;s also essential to consider code readability and maintainability with any approach. While a more compact solution may save some lines of code, it&#39;s important to ensure that the code is still easy to understand and modify later on.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Fri, 31 Mar 2023 20:22:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks Matthew.  I&#39;ll give it a look, thanks <br />Currently the cases are the same except it sets a true condition based on an array index.  At the moment, I&#39;m using numbers instead of letters. 1~8.  So if I hit 2 then the case for ALLEGRO_KEY_2 will make Blocks[2].bFlipped = true.  If I figure out a way to use a variable for the array index then I could use a function to activate the correct .bFlipped and increment the other variables. </p><p>Thanks.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AceBlkwell)</author>
		<pubDate>Fri, 31 Mar 2023 20:36:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In that case, you could create a single function to handle the key press event and set the <span class="source-code">bFlipped</span> value in the <span class="source-code">Blocks</span> array. If you&#39;re using numeric keys (1-8) and want to expand it to letters (A-X), you can easily adjust the index calculation accordingly.</p><p>Here&#39;s an example of how you can update the <span class="source-code">bFlipped</span> value using a single function:</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="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="c">// Assuming you have a Blocks structure and an array</span>
<span class="number">  4</span><span class="k1">typedef</span> <span class="k1">struct</span> <span class="k2">{</span>
<span class="number">  5</span>    <span class="k1">bool</span> bFlipped<span class="k2">;</span>
<span class="number">  6</span>    <span class="c">// ... (other members)</span>
<span class="number">  7</span><span class="k2">}</span> Block<span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>Block Blocks<span class="k2">[</span><span class="n">24</span><span class="k2">]</span><span class="k2">;</span> <span class="c">// Array of blocks</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="c">// Key handling function</span>
<span class="number"> 12</span><span class="k1">void</span> handleKeyPress<span class="k2">(</span><span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 13</span>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">&lt;</span> <span class="n">24</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 14</span>        Blocks<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">]</span>.bFlipped <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 15</span>    <span class="k2">}</span>
<span class="number"> 16</span><span class="k2">}</span>
<span class="number"> 17</span>
<span class="number"> 18</span><span class="c">// In your event handling function</span>
<span class="number"> 19</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> event<span class="k2">;</span>
<span class="number"> 20</span><span class="c">// ... (get the event)</span>
<span class="number"> 21</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"> 22</span>    <span class="k1">int</span> keyCode <span class="k3">=</span> event.keyboard.keycode<span class="k2">;</span>
<span class="number"> 23</span>    
<span class="number"> 24</span>    <span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 25</span>    <span class="k1">if</span> <span class="k2">(</span>keyCode <span class="k3">&gt;</span><span class="k3">=</span> ALLEGRO_KEY_1 <span class="k3">&amp;</span><span class="k3">&amp;</span> keyCode <span class="k3">&lt;</span><span class="k3">=</span> ALLEGRO_KEY_8<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 26</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">=</span> keyCode <span class="k3">-</span> ALLEGRO_KEY_1<span class="k2">;</span>
<span class="number"> 27</span>    <span class="k2">}</span>
<span class="number"> 28</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>keyCode <span class="k3">&gt;</span><span class="k3">=</span> ALLEGRO_KEY_A <span class="k3">&amp;</span><span class="k3">&amp;</span> keyCode <span class="k3">&lt;</span><span class="k3">=</span> ALLEGRO_KEY_X<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 29</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">=</span> keyCode <span class="k3">-</span> ALLEGRO_KEY_A <span class="k3">+</span> <span class="n">8</span><span class="k2">;</span> <span class="c">// Adding 8 to account for numeric keys</span>
<span class="number"> 30</span>    <span class="k2">}</span>
<span class="number"> 31</span>
<span class="number"> 32</span>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">!</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 33</span>        handleKeyPress<span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>    <span class="k2">}</span>
<span class="number"> 35</span><span class="k2">}</span>
</div></div><p>

This should simplify the event handling code and make it easier to add or modify behavior based on the array index.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Fri, 31 Mar 2023 20:43:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks Matthew.  I did something similar.  First I&#39;m sorry for the confusion but I am replacing the 1~8 with A~X. Not adding to.   Right now I&#39;m just playing with different ideas to get a process figured out.  I started with 1~8 but expanded to 24 blocks and didn&#39;t want to figure out a way to do two digit numbers. </p><p>I went with ..
</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">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="number">  2</span>  <span class="k2">{</span>
<span class="number">  3</span>      iKey <span class="k3">=</span> event.keyboard.keycode-1<span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>    <span class="k1">if</span><span class="k2">(</span>event.keyboard.keycode <span class="k3">&gt;</span><span class="k3">=</span> ALLEGRO_KEY_A <span class="k3">&amp;</span><span class="k3">&amp;</span> event.keyboard.keycode <span class="k3">&lt;</span><span class="k3">=</span> ALLEGRO_KEY_X <span class="k2">)</span><span class="k2">{</span>
<span class="number">  6</span>       Blocks<span class="k2">[</span>iKey<span class="k2">]</span>.bFlipped <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  7</span>        <span class="k1">if</span><span class="k2">(</span>iChoiceCount <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> iFirstChoice <span class="k3">=</span> iKey<span class="k2">;</span>
<span class="number">  8</span>        <span class="k1">if</span><span class="k2">(</span>iChoiceCount <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> iSecondChoice <span class="k3">=</span> iKey<span class="k2">;</span>
<span class="number">  9</span>        iChoiceCount<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 10</span>    <span class="k2">}</span>  <span class="c">// end if for block choice</span>
<span class="number"> 11</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_ESCAPE<span class="k2">)</span>
<span class="number"> 12</span>      bQuit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
</div></div><p>

I had to add the iKey because I use the event.keyboard as an index and my array starts with 0.  Having event.keyboard.keycode -1 as an index seemed a little busy. <br />In case the goal seems odd, I&#39;m creating a rough draft of a concentration / match type game.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AceBlkwell)</author>
		<pubDate>Fri, 31 Mar 2023 23:34:04 +0000</pubDate>
	</item>
</rss>
