<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[A5] How to implement smooth tile based movement</title>
		<link>http://www.allegro.cc/forums/view/617918</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 15 Sep 2019 10:52:59 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi, I&#39;ve been searching for a good way to implement smooth tile based movement to my Snake game. For now I&#39;m using something along those lines:</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">void</span> UpdateSnake<span class="k2">(</span>Snake <span class="k3">*</span>snake, <span class="k1">float</span> timeStep<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <span class="k1">if</span> <span class="k2">(</span>snake-&gt;animationTime <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span>
<span class="number">  4</span>  <span class="k2">{</span>
<span class="number">  5</span>    snake-&gt;animationOrigin.x <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.x <span class="k3">/</span> CELL_SIZE<span class="k2">)</span> <span class="k3">*</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  6</span>    snake-&gt;animationOrigin.y <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.y <span class="k3">/</span> CELL_SIZE<span class="k2">)</span> <span class="k3">*</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  7</span>  <span class="k2">}</span>
<span class="number">  8</span>
<span class="number">  9</span>  snake-&gt;animationTime <span class="k3">+</span><span class="k3">=</span> timeStep<span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>  <span class="k1">float</span> f <span class="k3">=</span> snake-&gt;animationTime <span class="k3">*</span> snakeSpeed<span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span>  <span class="k1">if</span> <span class="k2">(</span>f <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span>
<span class="number"> 14</span>  <span class="k2">{</span>
<span class="number"> 15</span>    snake-&gt;animationTime <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 16</span>    f <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 17</span>    pressSignal <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 18</span>  <span class="k2">}</span>
<span class="number"> 19</span>
<span class="number"> 20</span>  <span class="k1">if</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">3</span><span class="k2">)</span> <span class="c">//RIGHT</span>
<span class="number"> 21</span>  <span class="k2">{</span>
<span class="number"> 22</span>    snake-&gt;animationDestination.x <span class="k3">=</span> snake-&gt;animationOrigin.x <span class="k3">+</span> CELL_SIZE<span class="k2">;</span>
<span class="number"> 23</span>    snake-&gt;animationDestination.y <span class="k3">=</span> snake-&gt;animationOrigin.y<span class="k2">;</span>
<span class="number"> 24</span>  <span class="k2">}</span>
<span class="number"> 25</span>  
<span class="number"> 26</span>  <span class="k1">if</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span> <span class="c">//LEFT</span>
<span class="number"> 27</span>  <span class="k2">{</span>
<span class="number"> 28</span>    snake-&gt;animationDestination.x <span class="k3">=</span> snake-&gt;animationOrigin.x <span class="k3">-</span> CELL_SIZE<span class="k2">;</span>
<span class="number"> 29</span>    snake-&gt;animationDestination.y <span class="k3">=</span> snake-&gt;animationOrigin.y<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="k1">if</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="c">//UP</span>
<span class="number"> 33</span>  <span class="k2">{</span>
<span class="number"> 34</span>    snake-&gt;animationDestination.x <span class="k3">=</span> snake-&gt;animationOrigin.x<span class="k2">;</span>
<span class="number"> 35</span>    snake-&gt;animationDestination.y <span class="k3">=</span> snake-&gt;animationOrigin.y <span class="k3">-</span> CELL_SIZE<span class="k2">;</span>
<span class="number"> 36</span>  <span class="k2">}</span>
<span class="number"> 37</span>
<span class="number"> 38</span>  <span class="k1">if</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="c">//DOWN</span>
<span class="number"> 39</span>  <span class="k2">{</span>
<span class="number"> 40</span>    snake-&gt;animationDestination.x <span class="k3">=</span> snake-&gt;animationOrigin.x<span class="k2">;</span>
<span class="number"> 41</span>    snake-&gt;animationDestination.y <span class="k3">=</span> snake-&gt;animationOrigin.y <span class="k3">+</span> CELL_SIZE<span class="k2">;</span>
<span class="number"> 42</span>  <span class="k2">}</span>
<span class="number"> 43</span>
<span class="number"> 44</span>  snake-&gt;head-&gt;position.x <span class="k3">=</span> Lerp<span class="k2">(</span>snake-&gt;animationOrigin.x, snake-&gt;animationDestination.x, f<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 45</span>  snake-&gt;head-&gt;position.y <span class="k3">=</span> Lerp<span class="k2">(</span>snake-&gt;animationOrigin.y, snake-&gt;animationDestination.y, f<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 46</span><span class="k2">}</span>
</div></div><p>

It seems like this method is not very efficient and the movement might be jerky, at least for me. <br />It would be great if someone could provide some examples of good way to implement it.</p><p><a href="https://www.allegro.cc/files/attachment/612139">Source code</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (wixy00)</author>
		<pubDate>Thu, 05 Sep 2019 12:49:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve tried your game on my PC and printing out the f values (defined on line 11) during the game loop it becomes apparent that the value of f is set abruptly to 1.00 ever so often.<br />I would not use Lerp for calculating the position as this would interpolate between two fixed points (and void any &#39;surplus&#39; movement that definitively appears). <br />I&#39;ll try to explain by example. If your rectangle is moving by steps of 0.3 (f=0.3) then you are getting this:<br />step1:  0.0<br />step2:  0.3<br />step3:  0.6<br />step4:  0.9<br />step5:  1.0 (when in fact the rectangle should be moved beyond the Lerp range by 0.2).</p><p>So in fact by setting the f to 1 (in cases when it should be larger than this) you are instructing the rectangle to sort of pause at certain points and this is what breaks the smooth movement.</p><p>I hope this helps. If I was to program this movement I would simply multiply the direction by time elapsed, add this to the actual position and do a kind of line sweep between the old and the new position to determine which tiles I have moved over (for cases where the snake would cross multiple tiles in a single game loop step) so these tiles could be added to the snake&#39;s tail.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (MikiZX)</author>
		<pubDate>Thu, 05 Sep 2019 14:36:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m not sure if I understand your idea correctly but wouldn&#39;t movement not be aligned to the grid then? By interpolating between two fixed points I&#39;m sure that it will be aligned properly.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (wixy00)</author>
		<pubDate>Fri, 06 Sep 2019 00:59:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I see your point. The possible solution to this that I can see, while keeping the Lerp, is to keep any eventual value, of &#39;f&#39; variable, above the 1.0 in a new variable and include this new variable in the next f value calculation that will occur (at next step of game loop)?</p><p>Possibly something like this:
</p><div class="source-code snippet"><div class="inner"><pre>  <span class="k1">float</span> f <span class="k3">=</span> old_f_value<span class="k3">+</span>snake-&gt;animationTime <span class="k3">*</span> snakeSpeed<span class="k2">;</span>

  <span class="k1">if</span> <span class="k2">(</span>f <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span>
  <span class="k2">{</span>
    snake-&gt;animationTime <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
    old_f_value<span class="k3">=</span>f-1.0f<span class="k2">;</span>
    f <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">;</span>
    pressSignal <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
  <span class="k2">}</span>
  <span class="k1">else</span>
  <span class="k2">{</span>
  old_f_value<span class="k3">=</span><span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
  <span class="k2">}</span>
</pre></div></div><p>

p.s. Sorry, I have not tested this yet so no guarantee it works.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (MikiZX)</author>
		<pubDate>Fri, 06 Sep 2019 01:40:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So I tried your method and now movement is actually more choppier than before.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (wixy00)</author>
		<pubDate>Fri, 06 Sep 2019 01:52:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sorry to hear that. Bump from my end then.. <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (MikiZX)</author>
		<pubDate>Fri, 06 Sep 2019 13:07:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Think about what you&#39;re actually doing. Clipping &#39;f&#39; is essentially setting a maximum speed.</p><p>And then interpolating between the current tile and the next is effectively limiting the speed to one tile per update.</p><p>You should be able to animate anything with any time delta, simply based on the snake speed.</p><p>Drop the lerp, and drop the 1 tile per frame limit and set it to the snake speed.</p><p>Then adjust your collision detection to use a sweep check as advised above. This is easy because you&#39;re sweeping an AABB along an axis, so it remains an AABB. And it&#39;s only in one direction so calculating the intercept time with an object rectangle like the snake&#39;s food or body segments is easy.</p><p>Just a note, in  the original snake game, it starts off very slow and gradually increases speed. As well, the snake gains a body segment for every fruit or two or three that it eats. So the game is still slightly incomplete at this point.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 06 Sep 2019 13:07:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This problem got me interested enough to write the movement function myself. It works OK though it is probably not the most elegant way of making this work. If you with to try it, the function is:</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">unsigned</span> <span class="k1">char</span> old_direction<span class="k2">;</span>
<span class="number">   2</span>
<span class="number">   3</span><span class="k1">void</span> UpdateSnake<span class="k2">(</span>Snake <span class="k3">*</span>snake, <span class="k1">float</span> timeStep<span class="k2">)</span>
<span class="number">   4</span><span class="k2">{</span>
<span class="number">   5</span>
<span class="number">   6</span>  <span class="k1">float</span> f <span class="k3">=</span> timeStep <span class="k3">*</span> snakeSpeed<span class="k2">;</span>
<span class="number">   7</span>
<span class="number">   8</span>  snake-&gt;animationOrigin.x <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.x- <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.x%CELL_SIZE<span class="k2">;</span>
<span class="number">   9</span>  snake-&gt;animationOrigin.y <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.y- <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.y% CELL_SIZE<span class="k2">;</span>
<span class="number">  10</span>
<span class="number">  11</span>  <span class="c">// process fast movement in 1 tile increments (collision detection sweep)</span>
<span class="number">  12</span>  <span class="k1">while</span> <span class="k2">(</span>f <span class="k3">&gt;</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span>
<span class="number">  13</span>  <span class="k2">{</span>
<span class="number">  14</span>
<span class="number">  15</span>    <span class="k1">if</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">3</span><span class="k2">)</span> <span class="c">//RIGHT</span>
<span class="number">  16</span>    <span class="k2">{</span>
<span class="number">  17</span>      snake-&gt;head-&gt;position.x <span class="k3">+</span><span class="k3">=</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  18</span>    <span class="k2">}</span>
<span class="number">  19</span>  
<span class="number">  20</span>    <span class="k1">if</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span> <span class="c">//LEFT</span>
<span class="number">  21</span>    <span class="k2">{</span>
<span class="number">  22</span>      snake-&gt;head-&gt;position.x <span class="k3">-</span><span class="k3">=</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  23</span>    <span class="k2">}</span>
<span class="number">  24</span>
<span class="number">  25</span>    <span class="k1">if</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="c">//UP</span>
<span class="number">  26</span>    <span class="k2">{</span>
<span class="number">  27</span>      snake-&gt;head-&gt;position.y <span class="k3">-</span><span class="k3">=</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  28</span>    <span class="k2">}</span>
<span class="number">  29</span>
<span class="number">  30</span>    <span class="k1">if</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="c">//DOWN</span>
<span class="number">  31</span>    <span class="k2">{</span>
<span class="number">  32</span>      snake-&gt;head-&gt;position.y <span class="k3">+</span><span class="k3">=</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  33</span>    <span class="k2">}</span>
<span class="number">  34</span>
<span class="number">  35</span>    <span class="c">// do collision test here (head-fruit &amp; head-tail)</span>
<span class="number">  36</span>    <span class="c">// do collision test here (head-fruit &amp; head-tail)</span>
<span class="number">  37</span>    <span class="c">// do collision test here (head-fruit &amp; head-tail)</span>
<span class="number">  38</span>
<span class="number">  39</span>    f <span class="k3">-</span><span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  40</span>
<span class="number">  41</span>  <span class="k2">}</span>
<span class="number">  42</span>
<span class="number">  43</span>  <span class="c">// process remainder of the movement (the sub-tile movement)</span>
<span class="number">  44</span>  <span class="k1">if</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">3</span><span class="k2">)</span> <span class="c">//RIGHT</span>
<span class="number">  45</span>  <span class="k2">{</span>
<span class="number">  46</span>    snake-&gt;head-&gt;position.x <span class="k3">+</span><span class="k3">=</span> f<span class="k3">*</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  47</span>  <span class="k2">}</span>
<span class="number">  48</span>
<span class="number">  49</span>  <span class="k1">if</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span> <span class="c">//LEFT</span>
<span class="number">  50</span>  <span class="k2">{</span>
<span class="number">  51</span>    snake-&gt;head-&gt;position.x <span class="k3">-</span><span class="k3">=</span> f<span class="k3">*</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  52</span>  <span class="k2">}</span>
<span class="number">  53</span>
<span class="number">  54</span>  <span class="k1">if</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="c">//UP</span>
<span class="number">  55</span>  <span class="k2">{</span>
<span class="number">  56</span>    snake-&gt;head-&gt;position.y <span class="k3">-</span><span class="k3">=</span> f<span class="k3">*</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  57</span>
<span class="number">  58</span>  <span class="k2">}</span>
<span class="number">  59</span>  <span class="k1">if</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="c">//DOWN</span>
<span class="number">  60</span>  <span class="k2">{</span>
<span class="number">  61</span>    snake-&gt;head-&gt;position.y <span class="k3">+</span><span class="k3">=</span> f<span class="k3">*</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  62</span>  <span class="k2">}</span>
<span class="number">  63</span>
<span class="number">  64</span>  <span class="k1">float</span> temp_x, temp_y<span class="k2">;</span>
<span class="number">  65</span>  temp_x <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.x <span class="k3">-</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.x%CELL_SIZE<span class="k2">;</span>
<span class="number">  66</span>  temp_y <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.y <span class="k3">-</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.y% CELL_SIZE<span class="k2">;</span>
<span class="number">  67</span>
<span class="number">  68</span>  <span class="c">// align to grid</span>
<span class="number">  69</span>  <span class="k1">if</span> <span class="k2">(</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">3</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  70</span>    <span class="k1">if</span> <span class="k2">(</span>old_direction <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>
<span class="number">  71</span>    <span class="k2">{</span>
<span class="number">  72</span>    <span class="k1">if</span> <span class="k2">(</span>snake-&gt;head-&gt;position.y&gt; temp_y <span class="k3">+</span>CELL_SIZE<span class="k3">/</span><span class="n">2</span><span class="k2">)</span>
<span class="number">  73</span>      snake-&gt;head-&gt;position.y <span class="k3">=</span> temp_y <span class="k3">+</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  74</span>    <span class="k1">else</span>
<span class="number">  75</span>      snake-&gt;head-&gt;position.y <span class="k3">=</span> temp_y<span class="k2">;</span>
<span class="number">  76</span>    <span class="k2">}</span>
<span class="number">  77</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>old_direction <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number">  78</span>    <span class="k2">{</span>
<span class="number">  79</span>    <span class="k1">if</span> <span class="k2">(</span>snake-&gt;head-&gt;position.y<span class="k3">&lt;</span>temp_y <span class="k3">+</span> CELL_SIZE <span class="k3">/</span> <span class="n">2</span><span class="k2">)</span>
<span class="number">  80</span>      snake-&gt;head-&gt;position.y <span class="k3">=</span> temp_y <span class="k2">;</span>
<span class="number">  81</span>    <span class="k1">else</span>
<span class="number">  82</span>      snake-&gt;head-&gt;position.y <span class="k3">=</span> temp_y <span class="k3">+</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  83</span>    <span class="k2">}</span>
<span class="number">  84</span>
<span class="number">  85</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  86</span>    <span class="k1">if</span> <span class="k2">(</span>old_direction <span class="k3">=</span><span class="k3">=</span> <span class="n">3</span><span class="k2">)</span>
<span class="number">  87</span>    <span class="k2">{</span>
<span class="number">  88</span>      <span class="k1">if</span> <span class="k2">(</span>snake-&gt;head-&gt;position.x<span class="k3">&lt;</span>temp_x <span class="k3">-</span> CELL_SIZE <span class="k3">/</span> <span class="n">2</span><span class="k2">)</span>
<span class="number">  89</span>        snake-&gt;head-&gt;position.x <span class="k3">=</span> temp_x <span class="k3">-</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  90</span>      <span class="k1">else</span>
<span class="number">  91</span>        snake-&gt;head-&gt;position.x <span class="k3">=</span> temp_x <span class="k2">;</span>
<span class="number">  92</span>    <span class="k2">}</span>
<span class="number">  93</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>old_direction <span class="k3">=</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span>
<span class="number">  94</span>    <span class="k2">{</span>
<span class="number">  95</span>      <span class="k1">if</span> <span class="k2">(</span>snake-&gt;head-&gt;position.x&gt;temp_x <span class="k3">+</span> CELL_SIZE <span class="k3">/</span> <span class="n">2</span><span class="k2">)</span>
<span class="number">  96</span>        snake-&gt;head-&gt;position.x <span class="k3">=</span> temp_x <span class="k3">+</span> CELL_SIZE<span class="k2">;</span>
<span class="number">  97</span>      <span class="k1">else</span>
<span class="number">  98</span>        snake-&gt;head-&gt;position.x <span class="k3">=</span> temp_x <span class="k2">;</span>
<span class="number">  99</span>    <span class="k2">}</span>
<span class="number"> 100</span>
<span class="number"> 101</span>  <span class="c">// do collision test here (head-fruit &amp; head-tail)</span>
<span class="number"> 102</span>  <span class="c">// do collision test here (head-fruit &amp; head-tail)</span>
<span class="number"> 103</span>  <span class="c">// do collision test here (head-fruit &amp; head-tail)</span>
<span class="number"> 104</span>
<span class="number"> 105</span>  snake-&gt;animationDestination.x <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.x <span class="k3">-</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.x%CELL_SIZE<span class="k2">;</span>
<span class="number"> 106</span>  snake-&gt;animationDestination.y <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.y <span class="k3">-</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>snake-&gt;head-&gt;position.y%CELL_SIZE<span class="k2">;</span>
<span class="number"> 107</span>
<span class="number"> 108</span>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a><span class="k2">(</span>snake-&gt;animationDestination.x <span class="k3">-</span> snake-&gt;animationOrigin.x<span class="k2">)</span> <span class="k3">&gt;</span><span class="k3">=</span> CELL_SIZE<span class="k2">)</span> pressSignal <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 109</span>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a><span class="k2">(</span>snake-&gt;animationDestination.y <span class="k3">-</span> snake-&gt;animationOrigin.y<span class="k2">)</span> <span class="k3">&gt;</span><span class="k3">=</span> CELL_SIZE<span class="k2">)</span> pressSignal <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 110</span>
<span class="number"> 111</span>  old_direction<span class="k3">=</span>direction<span class="k2">;</span>
<span class="number"> 112</span>  
<span class="number"> 113</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (MikiZX)</author>
		<pubDate>Fri, 06 Sep 2019 21:35:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s a lot of code to do such a simple thing....</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">int</span> dx <span class="k3">=</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span>?<span class="n">1</span><span class="k2">:</span><span class="k2">(</span><span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">3</span><span class="k2">)</span>?<span class="k3">-</span><span class="n">1</span><span class="k2">:</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  2</span><span class="k1">int</span> dy <span class="k3">=</span> <span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>?<span class="n">1</span><span class="k2">:</span><span class="k2">(</span><span class="k2">(</span>direction <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>?<span class="k3">-</span><span class="n">1</span><span class="k2">:</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span>Rectangle srect <span class="k3">=</span> snake_rect.sweep<span class="k2">(</span>dt<span class="k3">*</span>snake_speed<span class="k3">*</span>dx , dt<span class="k3">*</span>snake_speed<span class="k3">*</span>dy<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span><span class="k1">if</span> <span class="k2">(</span>srect.collides_with<span class="k2">(</span>fruit_rect<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  6</span>   score <span class="k3">+</span><span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  7</span><span class="k2">}</span>
<span class="number">  8</span><span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>...<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  9</span>   <span class="c">/// Handle edges</span>
<span class="number"> 10</span><span class="k2">}</span>
<span class="number"> 11</span><span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>...<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 12</span>   <span class="c">/// Handle snake body segments</span>
<span class="number"> 13</span><span class="k2">}</span>
<span class="number"> 14</span><span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 15</span>   <span class="c">/// Update normally</span>
<span class="number"> 16</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 06 Sep 2019 21:57:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Could you tell me what should I search to get more information about this method? It would be nice to understand your code <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (wixy00)</author>
		<pubDate>Fri, 06 Sep 2019 23:26:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sure, let me demystify it a little bit.</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">enum</span> DIRECTION <span class="k2">{</span>
<span class="number">  2</span>   DOWN <span class="k3">=</span> <span class="n">0</span>,
<span class="number">  3</span>   UP <span class="k3">=</span> <span class="n">1</span>,
<span class="number">  4</span>   LEFT <span class="k3">=</span> <span class="n">2</span>,
<span class="number">  5</span>   RIGHT <span class="k3">=</span> <span class="n">3</span>
<span class="number">  6</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">struct</span> DXY <span class="k2">{</span>
<span class="number">  9</span>   <span class="k1">int</span> x<span class="k2">;</span>
<span class="number"> 10</span>   <span class="k1">int</span> y<span class="k2">;</span>
<span class="number"> 11</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span><span class="k1">static</span> <span class="k1">const</span> <span class="k1">struct</span> DXY movedir<span class="k2">[</span><span class="n">4</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span>
<span class="number"> 14</span>   <span class="k2">{</span><span class="n">0</span>  ,  <span class="n">1</span><span class="k2">}</span>,<span class="c">/// down</span>
<span class="number"> 15</span>   <span class="k2">{</span><span class="n">0</span>  , <span class="k3">-</span><span class="n">1</span><span class="k2">}</span>,<span class="c">/// up</span>
<span class="number"> 16</span>   <span class="k2">{</span><span class="k3">-</span><span class="n">1</span> ,  <span class="n">0</span><span class="k2">}</span>,<span class="c">/// left</span>
<span class="number"> 17</span>   <span class="k2">{</span><span class="n">1</span>  ,  <span class="n">0</span><span class="k2">}</span> <span class="c">/// right</span>
<span class="number"> 18</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span><span class="k1">typedef</span> <span class="k1">struct</span> Rectangle <span class="k2">{</span>
<span class="number"> 21</span>   <span class="k1">double</span> x,y,rx,by<span class="k2">;</span><span class="c">/// left x, top y , right x , bottom y</span>
<span class="number"> 22</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span>Rectangle SweepRectangle<span class="k2">(</span><span class="k1">const</span> Rectangle<span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/rect"><span class="a">rect</span></a> , <span class="k1">double</span> dx , <span class="k1">double</span> dy<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 25</span>   Rectangle r <span class="k3">=</span> <a href="http://www.allegro.cc/manual/rect"><span class="a">rect</span></a><span class="k2">;</span>
<span class="number"> 26</span>   r.x <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span>dx&gt;0<span class="k2">)</span>?<span class="n">0</span><span class="k2">:</span>dx<span class="k2">;</span>
<span class="number"> 27</span>   r.y <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span>dy&gt;0<span class="k2">)</span>?<span class="n">0</span><span class="k2">:</span>dy<span class="k2">;</span>
<span class="number"> 28</span>   r.rx <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span>dx&gt;0<span class="k2">)</span>?dx:0<span class="k2">;</span>
<span class="number"> 29</span>   r.by <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span>dy&gt;0<span class="k2">)</span>?dy:0<span class="k2">;</span>
<span class="number"> 30</span>   <span class="k1">return</span> r<span class="k2">;</span>
<span class="number"> 31</span><span class="k2">}</span>
<span class="number"> 32</span>
<span class="number"> 33</span><span class="c">/// In update loop</span>
<span class="number"> 34</span>   Rectangle swept <span class="k3">=</span> SweepRectangle<span class="k2">(</span>snake_head_rect , dt<span class="k3">*</span>snake_speed<span class="k3">*</span>DXY<span class="k2">[</span>direction<span class="k2">]</span>.x , dt<span class="k3">*</span>snake_speed<span class="k3">*</span>DXY<span class="k2">[</span>direction<span class="k2">]</span>.y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 35</span>   <span class="k1">if</span> <span class="k2">(</span>swept.Overlaps<span class="k2">(</span>fruit<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 36</span>      <span class="c">/// ate some sweet fruit</span>
<span class="number"> 37</span>      score <span class="k3">+</span><span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 38</span>      remove_fruit<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</span>      place_new_fruit<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span>   <span class="k2">}</span>
<span class="number"> 41</span>   <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>swept.Overlaps<span class="k2">(</span>edges<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 42</span>      <span class="c">/// died</span>
<span class="number"> 43</span>   <span class="k2">}</span>
<span class="number"> 44</span>   <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>swept.Overlaps<span class="k2">(</span>body<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 45</span>      <span class="c">/// ate ourselves</span>
<span class="number"> 46</span>   <span class="k2">}</span>
<span class="number"> 47</span>   <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 48</span>      <span class="c">/// move normally</span>
<span class="number"> 49</span>      snake_head_rect.MoveBy<span class="k2">(</span>dt<span class="k3">*</span>snake_speed<span class="k3">*</span>DXY<span class="k2">[</span>direction<span class="k2">]</span>.x , dt<span class="k3">*</span>snake_speed<span class="k3">*</span>DXY<span class="k2">[</span>direction<span class="k2">]</span>.y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 50</span>   <span class="k2">}</span>
</div></div><p>

Sweep just means extend the shape in its forward movement direction. Search for sweep test / sweep check , sweep collision check , etc...</p><p>This is slightly psuedocode but you should get the idea. Make an enum to store the direction, and some const data on the direction of movement for each direction by xy values and then make a rectangle struct, and fill in a couple functions like Sweep, Overlap(Edge&amp;), Overlap(Rectangle&amp;) and so on.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 07 Sep 2019 11:15:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>After a while I came up with fairly simple method of calculating time which is needed to travel to the closest grid-aligned point. It&#39;s being triggered when direction has changed. Everything is nicely aligned and the movement is smooth (ofc Logic is to be fixed) but I don&#39;t know what I should do when getting close to the edges. I tried aligning to the edges - CELL_SIZE independently from pressSignal but it&#39;s hard to change direction when you&#39;ve got only one frame for this <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /> Any ideas?</p><p><a href="https://www.allegro.cc/files/attachment/612144">Game.c &amp; GameObjects.c</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (wixy00)</author>
		<pubDate>Mon, 09 Sep 2019 09:27:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Your logic looks sound.</p><p>If the intercept time to the edge is less than the update delta, then it has collided. You know it will only hit the edge if it is traveling towards it, and you know how far away it is, so t = dz/speed .
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 11 Sep 2019 06:00:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Try making a turn just before the edge. This is what I don&#39;t know how to handle. Aligning to the edge - CELL_SIZE doesn&#39;t seem to help at all probably because it happens only in one tick before colliding. Sorry for misunderstending, I feel like I didn&#39;t explain it well. And by the way, is cpu usage high after launching it on your computer too?</p><p><a href="https://www.allegro.cc/files/attachment/612145">Snake.exe</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (wixy00)</author>
		<pubDate>Wed, 11 Sep 2019 09:12:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The solution should be simple. Make your movement check before your update.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 12 Sep 2019 18:30:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m really close to solving my problem. However, I discovered one bug and I don&#39;t know how to solve it. Here is a short example so you can test it yourself. For example, try going down and press (almost at once) A/S and then W. Square goes directly upwards which is bad for my snake logic. How can I prevent this behaviour?</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;stdio.h&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;stdbool.h&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;math.h&gt;</span>
<span class="number">   4</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   5</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">   6</span>
<span class="number">   7</span><span class="p">#define FPS 60.0f</span>
<span class="number">   8</span><span class="p">#define CELL_SIZE 20</span>
<span class="number">   9</span>
<span class="number">  10</span><span class="k1">typedef</span> <span class="k1">struct</span> position
<span class="number">  11</span><span class="k2">{</span>
<span class="number">  12</span>  <span class="k1">int</span> x, y<span class="k2">;</span>
<span class="number">  13</span><span class="k2">}</span> Position<span class="k2">;</span>
<span class="number">  14</span>
<span class="number">  15</span><span class="k1">typedef</span> <span class="k1">struct</span> snake
<span class="number">  16</span><span class="k2">{</span>
<span class="number">  17</span>  <span class="k1">float</span> x, y<span class="k2">;</span>
<span class="number">  18</span>  <span class="k1">float</span> animationTime<span class="k2">;</span>
<span class="number">  19</span>  Position animationOrigin, animationDestination<span class="k2">;</span>
<span class="number">  20</span><span class="k2">}</span> Snake<span class="k2">;</span>
<span class="number">  21</span>
<span class="number">  22</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>display<span class="k2">;</span>
<span class="number">  23</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>eventQueue<span class="k2">;</span>
<span class="number">  24</span><span class="k1">bool</span> gameOver <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  25</span><span class="k1">float</span> lastFrameTime <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span>, elapsedTime <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span>, timeSinceLastUpdate <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  26</span><span class="k1">float</span> TimePerFrame <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span> <span class="k3">/</span> FPS<span class="k2">;</span><span class="k2">;</span>
<span class="number">  27</span>Snake snake<span class="k2">;</span>
<span class="number">  28</span><span class="k1">bool</span> isMovingUp <span class="k3">=</span> <span class="k1">false</span>, isMovingDown <span class="k3">=</span> <span class="k1">false</span>, isMovingLeft <span class="k3">=</span> <span class="k1">false</span>, isMovingRight <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  29</span><span class="k1">bool</span> hasAnimationEnded <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  30</span>Position direction<span class="k2">;</span>
<span class="number">  31</span>Position futureDirection<span class="k2">;</span>
<span class="number">  32</span><span class="k1">const</span> <span class="k1">float</span> speed <span class="k3">=</span> <span class="n">300</span><span class="k2">;</span>
<span class="number">  33</span>
<span class="number">  34</span><span class="k1">void</span> Setup<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  35</span><span class="k1">void</span> Run<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  36</span><span class="k1">void</span> Free<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  37</span><span class="k1">void</span> ProcessEvents<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  38</span><span class="k1">void</span> UpdateSnake<span class="k2">(</span>Snake <span class="k3">*</span>snake, <span class="k1">float</span> elapsedTime<span class="k2">)</span><span class="k2">;</span>
<span class="number">  39</span><span class="k1">void</span> Render<span class="k2">(</span><span class="k1">const</span> Snake <span class="k3">*</span>snake<span class="k2">)</span><span class="k2">;</span>
<span class="number">  40</span><span class="k1">void</span> HandleInput<span class="k2">(</span><span class="k1">int</span> keycode, <span class="k1">bool</span> isPressed<span class="k2">)</span><span class="k2">;</span>
<span class="number">  41</span>Position CalculatePosition<span class="k2">(</span><span class="k1">float</span> x, <span class="k1">float</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number">  42</span><span class="k1">float</span> CalculateTime<span class="k2">(</span><span class="k1">float</span> x, <span class="k1">float</span> y, <span class="k1">float</span> timeStep<span class="k2">)</span><span class="k2">;</span>
<span class="number">  43</span>
<span class="number">  44</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number">  45</span><span class="k2">{</span>
<span class="number">  46</span>  Setup<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  47</span>  Run<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  48</span>  Free<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  49</span>
<span class="number">  50</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  51</span><span class="k2">}</span>
<span class="number">  52</span>
<span class="number">  53</span><span class="k1">void</span> Setup<span class="k2">(</span><span class="k2">)</span>
<span class="number">  54</span><span class="k2">{</span>
<span class="number">  55</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k3">!</span><span class="k2">(</span>display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">800</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  56</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span>EXIT_FAILURE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  57</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_keyboard"><span class="a">al_install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init_primitives_addon"><span class="a">al_init_primitives_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  58</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span>EXIT_FAILURE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  59</span>
<span class="number">  60</span>  eventQueue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</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>eventQueue, <a href="http://www.allegro.cc/manual/al_get_keyboard_event_source"><span class="a">al_get_keyboard_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  62</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>eventQueue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  63</span>
<span class="number">  64</span>  snake <span class="k3">=</span> <span class="k2">(</span>Snake<span class="k2">)</span> <span class="k2">{</span> <span class="n">400</span>.<span class="n">0f</span>, <span class="n">300</span>.<span class="n">0f</span>, <span class="n">0</span>.<span class="n">0f</span>, <span class="k2">(</span>Position<span class="k2">)</span> <span class="k2">{</span> <span class="n">400</span>, <span class="n">300</span> <span class="k2">}</span>, <span class="k2">(</span>Position<span class="k2">)</span> <span class="k2">{</span> <span class="n">400</span>, <span class="n">300</span> <span class="k2">}</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number">  65</span>  futureDirection <span class="k3">=</span> <span class="k2">(</span>Position<span class="k2">)</span> <span class="k2">{</span> <span class="n">0</span>, <span class="k3">-</span><span class="n">1</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number">  66</span><span class="k2">}</span>
<span class="number">  67</span>
<span class="number">  68</span><span class="k1">void</span> Run<span class="k2">(</span><span class="k2">)</span>
<span class="number">  69</span><span class="k2">{</span>
<span class="number">  70</span>  <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>gameOver<span class="k2">)</span>
<span class="number">  71</span>  <span class="k2">{</span>
<span class="number">  72</span>    elapsedTime <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</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> lastFrameTime<span class="k2">;</span>
<span class="number">  73</span>    lastFrameTime <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</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="k2">;</span>
<span class="number">  74</span>
<span class="number">  75</span>    timeSinceLastUpdate <span class="k3">+</span><span class="k3">=</span> elapsedTime<span class="k2">;</span>
<span class="number">  76</span>
<span class="number">  77</span>    <span class="k1">while</span> <span class="k2">(</span>timeSinceLastUpdate <span class="k3">&gt;</span> TimePerFrame<span class="k2">)</span>
<span class="number">  78</span>    <span class="k2">{</span>
<span class="number">  79</span>      timeSinceLastUpdate <span class="k3">-</span><span class="k3">=</span> TimePerFrame<span class="k2">;</span>
<span class="number">  80</span>
<span class="number">  81</span>      ProcessEvents<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  82</span>      UpdateSnake<span class="k2">(</span><span class="k3">&amp;</span>snake, TimePerFrame<span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>    <span class="k2">}</span>
<span class="number">  84</span>
<span class="number">  85</span>    Render<span class="k2">(</span><span class="k3">&amp;</span>snake<span class="k2">)</span><span class="k2">;</span>
<span class="number">  86</span>  <span class="k2">}</span>
<span class="number">  87</span><span class="k2">}</span>
<span class="number">  88</span>
<span class="number">  89</span><span class="k1">void</span> Free<span class="k2">(</span><span class="k2">)</span>
<span class="number">  90</span><span class="k2">{</span>
<span class="number">  91</span>  <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  92</span>  <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>eventQueue<span class="k2">)</span><span class="k2">;</span>
<span class="number">  93</span><span class="k2">}</span>
<span class="number">  94</span>
<span class="number">  95</span><span class="k1">void</span> ProcessEvents<span class="k2">(</span><span class="k2">)</span>
<span class="number">  96</span><span class="k2">{</span>
<span class="number">  97</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> events<span class="k2">;</span>
<span class="number">  98</span>  <a href="http://www.allegro.cc/manual/al_get_next_event"><span class="a">al_get_next_event</span></a><span class="k2">(</span>eventQueue, <span class="k3">&amp;</span>events<span class="k2">)</span><span class="k2">;</span>
<span class="number">  99</span>
<span class="number"> 100</span>  <span class="k1">switch</span> <span class="k2">(</span>events.type<span class="k2">)</span>
<span class="number"> 101</span>  <span class="k2">{</span>
<span class="number"> 102</span>    <span class="k1">case</span> ALLEGRO_EVENT_KEY_DOWN:
<span class="number"> 103</span>      HandleInput<span class="k2">(</span>events.keyboard.keycode, <span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 104</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 105</span>
<span class="number"> 106</span>    <span class="k1">case</span> ALLEGRO_EVENT_KEY_UP:
<span class="number"> 107</span>      HandleInput<span class="k2">(</span>events.keyboard.keycode, <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 108</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 109</span>
<span class="number"> 110</span>    <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_CLOSE:
<span class="number"> 111</span>      gameOver <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 112</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 113</span>  <span class="k2">}</span>
<span class="number"> 114</span><span class="k2">}</span>
<span class="number"> 115</span>
<span class="number"> 116</span><span class="k1">void</span> Render<span class="k2">(</span><span class="k1">const</span> Snake <span class="k3">*</span>snake<span class="k2">)</span>
<span class="number"> 117</span><span class="k2">{</span>
<span class="number"> 118</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">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 119</span>
<span class="number"> 120</span>  <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="n">100</span>, <span class="n">100</span>, <span class="n">120</span>, <span class="n">120</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"> 121</span>  <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span>snake-&gt;x, snake-&gt;y, snake-&gt;x <span class="k3">+</span> CELL_SIZE, snake-&gt;y <span class="k3">+</span> CELL_SIZE, <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"> 122</span>
<span class="number"> 123</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"> 124</span><span class="k2">}</span>
<span class="number"> 125</span>
<span class="number"> 126</span><span class="k1">void</span> HandleInput<span class="k2">(</span><span class="k1">int</span> keycode, <span class="k1">bool</span> isPressed<span class="k2">)</span>
<span class="number"> 127</span><span class="k2">{</span>
<span class="number"> 128</span>  <span class="k1">if</span> <span class="k2">(</span>keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_W<span class="k2">)</span>
<span class="number"> 129</span>    isMovingUp <span class="k3">=</span> isPressed<span class="k2">;</span>
<span class="number"> 130</span>  <span class="k1">if</span> <span class="k2">(</span>keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_S<span class="k2">)</span>
<span class="number"> 131</span>    isMovingDown <span class="k3">=</span> isPressed<span class="k2">;</span>
<span class="number"> 132</span>  <span class="k1">if</span> <span class="k2">(</span>keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_A<span class="k2">)</span>
<span class="number"> 133</span>    isMovingLeft <span class="k3">=</span> isPressed<span class="k2">;</span>
<span class="number"> 134</span>  <span class="k1">if</span> <span class="k2">(</span>keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_D<span class="k2">)</span>
<span class="number"> 135</span>    isMovingRight <span class="k3">=</span> isPressed<span class="k2">;</span>
<span class="number"> 136</span>
<span class="number"> 137</span>  <span class="k1">if</span> <span class="k2">(</span>keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_ESCAPE<span class="k2">)</span>
<span class="number"> 138</span>    gameOver <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 139</span><span class="k2">}</span>
<span class="number"> 140</span>
<span class="number"> 141</span><span class="k1">void</span> UpdateSnake<span class="k2">(</span>Snake <span class="k3">*</span>snake, <span class="k1">float</span> timeStep<span class="k2">)</span>
<span class="number"> 142</span><span class="k2">{</span>
<span class="number"> 143</span>  <span class="k1">if</span> <span class="k2">(</span>isMovingUp <span class="k3">&amp;</span><span class="k3">&amp;</span> futureDirection.y <span class="k3">!</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>
<span class="number"> 144</span>    futureDirection <span class="k3">=</span> <span class="k2">(</span>Position<span class="k2">)</span> <span class="k2">{</span> <span class="n">0</span>, <span class="k3">-</span><span class="n">1</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 145</span>  <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>isMovingDown <span class="k3">&amp;</span><span class="k3">&amp;</span> futureDirection.y <span class="k3">!</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span>
<span class="number"> 146</span>    futureDirection <span class="k3">=</span> <span class="k2">(</span>Position<span class="k2">)</span> <span class="k2">{</span> <span class="n">0</span>, <span class="n">1</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 147</span>  <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>isMovingLeft <span class="k3">&amp;</span><span class="k3">&amp;</span> futureDirection.x <span class="k3">!</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>
<span class="number"> 148</span>    futureDirection <span class="k3">=</span> <span class="k2">(</span>Position<span class="k2">)</span> <span class="k2">{</span> <span class="k3">-</span><span class="n">1</span>, <span class="n">0</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 149</span>  <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>isMovingRight <span class="k3">&amp;</span><span class="k3">&amp;</span> futureDirection.x <span class="k3">!</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span>
<span class="number"> 150</span>    futureDirection <span class="k3">=</span> <span class="k2">(</span>Position<span class="k2">)</span> <span class="k2">{</span> <span class="n">1</span>, <span class="n">0</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 151</span>
<span class="number"> 152</span>  <span class="k1">if</span> <span class="k2">(</span>hasAnimationEnded<span class="k2">)</span>
<span class="number"> 153</span>  <span class="k2">{</span>
<span class="number"> 154</span>    direction <span class="k3">=</span> futureDirection<span class="k2">;</span>
<span class="number"> 155</span>    hasAnimationEnded <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 156</span>  <span class="k2">}</span>
<span class="number"> 157</span>
<span class="number"> 158</span>  <span class="k1">float</span> f <span class="k3">=</span> CalculateTime<span class="k2">(</span>snake-&gt;x, snake-&gt;y, timeStep<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 159</span>
<span class="number"> 160</span>  snake-&gt;x <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span>speed <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_303.html" target="_blank">fabs</a><span class="k2">(</span>f<span class="k2">)</span> <span class="k3">*</span> direction.x<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 161</span>  snake-&gt;y <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span>speed <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_303.html" target="_blank">fabs</a><span class="k2">(</span>f<span class="k2">)</span> <span class="k3">*</span> direction.y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 162</span><span class="k2">}</span>
<span class="number"> 163</span>
<span class="number"> 164</span>Position CalculatePosition<span class="k2">(</span><span class="k1">float</span> x, <span class="k1">float</span> y<span class="k2">)</span>
<span class="number"> 165</span><span class="k2">{</span>
<span class="number"> 166</span>  Position temp<span class="k2">;</span>
<span class="number"> 167</span>
<span class="number"> 168</span>  temp.x <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>x <span class="k3">/</span> CELL_SIZE<span class="k2">)</span> <span class="k3">*</span> CELL_SIZE<span class="k2">;</span>
<span class="number"> 169</span>  temp.y <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>y <span class="k3">/</span> CELL_SIZE<span class="k2">)</span> <span class="k3">*</span> CELL_SIZE<span class="k2">;</span>
<span class="number"> 170</span>
<span class="number"> 171</span>  <span class="k1">if</span> <span class="k2">(</span>direction.x <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>
<span class="number"> 172</span>    temp.x <span class="k3">+</span><span class="k3">=</span> CELL_SIZE<span class="k2">;</span>
<span class="number"> 173</span>
<span class="number"> 174</span>  <span class="k1">if</span> <span class="k2">(</span>direction.y <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>
<span class="number"> 175</span>    temp.y <span class="k3">+</span><span class="k3">=</span> CELL_SIZE<span class="k2">;</span>
<span class="number"> 176</span>
<span class="number"> 177</span>  <span class="k1">return</span> temp<span class="k2">;</span>
<span class="number"> 178</span><span class="k2">}</span>
<span class="number"> 179</span>
<span class="number"> 180</span><span class="k1">float</span> CalculateTime<span class="k2">(</span><span class="k1">float</span> x, <span class="k1">float</span> y, <span class="k1">float</span> timeStep<span class="k2">)</span>
<span class="number"> 181</span><span class="k2">{</span>
<span class="number"> 182</span>  Position temp <span class="k3">=</span> CalculatePosition<span class="k2">(</span>x, y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 183</span>
<span class="number"> 184</span>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_303.html" target="_blank">fabs</a><span class="k2">(</span>temp.x <span class="k3">-</span> x<span class="k2">)</span> <span class="k3">&gt;</span> timeStep <span class="k3">*</span> speed <span class="k3">|</span><span class="k3">|</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_303.html" target="_blank">fabs</a><span class="k2">(</span>temp.y <span class="k3">-</span> y<span class="k2">)</span> <span class="k3">&gt;</span> timeStep <span class="k3">*</span> speed<span class="k2">)</span>
<span class="number"> 185</span>    <span class="k1">return</span> timeStep<span class="k2">;</span>
<span class="number"> 186</span>
<span class="number"> 187</span>  <span class="k1">if</span> <span class="k2">(</span>direction.x <span class="k3">!</span><span class="k3">=</span> futureDirection.x <span class="k3">&amp;</span><span class="k3">&amp;</span> direction.y <span class="k3">!</span><span class="k3">=</span> futureDirection.y<span class="k2">)</span>
<span class="number"> 188</span>  <span class="k2">{</span>
<span class="number"> 189</span>    hasAnimationEnded <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 190</span>
<span class="number"> 191</span>    <span class="k1">if</span> <span class="k2">(</span>direction.x <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 192</span>      <span class="k1">return</span> <span class="k2">(</span>temp.x <span class="k3">-</span> x<span class="k2">)</span> <span class="k3">/</span> speed<span class="k2">;</span>
<span class="number"> 193</span>    <span class="k1">else</span>
<span class="number"> 194</span>      <span class="k1">return</span> <span class="k2">(</span>temp.y <span class="k3">-</span> y<span class="k2">)</span> <span class="k3">/</span> speed<span class="k2">;</span>
<span class="number"> 195</span>  <span class="k2">}</span>
<span class="number"> 196</span>
<span class="number"> 197</span>  <span class="k1">return</span> timeStep<span class="k2">;</span>
<span class="number"> 198</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (wixy00)</author>
		<pubDate>Sun, 15 Sep 2019 01:14:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The solution is easy. Make it travel at least one square before allowing it to change direction, and if it tries to &#39;eat itself&#39; then kill it, that&#39;s a bad move.</p><p>Here&#39;s an example to check for if the snake is eating itself (tries to move the opposite direction it is going) :
</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">/// Quick check to see if the snake tries to eat itself</span>
<span class="number">  2</span>  <span class="k1">if</span> <span class="k2">(</span>direction.x<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  3</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>direction.x <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> isMovingLeft<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  4</span>      <span class="c">// boom</span>
<span class="number">  5</span>    <span class="k2">}</span>
<span class="number">  6</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>direction.x <span class="k3">=</span><span class="k3">=</span> <span class="k3">-</span><span class="n">11</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> isMovingRight<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  7</span>      <span class="c">// boom</span>
<span class="number">  8</span>    <span class="k2">}</span>
<span class="number">  9</span>  <span class="k2">}</span>
<span class="number"> 10</span>  <span class="k1">if</span> <span class="k2">(</span>direction.y<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 11</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>direction.y <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> isMovingUp<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 12</span>      <span class="c">// boom</span>
<span class="number"> 13</span>    <span class="k2">}</span>
<span class="number"> 14</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>direction.y <span class="k3">=</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> isMovingDown<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 15</span>      <span class="c">// boom</span>
<span class="number"> 16</span>    <span class="k2">}</span>
<span class="number"> 17</span>  <span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 15 Sep 2019 08:19:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Okay, fixed it. Thank you for your help and patience <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></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">bool</span> during <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="k1">void</span> UpdateSnake<span class="k2">(</span>Snake <span class="k3">*</span>snake, <span class="k1">float</span> timeStep<span class="k2">)</span>
<span class="number">  4</span><span class="k2">{</span>
<span class="number">  5</span>  <span class="k1">float</span> f <span class="k3">=</span> CalculateTime<span class="k2">(</span>snake-&gt;x, snake-&gt;y, timeStep<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>during<span class="k2">)</span>
<span class="number">  8</span>  <span class="k2">{</span>
<span class="number">  9</span>    <span class="k1">if</span> <span class="k2">(</span>isMovingUp <span class="k3">&amp;</span><span class="k3">&amp;</span> futureDirection.y <span class="k3">!</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>
<span class="number"> 10</span>      futureDirection <span class="k3">=</span> <span class="k2">(</span>Position<span class="k2">)</span> <span class="k2">{</span> <span class="n">0</span>, <span class="k3">-</span><span class="n">1</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 11</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>isMovingDown <span class="k3">&amp;</span><span class="k3">&amp;</span> futureDirection.y <span class="k3">!</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span>
<span class="number"> 12</span>      futureDirection <span class="k3">=</span> <span class="k2">(</span>Position<span class="k2">)</span> <span class="k2">{</span> <span class="n">0</span>, <span class="n">1</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 13</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>isMovingLeft <span class="k3">&amp;</span><span class="k3">&amp;</span> futureDirection.x <span class="k3">!</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>
<span class="number"> 14</span>      futureDirection <span class="k3">=</span> <span class="k2">(</span>Position<span class="k2">)</span> <span class="k2">{</span> <span class="k3">-</span><span class="n">1</span>, <span class="n">0</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 15</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>isMovingRight <span class="k3">&amp;</span><span class="k3">&amp;</span> futureDirection.x <span class="k3">!</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span>
<span class="number"> 16</span>      futureDirection <span class="k3">=</span> <span class="k2">(</span>Position<span class="k2">)</span> <span class="k2">{</span> <span class="n">1</span>, <span class="n">0</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>    during <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 19</span>  <span class="k2">}</span>
<span class="number"> 20</span>
<span class="number"> 21</span>  snake-&gt;x <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span>speed <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_303.html" target="_blank">fabs</a><span class="k2">(</span>f<span class="k2">)</span> <span class="k3">*</span> direction.x<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>  snake-&gt;y <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span>speed <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_303.html" target="_blank">fabs</a><span class="k2">(</span>f<span class="k2">)</span> <span class="k3">*</span> direction.y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span>  <span class="k1">if</span> <span class="k2">(</span>hasAnimationEnded<span class="k2">)</span>
<span class="number"> 25</span>  <span class="k2">{</span>
<span class="number"> 26</span>    direction <span class="k3">=</span> futureDirection<span class="k2">;</span>
<span class="number"> 27</span>    hasAnimationEnded <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 28</span>    during <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</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="k1">float</span> CalculateTime<span class="k2">(</span><span class="k1">float</span> x, <span class="k1">float</span> y, <span class="k1">float</span> timeStep<span class="k2">)</span>
<span class="number"> 33</span><span class="k2">{</span>
<span class="number"> 34</span>  Position temp <span class="k3">=</span> CalculatePosition<span class="k2">(</span>x, y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 35</span>
<span class="number"> 36</span>  <span class="k1">if</span> <span class="k2">(</span>direction.x <span class="k3">!</span><span class="k3">=</span> futureDirection.x <span class="k3">&amp;</span><span class="k3">&amp;</span> direction.y <span class="k3">!</span><span class="k3">=</span> futureDirection.y<span class="k2">)</span>
<span class="number"> 37</span>  <span class="k2">{</span>
<span class="number"> 38</span>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_303.html" target="_blank">fabs</a><span class="k2">(</span>temp.x <span class="k3">-</span> x<span class="k2">)</span> <span class="k3">&gt;</span> timeStep <span class="k3">*</span> speed <span class="k3">|</span><span class="k3">|</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_303.html" target="_blank">fabs</a><span class="k2">(</span>temp.y <span class="k3">-</span> y<span class="k2">)</span> <span class="k3">&gt;</span> timeStep <span class="k3">*</span> speed<span class="k2">)</span>
<span class="number"> 39</span>      <span class="k1">return</span> timeStep<span class="k2">;</span>
<span class="number"> 40</span>    <span class="k1">else</span>
<span class="number"> 41</span>    <span class="k2">{</span>
<span class="number"> 42</span>      hasAnimationEnded <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 43</span>
<span class="number"> 44</span>      <span class="k1">if</span> <span class="k2">(</span>direction.x <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 45</span>        <span class="k1">return</span> <span class="k2">(</span>temp.x <span class="k3">-</span> x<span class="k2">)</span> <span class="k3">/</span> speed<span class="k2">;</span>
<span class="number"> 46</span>      <span class="k1">else</span>
<span class="number"> 47</span>        <span class="k1">return</span> <span class="k2">(</span>temp.y <span class="k3">-</span> y<span class="k2">)</span> <span class="k3">/</span> speed<span class="k2">;</span>
<span class="number"> 48</span>    <span class="k2">}</span>
<span class="number"> 49</span>  <span class="k2">}</span>
<span class="number"> 50</span>  
<span class="number"> 51</span>  during <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 52</span>
<span class="number"> 53</span>  <span class="k1">return</span> timeStep<span class="k2">;</span>
<span class="number"> 54</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (wixy00)</author>
		<pubDate>Sun, 15 Sep 2019 10:52:59 +0000</pubDate>
	</item>
</rss>
