<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Math question (2d trig)</title>
		<link>http://www.allegro.cc/forums/view/618631</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 02 May 2022 17:35:29 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I have a bit of a tricky math problem and I was wondering if anyone could provide insight.</p><p>Its about trigonometry and systems of equations.</p><p>This is all in 2D.</p><p>It is trivial to have an enemy shoot a bullet at the player. Simple trig.</p><p>But I want to have an enemy shoot a bullet, not at where the player is, but where they will be.<br />(assuming the player does not change velocity or direction)</p><p>My inputs are:<br />the player&#39;s position: px, py<br />the player&#39;s movement: pxinc, pyinc</p><p>the origin of the bullet: bx, by<br />the speed of the bullet: bspeed</p><p>What I want for an output is the angle of the bullet to ensure a collision<br />(or bxinc, byinc which I could calculate from angle)</p><p>Every method I can think of involves brute force, iterating through angles until I find a solution</p><p>There must be an more elegant solution.</p><p>I am trying to think of it as where two lines intersect...<br />But each line has a different velocity, so the line length are related to time...and speed?</p><p>Can anyone of you smart people help point me in the right direction?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Weiss)</author>
		<pubDate>Thu, 17 Mar 2022 01:24:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You need to find out at what time(t) will they collide.</p><p>Basic position function: S(t) = S(0) + v(t) * t + 1/2 * a(t) * t^2</p><p>S(0) = starting position<br />v(t) = velocity at time t (constant in your case)<br />a(t) = acceleration at time t (zero if velocity is constant)<br />t = time</p><p>S(t) = S(0) + v(t)t</p><p>Can be broken into x,y components:<br />Sx(t) = Sx(0) + v(t)t<br />Sy(t) = Sy(0) + v(t)t</p><p>What are the player&#39;s and bullet&#39;s positions?</p><p>Player:<br />Px(t) = px + pxinc * t<br />Py(t) = py + pyinc * t</p><p>Bullet:<br />Bx(t) = bx + bxinc * t<br />By(t) = by + byinc * t</p><p>this creates a triangle<br /><span class="remote-thumbnail"><span class="json">{"name":"613141","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/6\/6\/66721966b91c1742b7df294159bc4344.png","w":322,"h":372,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/6\/6\/66721966b91c1742b7df294159bc4344"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/6/6/66721966b91c1742b7df294159bc4344-240.jpg" alt="613141" width="240" height="277" /></span></p><p>You can either use x or y</p><p>Px(t) = Bx(t) or Py(t) = By(t)</p><p>px + pxinc*t = bx + bxinc*t<br />px - bx = pxinc*t + bxinc*t<br />px - bx = t(pxinc - bxinc)<br />t = (px - bx)/(pxinc - bxinc)</p><p>You can use original formula to then solve for x and y of final position:<br />x(t) = px + pxinc*t = bx + bxinc*t<br />y(t) = py + pyinc*t = by + byinc*t</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">float</span> findPosition<span class="k2">(</span><span class="k1">float</span> <span class="k3">&amp;</span>x, <span class="k1">float</span> <span class="k3">&amp;</span>y, 
                  <span class="k1">float</span> px, <span class="k1">float</span> py, <span class="k1">float</span> pxinc, <span class="k1">float</span> pyinc,
                  <span class="k1">float</span> bx, <span class="k1">float</span> by, <span class="k1">float</span> bxinc, <span class="k1">float</span> byinc<span class="k2">)</span>
<span class="k2">{</span>
    <span class="k1">float</span> t <span class="k3">=</span> <span class="k2">(</span>px <span class="k3">-</span> bx<span class="k2">)</span><span class="k3">/</span><span class="k2">(</span>pxinc <span class="k3">-</span> bxinc<span class="k2">)</span><span class="k2">;</span>


    x <span class="k3">=</span> px <span class="k3">+</span> pxinc <span class="k3">*</span> t<span class="k2">;</span>
    y <span class="k3">=</span> py <span class="k3">+</span> pyinc <span class="k3">*</span> t<span class="k2">;</span>

    <span class="k1">return</span> t<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

It&#39;s a mess. Hopefully I didn&#39;t miss anything.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Thu, 17 Mar 2022 01:52:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thank you for that. I am working on implementing it.<br />Time was the key. At what time will they collide?</p><p>UPDATE</p><p>Unfortunately I was unable to make your method work.</p><p>All I have for b is initial position and speed.<br />I do not have bxinc or byinc or the angle.<br />That is what I am trying to find.</p><p>The way I figured out how to do it was:</p><p>iterate on frame (time period) in a loop</p><p>for each frame find<br />- where we guess the player will be<br />- the distance from that position to the bullet origin<br />- find out how far the bullet could travel in the same amount of time</p><p>When those distances are equal (or close) that is where the will collide.<br />From the frame number that occurred at, I get the players position<br />That is where I shoot the bullet.</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> fire_enemy_bulletb<span class="k2">(</span><span class="k1">int</span> EN, <span class="k1">int</span> bullet_ans, <span class="k1">int</span> p<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> bx <span class="k3">=</span> Efi<span class="k2">[</span>EN<span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  4</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> by <span class="k3">=</span> Efi<span class="k2">[</span>EN<span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  5</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> bspeed <span class="k3">=</span> Efi<span class="k2">[</span>EN<span class="k2">]</span><span class="k2">[</span><span class="n">7</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> px <span class="k3">=</span> players<span class="k2">[</span>p<span class="k2">]</span>.PX<span class="k2">;</span>
<span class="number">  8</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> py <span class="k3">=</span> players<span class="k2">[</span>p<span class="k2">]</span>.PY<span class="k2">;</span>
<span class="number">  9</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> pxi <span class="k3">=</span> players<span class="k2">[</span>p<span class="k2">]</span>.xinc<span class="k2">;</span>
<span class="number"> 10</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> pyi <span class="k3">=</span> players<span class="k2">[</span>p<span class="k2">]</span>.yinc<span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>   <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span><span class="n">1</span><span class="k2">;</span> i<span class="k3">&lt;</span><span class="n">100</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 13</span>   <span class="k2">{</span>
<span class="number"> 14</span>      px<span class="k3">+</span><span class="k3">=</span>pxi<span class="k2">;</span>
<span class="number"> 15</span>      py<span class="k3">+</span><span class="k3">=</span>pyi<span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>      <span class="c">// calc distance from player's new pos to bullet origin</span>
<span class="number"> 18</span>      <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> xlen <span class="k3">=</span> px <span class="k3">-</span> bx<span class="k2">;</span>  <span class="c">// get the x distance between enemy and player</span>
<span class="number"> 19</span>      <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> ylen <span class="k3">=</span> py <span class="k3">-</span> by<span class="k2">;</span>  <span class="c">// get the y distance between enemy and player</span>
<span class="number"> 20</span>      <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> hy_dist <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fixhypot"><span class="a">al_fixhypot</span></a><span class="k2">(</span>xlen, ylen<span class="k2">)</span><span class="k2">;</span>   <span class="c">// hypotenuse distance</span>
<span class="number"> 21</span>
<span class="number"> 22</span>      <span class="c">// get distance that bullet would travel in same amount of time</span>
<span class="number"> 23</span>      <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> bd <span class="k3">=</span> bspeed <span class="k3">*</span> i<span class="k2">;</span>
<span class="number"> 24</span>
<span class="number"> 25</span>      <span class="c">// if they are close enough pull the trigger</span>
<span class="number"> 26</span>      <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> bdif <span class="k3">=</span> hy_dist-bd<span class="k2">;</span>
<span class="number"> 27</span>
<span class="number"> 28</span>      <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> ltol <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_ftofix"><span class="a">al_ftofix</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>      <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> utol <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_ftofix"><span class="a">al_ftofix</span></a><span class="k2">(</span><span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>
<span class="number"> 31</span>      <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>bdif <span class="k3">&lt;</span> utol<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>bdif <span class="k3">&gt;</span> ltol<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 32</span>      <span class="k2">{</span>
<span class="number"> 33</span>         i <span class="k3">=</span> <span class="n">100</span><span class="k2">;</span> <span class="c">// break out of loop</span>
<span class="number"> 34</span>
<span class="number"> 35</span>         <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> speed <span class="k3">=</span> Efi<span class="k2">[</span>EN<span class="k2">]</span><span class="k2">[</span><span class="n">7</span><span class="k2">]</span><span class="k2">;</span>                     <span class="c">// speed</span>
<span class="number"> 36</span>         <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> scaler <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fixdiv"><span class="a">al_fixdiv</span></a><span class="k2">(</span>hy_dist, speed<span class="k2">)</span><span class="k2">;</span>     <span class="c">// get scaler</span>
<span class="number"> 37</span>
<span class="number"> 38</span>         <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> xinc <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fixdiv"><span class="a">al_fixdiv</span></a><span class="k2">(</span>xlen, scaler<span class="k2">)</span><span class="k2">;</span>        <span class="c">// calc xinc</span>
<span class="number"> 39</span>         <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> yinc <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fixdiv"><span class="a">al_fixdiv</span></a><span class="k2">(</span>ylen, scaler<span class="k2">)</span><span class="k2">;</span>        <span class="c">// calc yinc</span>
<span class="number"> 40</span>
<span class="number"> 41</span>         <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> z<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> z<span class="k3">&lt;</span><span class="n">50</span><span class="k2">;</span> z<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>  <span class="c">// find empty e_bullet</span>
<span class="number"> 42</span>            <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>e_bullet_active<span class="k2">[</span>z<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 43</span>            <span class="k2">{</span>
<span class="number"> 44</span>               e_bullet_active<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 45</span>               e_bullet_shape<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> <span class="n">1000</span> <span class="k3">+</span> bullet_ans<span class="k2">;</span>
<span class="number"> 46</span>               e_bullet_fx<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> Efi<span class="k2">[</span>EN<span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 47</span>               e_bullet_fy<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> Efi<span class="k2">[</span>EN<span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 48</span>               e_bullet_fxinc<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> xinc<span class="k2">;</span>
<span class="number"> 49</span>               e_bullet_fyinc<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> yinc<span class="k2">;</span>
<span class="number"> 50</span>               z<span class="k3">=</span><span class="n">50</span><span class="k2">;</span>
<span class="number"> 51</span>            <span class="k2">}</span>
<span class="number"> 52</span>      <span class="k2">}</span>
<span class="number"> 53</span>   <span class="k2">}</span>
<span class="number"> 54</span><span class="k2">}</span>
</div></div><p>

This actually works, but I am sure there is a much better way of doing it.</p><p>UPDATE</p><p>This is the equation I have come up with:</p><p><a href="https://d1cxvcw9gjxu2x.cloudfront.net/attachments/613142">https://d1cxvcw9gjxu2x.cloudfront.net/attachments/613142</a></p><p>Now the fun part!</p><p>Solve for t.</p><p>My skills are not up to the task...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Weiss)</author>
		<pubDate>Thu, 17 Mar 2022 05:53:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>t and angle are related. If you change one, you change the other. You&#39;ll have to make an initial guess and hope it&#39;s efficient.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 17 Mar 2022 20:15:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I had a method where I just increased time until I found a close enough solution.<br />That took a lot of iterations.<br />And if I wanted it more accurate, I would have to step time even slower, which meant even more iterations</p><p>I found a method where I search for t in large steps.<br />Then when I overshoot it, I reverse direction and decrease the step size...<br />I keep doing this until I get close enough.<br />This greatly reduces the amount of values of t I need to test.</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><a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> get_distance<span class="k2">(</span><a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> px, <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> py, <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> pxinc, <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> pyinc,
<span class="number">  2</span>                       <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> bx, <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> by, <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> b_speed, <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> t<span class="k2">)</span>
<span class="number">  3</span><span class="k2">{</span>
<span class="number">  4</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> px1 <span class="k3">=</span> px <span class="k3">+</span> <a href="http://www.allegro.cc/manual/al_fixmul"><span class="a">al_fixmul</span></a><span class="k2">(</span>pxinc, t<span class="k2">)</span><span class="k2">;</span>                   <span class="c">// get the p position at time t</span>
<span class="number">  5</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> py1 <span class="k3">=</span> py <span class="k3">+</span> <a href="http://www.allegro.cc/manual/al_fixmul"><span class="a">al_fixmul</span></a><span class="k2">(</span>pyinc, t<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> p_distance_to_b <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fixhypot"><span class="a">al_fixhypot</span></a><span class="k2">(</span>px1-bx, py1-by<span class="k2">)</span><span class="k2">;</span>    <span class="c">// distance from p to b</span>
<span class="number">  7</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> b_distance <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fixmul"><span class="a">al_fixmul</span></a><span class="k2">(</span>b_speed, t<span class="k2">)</span><span class="k2">;</span>               <span class="c">// how far will b travel in time t</span>
<span class="number">  8</span>   <span class="k1">return</span> <span class="k2">(</span>p_distance_to_b <span class="k3">-</span> b_distance<span class="k2">)</span><span class="k2">;</span>                     <span class="c">// difference between distances</span>
<span class="number">  9</span><span class="k2">}</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">void</span> fire_enemy_bulleta<span class="k2">(</span><span class="k1">int</span> EN, <span class="k1">int</span> bullet_ans, <span class="k1">int</span> p<span class="k2">)</span>
<span class="number"> 12</span><span class="k2">{</span>
<span class="number"> 13</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> bx <span class="k3">=</span> Efi<span class="k2">[</span>EN<span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 14</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> by <span class="k3">=</span> Efi<span class="k2">[</span>EN<span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 15</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> bspeed <span class="k3">=</span> Efi<span class="k2">[</span>EN<span class="k2">]</span><span class="k2">[</span><span class="n">7</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> px <span class="k3">=</span> players<span class="k2">[</span>p<span class="k2">]</span>.PX<span class="k2">;</span>
<span class="number"> 18</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> py <span class="k3">=</span> players<span class="k2">[</span>p<span class="k2">]</span>.PY<span class="k2">;</span>
<span class="number"> 19</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> pxi <span class="k3">=</span> players<span class="k2">[</span>p<span class="k2">]</span>.xinc<span class="k2">;</span>
<span class="number"> 20</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> pyi <span class="k3">=</span> players<span class="k2">[</span>p<span class="k2">]</span>.yinc<span class="k2">;</span>
<span class="number"> 21</span>
<span class="number"> 22</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> f0 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_itofix"><span class="a">al_itofix</span></a><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>    <span class="c">// the number zero in fixed format</span>
<span class="number"> 23</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> t <span class="k3">=</span> f0<span class="k2">;</span>               <span class="c">// start time</span>
<span class="number"> 24</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> tinc <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_itofix"><span class="a">al_itofix</span></a><span class="k2">(</span><span class="n">20</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// initial time step</span>
<span class="number"> 25</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> bdif <span class="k3">=</span> f0<span class="k2">;</span>
<span class="number"> 26</span>
<span class="number"> 27</span>   <span class="k1">int</span> tries <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 28</span>   <span class="k1">int</span> done <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 29</span>   <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>done<span class="k2">)</span>
<span class="number"> 30</span>   <span class="k2">{</span>
<span class="number"> 31</span>      t<span class="k3">+</span><span class="k3">=</span>tinc<span class="k2">;</span>
<span class="number"> 32</span>      bdif <span class="k3">=</span> get_distance<span class="k2">(</span>px, py, pxi, pyi, bx, by, bspeed, t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>      <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span> bdif <span class="k3">&lt;</span> <a href="http://www.allegro.cc/manual/al_itofix"><span class="a">al_itofix</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>bdif <span class="k3">&gt;</span> <a href="http://www.allegro.cc/manual/al_itofix"><span class="a">al_itofix</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span> done <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> <span class="c">// is the difference with the threshold?</span>
<span class="number"> 34</span>
<span class="number"> 35</span>      <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span><span class="k2">(</span>tinc <span class="k3">&gt;</span> f0<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>bdif <span class="k3">&lt;</span> f0<span class="k2">)</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span>       <span class="c">// overshot while t increasing</span>
<span class="number"> 36</span>          <span class="k2">(</span><span class="k2">(</span>tinc <span class="k3">&lt;</span> f0<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>bdif <span class="k3">&gt;</span> f0<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span>         <span class="c">// overshot while t decreasing</span>
<span class="number"> 37</span>         tinc <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fixdiv"><span class="a">al_fixdiv</span></a><span class="k2">(</span>tinc, <a href="http://www.allegro.cc/manual/al_itofix"><span class="a">al_itofix</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">2</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// half the increment and reverse direction</span>
<span class="number"> 38</span>
<span class="number"> 39</span>      <span class="k1">if</span> <span class="k2">(</span>tries<span class="k3">+</span><span class="k3">+</span> <span class="k3">&gt;</span> <span class="n">100</span><span class="k2">)</span> done <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> <span class="c">// break out in case something goes wrong</span>
<span class="number"> 40</span>   <span class="k2">}</span>
<span class="number"> 41</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> px1 <span class="k3">=</span> px <span class="k3">+</span> <a href="http://www.allegro.cc/manual/al_fixmul"><span class="a">al_fixmul</span></a><span class="k2">(</span>pxi, t<span class="k2">)</span><span class="k2">;</span> <span class="c">// get player target position based on t</span>
<span class="number"> 42</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> py1 <span class="k3">=</span> py <span class="k3">+</span> <a href="http://www.allegro.cc/manual/al_fixmul"><span class="a">al_fixmul</span></a><span class="k2">(</span>pyi, t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 43</span>   fire_enemy_bulletz<span class="k2">(</span>EN, bullet_ans, px1, py1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span><span class="k2">}</span>
</div></div><p>

However I consider this entire approach an inelegant brute force method.</p><p>I can&#39;t help but think there is a better way of doing this.</p><p>My whole approach can be condensed to:</p><p>Find the time when the player&#39;s future position has an equal distance to the bullet origin as the distance the bullet will travel in the same amount of time.</p><p>Then it is trivial to get the player&#39;s future x and y position from the time.</p><p>I came up with an equation to describe that, but I don&#39;t know if it is possible to isolate t on one side (solve for t)<br /><a href="https://www.allegro.cc/files/attachment/613143">https://www.allegro.cc/files/attachment/613143</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Weiss)</author>
		<pubDate>Thu, 17 Mar 2022 21:02:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/618631/1051933#target">Michael Weiss</a> said:</div><div class="quote"><p>Find the time when the player&#39;s future position has an equal distance to the bullet origin as the time the bullet will travel in the same amount of time.</p><p>Then it is trivial to get the player&#39;s future x and y position from the time.</p></div></div><p>

That&#39;s what this function does. Returns time. Sets x and y as postion of collision.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">float</span> findPosition<span class="k2">(</span><span class="k1">float</span> <span class="k3">&amp;</span>x, <span class="k1">float</span> <span class="k3">&amp;</span>y, 
                  <span class="k1">float</span> px, <span class="k1">float</span> py, <span class="k1">float</span> pxinc, <span class="k1">float</span> pyinc,
                  <span class="k1">float</span> bx, <span class="k1">float</span> by, <span class="k1">float</span> bxinc, <span class="k1">float</span> byinc<span class="k2">)</span>
<span class="k2">{</span>
    <span class="k1">float</span> t <span class="k3">=</span> <span class="k2">(</span>px <span class="k3">-</span> bx<span class="k2">)</span><span class="k3">/</span><span class="k2">(</span>pxinc <span class="k3">-</span> bxinc<span class="k2">)</span><span class="k2">;</span>


    x <span class="k3">=</span> px <span class="k3">+</span> pxinc <span class="k3">*</span> t<span class="k2">;</span>
    y <span class="k3">=</span> py <span class="k3">+</span> pyinc <span class="k3">*</span> t<span class="k2">;</span>

    <span class="k1">return</span> t<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

If you only have bullet position and speed, we can calculate the angle and velocities
</p><div class="source-code snippet"><div class="inner"><pre><span class="c">// bx,by bullet position</span>
<span class="c">// x, y collision point</span>
<span class="k1">float</span> findAngle<span class="k2">(</span><span class="k1">float</span> bx, <span class="k1">float</span> by, <span class="k1">float</span> x, <span class="k1">float</span> y<span class="k2">)</span>
<span class="k2">{</span>
    <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_50.html" target="_blank">atan2</a><span class="k2">(</span>by <span class="k3">-</span> y, bx <span class="k3">-</span> x<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>

<span class="c">// you said you know the speed. get velocity from that</span>
<span class="k1">void</span> calculateBulletVelocity<span class="k2">(</span><span class="k1">float</span> <span class="k3">&amp;</span>bxinc, floast <span class="k3">&amp;</span>byinc, <span class="k1">float</span> angle, <span class="k1">float</span> speed<span class="k2">)</span>
<span class="k2">{</span>
    bxinc <span class="k3">=</span> speed <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>angle<span class="k2">)</span><span class="k2">;</span>
    byinc <span class="k3">=</span> speed <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>angle<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

What was this about stepping time? </p><p>Let&#39;s say it take 2.47s seconds to collision, but your logic is only accurate to the tenth of a second. There might be a collision miss. Take the 0.07s difference and give the bullet a nudge in the direction.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Thu, 17 Mar 2022 22:03:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t understand...</p><p>Your function &#39;findPosition&#39; needs bxinc and byinc as an input.<br />I don&#39;t have those, that is what I am trying to find.</p><p>Then you say:</p><p>&quot;If you only have bullet position and speed, we can calculate the angle and   velocities&quot;</p><p>In your function &#39;findAngle&#39; where do you get x and y?<br />That is also what I am looking for, where the collision takes place.<br />If I knew that, the rest is trivial...</p><p>Its kind of like a chicken and egg thing here.</p><p>If I know exactly when the collision happens, I can figure out the rest.<br />If I know exactly where the collision happens, I can figure out the rest.</p><p>Am I missing something in your explanation? I cannot see how it would work.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Weiss)</author>
		<pubDate>Fri, 18 Mar 2022 00:05:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You&#39;re right. Chicken and egg.</p><p>I&#39;ll get back to you.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Fri, 18 Mar 2022 02:40:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Like I said, t and angle are related. You have to guess for one, and then solve for the other. You don&#39;t need to iterate anything.</p><p>The question (and answer) are actually more complicated than either of you are thinking. Solving for t involves solving a quadratic equation.</p><p><span class="remote-thumbnail"><span class="json">{"name":"613146","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/7\/9\/79dc84ef8bb6bdae06f90f2d63794299.png","w":3072,"h":2275,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/7\/9\/79dc84ef8bb6bdae06f90f2d63794299"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/7/9/79dc84ef8bb6bdae06f90f2d63794299-240.jpg" alt="613146" width="240" height="177" /></span></p><p>I think what you really want though is to set a time of intercept, and solve for the angle necessary to hit the target. That&#39;s beyond me for the moment.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 18 Mar 2022 21:39:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>a = distance bullet to collision<br />b = distance player to collision<br />c = distance bullet to player<br />A = angle at player<br />B = angle at bullet<br />C = angle at collision</p><p>1. make a line the player is travelling</p><div class="source-code snippet"><div class="inner"><pre><span class="c">// point 1 = px, py</span>
<span class="c">// point 2 = px + pxinc, py + pyinc</span>

<span class="c">// pick any x and give corresponding y</span>
<span class="k1">float</span> getY<span class="k2">(</span><span class="k1">float</span> x1, <span class="k1">float</span> y1, <span class="k1">float</span> x2, <span class="k1">float</span> y2, <span class="k1">float</span> x<span class="k2">)</span>
<span class="k2">{</span>
    <span class="c">// m = rise / run</span>
    <span class="k1">float</span> m <span class="k3">=</span> <span class="k2">(</span>y2 <span class="k3">-</span> y1<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span>x2 <span class="k3">-</span> x1<span class="k2">)</span><span class="k2">;</span>

    <span class="c">// y = mx + b, b = y - mx </span>
    <span class="k1">float</span> b <span class="k3">=</span> y1 <span class="k3">-</span> m <span class="k3">*</span> x1<span class="k2">;</span>

    <span class="k1">return</span> <span class="k2">(</span>m <span class="k3">*</span> x <span class="k3">+</span> b<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

now pick any point on that line ax, ay
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">float</span> ax <span class="k3">=</span> <span class="n">100f</span><span class="k2">;</span>
<span class="k1">float</span> ay <span class="k3">=</span> getY<span class="k2">(</span>px, py, px <span class="k3">+</span> pxinc, py <span class="k3">+</span> pyinc, ax<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

1. calculate number of iterations of pxinc, pyinc to get to point (k)<br />2. calculate number of iterations of bxinc, byinx to get to point (l)</p><p>What is ratio?
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">float</span> pspeed <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>pxinc^<span class="n">2</span> <span class="k3">+</span> pyinc^<span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="c">// already have bullet speed</span>
<span class="k1">float</span> k <span class="k3">=</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span><span class="k2">(</span>px <span class="k3">-</span> ax<span class="k2">)</span>^<span class="n">2</span> <span class="k3">+</span> <span class="k2">(</span>py <span class="k3">-</span> ay<span class="k2">)</span>^<span class="n">2</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k3">/</span>pspeed<span class="k2">;</span>
<span class="k1">float</span> l <span class="k3">=</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span><span class="k2">(</span>bx <span class="k3">-</span> ax<span class="k2">)</span>^<span class="n">2</span> <span class="k3">+</span> <span class="k2">(</span>by <span class="k3">-</span> ay<span class="k2">)</span>^<span class="n">2</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k3">/</span>bspeed<span class="k2">;</span>
<span class="k1">float</span> ratio <span class="k3">=</span> l<span class="k3">/</span>k<span class="k2">;</span>
<span class="c">// save for later</span>
</pre></div></div><p>


calculate angle between 2 lines<br />cos(angle) = dotproduct(v1,v2) / (magnitude(v1)*magnitude(v2))<br />v1 = &lt;bx - px, by - py&gt;<br />v2 = &lt;bx - ax, by - ay&gt;</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">// line 1 - 1 to 2</span>
<span class="number">  2</span><span class="c">// line 2 - 3 to 2</span>
<span class="number">  3</span><span class="c">// point 2 is the shared point</span>
<span class="number">  4</span><span class="k1">float</span> calcAngle<span class="k2">(</span><span class="k1">float</span> x1, <span class="k1">float</span> y1, <span class="k1">float</span> x2, <span class="k1">float</span> y2, <span class="k1">float</span> x3, <span class="k1">float</span> y3<span class="k2">)</span>
<span class="number">  5</span><span class="k2">{</span>
<span class="number">  6</span>    <span class="k1">float</span> vx <span class="k3">=</span> x1 <span class="k3">-</span> x2<span class="k2">;</span>
<span class="number">  7</span>    <span class="k1">float</span> vy <span class="k3">=</span> y1 <span class="k3">-</span> y2<span class="k2">;</span>
<span class="number">  8</span>    <span class="k1">float</span> zx <span class="k3">=</span> x3 <span class="k3">-</span> x2<span class="k2">;</span>
<span class="number">  9</span>    <span class="k1">float</span> zy <span class="k3">=</span> y3 <span class="k3">-</span> y2<span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>    <span class="k1">float</span> dot <span class="k3">=</span> vx <span class="k3">*</span> zx <span class="k3">+</span> vy <span class="k3">*</span> zy<span class="k2">;</span>
<span class="number"> 12</span>    <span class="k1">float</span> magv <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>vx^<span class="n">2</span> <span class="k3">+</span> vy^<span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>    <span class="k1">float</span> magz <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>zx^<span class="n">2</span> <span class="k3">+</span> zy^<span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>
<span class="number"> 15</span>    <span class="k1">return</span> dot<span class="k3">/</span><span class="k2">(</span>magv <span class="k3">*</span> magz<span class="k2">)</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">// first calculate angle at player</span>
<span class="number"> 19</span><span class="k1">float</span> angleA <span class="k3">=</span> calcAngle<span class="k2">(</span>pxinc, pyinc, px, py, bx, by<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span><span class="c">// calculate ratioed angle of temp point and divide by ration to get full angle</span>
<span class="number"> 22</span><span class="k1">float</span> angleB <span class="k3">=</span> calcAngle<span class="k2">(</span>ax, ay, bx, by, px, py<span class="k2">)</span> <span class="k3">/</span> ratio<span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span><span class="c">// difference is angle C</span>
<span class="number"> 25</span><span class="k1">float</span> angleC <span class="k3">=</span> <span class="n">180</span>.<span class="n">0f</span> <span class="k3">-</span> <span class="k2">(</span>angleA <span class="k3">+</span> angleB<span class="k2">)</span><span class="k2">;</span>
</div></div><p>

Use law of sines to calculate the rest</p><p>sin(C)/c = sin(A)/a = sin(B)/b</p><p>we know c<br />a = csin(A)/sin(C)<br />b = csin(B)/sin(C)</p><p>!!!!WARNING!!!!<br />this may all be wrong as I have no way of verifying at the moment.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Fri, 18 Mar 2022 23:39:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Edgar, I can&#39;t just set a time and figure out the angle.</p><p>Well maybe I could if I could adjust the speed of the bullet.<br />But I can&#39;t, that is fixed.</p><p>There is a solution (actually two).</p><p>An exact time when the bullet fired will hit where the player will be be.</p><p>I can easily find the solution, my code works perfectly.</p><p>The equation that I posted earlier describes the conditions accurately.</p><p>I just don&#39;t have the mathematical skill to solve it for t.</p><p>So I have to try different values of t until I get close enough.</p><p>I don&#39;t claim that my solution is the only one. (or even a good one)<br />But I know that it works.</p><p>My math skills are limited, maybe that equation I posted does not have any easy way to isolate t.</p><p>Or maybe there is a completely different approach that I have not even thought of.</p><p>I just don&#39;t see how I can pick a value for t and then figure out the angle.</p><p>EDIT</p><p>OK maybe there is some misunderstanding here.<br />By time, I mean how long it will take the fired bullet to collide.</p><p>The time that the bullet is fired is always t=0, the speed is constant,<br />we know where the bullet originates...<br />All that is needed is what direction to fire to ensure a collision.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Weiss)</author>
		<pubDate>Sat, 19 Mar 2022 09:13:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Michael, assuming your theory and your math is correct, I solved for t. You&#39;ll still have to apply the quadratic equation to solve it though.</p><pre>
 t^2(pvx^2 + pvy^2 - bv^2)
+t^1(2pxpvx + 2pypvy - 2bxpvx - 2bypvy)
+t^0(px^2 + bx^2 + py^2 + by^2 - 2bxpx - 2bypy)
</pre><p>
Just apply the quadratic equation now, and you have your values for t.</p><p>I&#39;m going to work on finding angle from t. My approach would be to set a time (like say a few seconds) and then find the angle necessary to hit that time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 19 Mar 2022 19:07:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I came up with a quadratic but not quite the same as ER&#39;s. It cuts down on the maths chores if you set the origin to be where the bullet starts, and have the player relative to that, ie. work with x = px - bx and y = py - by instead of (px,py) and (bx,by).</p><p>The position of the player at time t  is (x + pxinc *t, y + pyinc * t) and the bullet is (bxinc*t, byinc*t). Equate the x-coords and y-coords separately, that&#39;s three unknowns, bxinc, byinc and t, with two equations - now add third equation bxinc^2 + byinc^2 = bspeed^2.</p><p>bxinc*t = x + pxinc*t (1)<br />byinc*t = y + pyinc*t (2)<br />bxinc^2 + byinc^2 = bspeed^2 (3)</p><p>I found it easiest to rewrite (3) as<br />bxinc^2 * t^2 + byinc^2 * t^2 = bspeed^2 * t^2 (4)</p><p>Square (1) and (2), substitute them in the LHS of (4)<br />(x + pxinc*t)^2 + (y + pyinc*t)^2 = bspeed^2 * t^2 (5)</p><p>Now you can expand the brackets and it&#39;s a quadratic in t. There are 2 solutions usually and you have to take the bigger (I don&#39;t know why or what the other one means!)<br />[edit] OK actually it should be the smallest one that is &gt;= 0. If both are negative then the shot is impossible.</p><p>When you have t then work out dx = x + pxinc*t and dy = y + pyinc*t (displacement to where the ship will be)<br />then bxinc = dx/sqrt(dx*dx+dy*dy)*bspeed  and byinc = dy/sqrt(dx*dx+dy*dy)*bspeed</p><p>Example code
</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="p">#include &lt;allegro5/allegro_primitives.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;random&gt;</span>
<span class="number">   5</span>
<span class="number">   6</span><span class="p">#define W 800</span>
<span class="number">   7</span><span class="p">#define H 600</span>
<span class="number">   8</span>
<span class="number">   9</span><span class="k1">static</span> <span class="k1">const</span> <span class="k1">float</span> bullet_speed <span class="k3">=</span> <span class="n">5</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  10</span>
<span class="number">  11</span><span class="k1">struct</span> thing <span class="k2">{</span>
<span class="number">  12</span>  <span class="k1">float</span> x<span class="k2">;</span>
<span class="number">  13</span>  <span class="k1">float</span> y<span class="k2">;</span>
<span class="number">  14</span>  <span class="k1">float</span> dx<span class="k2">;</span>
<span class="number">  15</span>  <span class="k1">float</span> dy<span class="k2">;</span>
<span class="number">  16</span>  <span class="k1">float</span> radius<span class="k2">;</span>
<span class="number">  17</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> color<span class="k2">;</span>
<span class="number">  18</span>  <span class="k1">float</span> speed<span class="k2">;</span>
<span class="number">  19</span>  <span class="k1">bool</span> active<span class="k2">;</span>
<span class="number">  20</span>  thing<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> c, <span class="k1">float</span> r, <span class="k1">float</span> s<span class="k2">)</span>
<span class="number">  21</span>      <span class="k2">:</span> color<span class="k2">(</span>c<span class="k2">)</span>, radius<span class="k2">(</span>r<span class="k2">)</span>, speed<span class="k2">(</span>s<span class="k2">)</span>, active<span class="k2">(</span><span class="k1">true</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span>
<span class="number">  22</span>  <span class="k1">void</span> move<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  23</span>    <span class="k1">if</span> <span class="k2">(</span>active<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  24</span>      x <span class="k3">+</span><span class="k3">=</span> dx<span class="k2">;</span>
<span class="number">  25</span>      y <span class="k3">+</span><span class="k3">=</span> dy<span class="k2">;</span>
<span class="number">  26</span>      <span class="k1">while</span> <span class="k2">(</span>x <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span>
<span class="number">  27</span>        x <span class="k3">+</span><span class="k3">=</span> <span class="k1">float</span><span class="k2">(</span>W<span class="k2">)</span><span class="k2">;</span>
<span class="number">  28</span>      <span class="k1">while</span> <span class="k2">(</span>x <span class="k3">&gt;</span><span class="k3">=</span> <span class="k1">float</span><span class="k2">(</span>W<span class="k2">)</span><span class="k2">)</span>
<span class="number">  29</span>        x <span class="k3">-</span><span class="k3">=</span> <span class="k1">float</span><span class="k2">(</span>W<span class="k2">)</span><span class="k2">;</span>
<span class="number">  30</span>      <span class="k1">while</span> <span class="k2">(</span>y <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span>
<span class="number">  31</span>        y <span class="k3">+</span><span class="k3">=</span> <span class="k1">float</span><span class="k2">(</span>H<span class="k2">)</span><span class="k2">;</span>
<span class="number">  32</span>      <span class="k1">while</span> <span class="k2">(</span>y <span class="k3">&gt;</span><span class="k3">=</span> <span class="k1">float</span><span class="k2">(</span>H<span class="k2">)</span><span class="k2">)</span>
<span class="number">  33</span>        y <span class="k3">-</span><span class="k3">=</span> <span class="k1">float</span><span class="k2">(</span>H<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>
<span class="number">  36</span>  <span class="k1">void</span> draw<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  37</span>    <span class="k1">if</span> <span class="k2">(</span>active<span class="k2">)</span>
<span class="number">  38</span>      <a href="http://www.allegro.cc/manual/al_draw_circle"><span class="a">al_draw_circle</span></a><span class="k2">(</span>x, y, radius, color, <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  39</span>  <span class="k2">}</span>
<span class="number">  40</span>  <span class="k1">void</span> setup<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  41</span>    <span class="k1">static</span> std::minstd_rand engine<span class="k2">;</span>
<span class="number">  42</span>    <span class="k1">double</span> theta<span class="k2">;</span>
<span class="number">  43</span>    x <span class="k3">=</span> std::uniform_real_distribution<span class="k3">&lt;</span>float&gt;<span class="k2">(</span><span class="n">0</span>.<span class="n">0f</span>, <span class="k1">float</span><span class="k2">(</span>W<span class="k2">)</span><span class="k2">)</span><span class="k2">(</span>engine<span class="k2">)</span><span class="k2">;</span>
<span class="number">  44</span>    y <span class="k3">=</span> std::uniform_real_distribution<span class="k3">&lt;</span>float&gt;<span class="k2">(</span><span class="n">0</span>.<span class="n">0f</span>, <span class="k1">float</span><span class="k2">(</span>H<span class="k2">)</span><span class="k2">)</span><span class="k2">(</span>engine<span class="k2">)</span><span class="k2">;</span>
<span class="number">  45</span>    theta <span class="k3">=</span> std::uniform_real_distribution<span class="k3">&lt;</span><span class="k3">&gt;</span><span class="k2">(</span><span class="k3">-</span><span class="n">1</span>.<span class="n">0</span>, <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">(</span>engine<span class="k2">)</span><span class="k2">;</span>
<span class="number">  46</span>    <span class="k1">switch</span> <span class="k2">(</span>std::uniform_int_distribution<span class="k3">&lt;</span><span class="k3">&gt;</span><span class="k2">(</span><span class="n">0</span>, <span class="n">3</span><span class="k2">)</span><span class="k2">(</span>engine<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  47</span>    <span class="k1">case</span> <span class="n">0</span><span class="k2">:</span> <span class="c">// top</span>
<span class="number">  48</span>      theta <span class="k3">+</span><span class="k3">=</span> M_PI <span class="k3">/</span> <span class="n">2</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number">  49</span>      y <span class="k3">=</span> <span class="n">20</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  50</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number">  51</span>    <span class="k1">case</span> <span class="n">1</span><span class="k2">:</span> <span class="c">// right</span>
<span class="number">  52</span>      theta <span class="k3">+</span><span class="k3">=</span> M_PI<span class="k2">;</span>
<span class="number">  53</span>      x <span class="k3">=</span> <span class="k1">float</span><span class="k2">(</span>W <span class="k3">-</span> <span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  54</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number">  55</span>    <span class="k1">case</span> <span class="n">2</span><span class="k2">:</span> <span class="c">// bottom</span>
<span class="number">  56</span>      theta <span class="k3">-</span><span class="k3">=</span> M_PI <span class="k3">/</span> <span class="n">2</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number">  57</span>      y <span class="k3">=</span> <span class="k1">float</span><span class="k2">(</span>H <span class="k3">-</span> <span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  58</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number">  59</span>    <span class="k1">case</span> <span class="n">3</span><span class="k2">:</span>  <span class="c">// left</span>
<span class="number">  60</span>    default: <span class="c">// can't happen</span>
<span class="number">  61</span>      x <span class="k3">=</span> <span class="n">20</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  62</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number">  63</span>    <span class="k2">}</span>
<span class="number">  64</span>    dx <span class="k3">=</span> <span class="k1">float</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>theta<span class="k2">)</span><span class="k2">)</span> <span class="k3">*</span> speed<span class="k2">;</span>
<span class="number">  65</span>    dy <span class="k3">=</span> <span class="k1">float</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>theta<span class="k2">)</span><span class="k2">)</span> <span class="k3">*</span> speed<span class="k2">;</span>
<span class="number">  66</span>    active <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  67</span>  <span class="k2">}</span>
<span class="number">  68</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  69</span>
<span class="number">  70</span>thing fire<span class="k2">(</span><span class="k1">const</span> thing <span class="k3">&amp;</span>from, <span class="k1">const</span> thing <span class="k3">&amp;</span>to<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  71</span>  <span class="k1">float</span> x <span class="k3">=</span> to.x <span class="k3">-</span> from.x<span class="k2">;</span>
<span class="number">  72</span>  <span class="k1">float</span> y <span class="k3">=</span> to.y <span class="k3">-</span> from.y<span class="k2">;</span>
<span class="number">  73</span>  <span class="k1">float</span> r2 <span class="k3">=</span> x <span class="k3">*</span> x <span class="k3">+</span> y <span class="k3">*</span> y<span class="k2">;</span>
<span class="number">  74</span>
<span class="number">  75</span>  thing bullet<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">128</span>, <span class="n">128</span>, <span class="n">128</span><span class="k2">)</span>, <span class="n">2</span>.<span class="n">0f</span>, bullet_speed<span class="k2">)</span><span class="k2">;</span>
<span class="number">  76</span>  <span class="k1">float</span> A <span class="k3">=</span> to.dx <span class="k3">*</span> to.dx <span class="k3">+</span> to.dy <span class="k3">*</span> to.dy <span class="k3">-</span> bullet_speed <span class="k3">*</span> bullet_speed<span class="k2">;</span>
<span class="number">  77</span>  <span class="k1">float</span> B <span class="k3">=</span> x <span class="k3">*</span> to.dx <span class="k3">+</span> y <span class="k3">*</span> to.dy<span class="k2">;</span>
<span class="number">  78</span>  <span class="k1">float</span> rt <span class="k3">=</span> B <span class="k3">*</span> B <span class="k3">-</span> A <span class="k3">*</span> r2<span class="k2">;</span>
<span class="number">  79</span>  <span class="k1">if</span> <span class="k2">(</span>rt <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  80</span>    <span class="k1">float</span> t <span class="k3">=</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>rt<span class="k2">)</span> <span class="k3">-</span> B<span class="k2">)</span> <span class="k3">/</span> A<span class="k2">;</span>
<span class="number">  81</span>    <span class="k1">float</span> t_alt <span class="k3">=</span> <span class="k2">(</span><span class="k3">-</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>rt<span class="k2">)</span> <span class="k3">-</span> B<span class="k2">)</span> <span class="k3">/</span> A<span class="k2">;</span>
<span class="number">  82</span>    <span class="k1">if</span> <span class="k2">(</span>t <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  83</span>      t <span class="k3">=</span> t_alt<span class="k2">;</span>
<span class="number">  84</span>    <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number">  85</span>      <span class="k1">if</span> <span class="k2">(</span>t_alt <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  86</span>        t <span class="k3">=</span> std::min<span class="k2">(</span>t, t_alt<span class="k2">)</span><span class="k2">;</span>
<span class="number">  87</span>      <span class="k2">}</span>
<span class="number">  88</span>    <span class="k2">}</span>
<span class="number">  89</span>    <span class="k1">if</span> <span class="k2">(</span>t <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  90</span>      <span class="k1">float</span> vx <span class="k3">=</span> x <span class="k3">+</span> to.dx <span class="k3">*</span> t<span class="k2">;</span>
<span class="number">  91</span>      <span class="k1">float</span> vy <span class="k3">=</span> y <span class="k3">+</span> to.dy <span class="k3">*</span> t<span class="k2">;</span>
<span class="number">  92</span>      <span class="k1">float</span> v <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>vx <span class="k3">*</span> vx <span class="k3">+</span> vy <span class="k3">*</span> vy<span class="k2">)</span> <span class="k3">/</span> bullet_speed<span class="k2">;</span>
<span class="number">  93</span>      bullet.dx <span class="k3">=</span> vx <span class="k3">/</span> v<span class="k2">;</span>
<span class="number">  94</span>      bullet.dy <span class="k3">=</span> vy <span class="k3">/</span> v<span class="k2">;</span>
<span class="number">  95</span>      bullet.x <span class="k3">=</span> from.x<span class="k2">;</span>
<span class="number">  96</span>      bullet.y <span class="k3">=</span> from.y<span class="k2">;</span>
<span class="number">  97</span>      <span class="k1">return</span> bullet<span class="k2">;</span>
<span class="number">  98</span>    <span class="k2">}</span>
<span class="number">  99</span>  <span class="k2">}</span>
<span class="number"> 100</span>  <span class="c">// Bullet can't reach the target</span>
<span class="number"> 101</span>  bullet.active <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 102</span>  <span class="k1">return</span> bullet<span class="k2">;</span>
<span class="number"> 103</span><span class="k2">}</span>
<span class="number"> 104</span>
<span class="number"> 105</span><span class="k1">bool</span> collide<span class="k2">(</span><span class="k1">const</span> thing <span class="k3">&amp;</span>a, <span class="k1">const</span> thing <span class="k3">&amp;</span>b<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 106</span>  <span class="k1">float</span> r2 <span class="k3">=</span> <span class="k2">(</span>a.x <span class="k3">-</span> b.x<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>a.x <span class="k3">-</span> b.x<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>a.y <span class="k3">-</span> b.y<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>a.y <span class="k3">-</span> b.y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 107</span>  <span class="k1">return</span> r2 <span class="k3">&lt;</span> a.radius <span class="k3">+</span> b.radius<span class="k2">;</span>
<span class="number"> 108</span><span class="k2">}</span>
<span class="number"> 109</span>
<span class="number"> 110</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span>, <span class="k1">char</span> <span class="k3">*</span><span class="k2">[</span><span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 111</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="k2">;</span>
<span class="number"> 112</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"> 113</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</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>W, H<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 114</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a> <span class="k3">*</span>timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> <span class="n">30</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 115</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>queue <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"> 116</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>queue, <a href="http://www.allegro.cc/manual/al_get_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"> 117</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>queue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 118</span>  <span class="k1">bool</span> running <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 119</span>  <span class="k1">bool</span> advance <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 120</span>  thing ship<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">128</span>, <span class="n">128</span><span class="k2">)</span>, <span class="n">10</span>.<span class="n">0f</span>, <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 121</span>  thing ufo<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">128</span>, <span class="n">255</span>, <span class="n">128</span><span class="k2">)</span>, <span class="n">10</span>.<span class="n">0f</span>, <span class="n">2</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 122</span>  thing bullet<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">128</span>, <span class="n">128</span>, <span class="n">128</span><span class="k2">)</span>, <span class="n">2</span>.<span class="n">0f</span>, <span class="n">5</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 123</span>  ship.setup<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 124</span>  ufo.setup<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 125</span>  bullet.active <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 126</span>  <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 127</span>  <span class="k1">while</span> <span class="k2">(</span>running<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 128</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"> 129</span>    <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>queue, nullptr<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 130</span>    <span class="k1">while</span> <span class="k2">(</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>queue, <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 131</span>      <span class="k1">if</span> <span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 132</span>        running <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 133</span>      <span class="k2">}</span> <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 134</span>        advance <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 135</span>      <span class="k2">}</span>
<span class="number"> 136</span>      <span class="k1">if</span> <span class="k2">(</span>advance<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 137</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">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"> 138</span>        ufo.draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 139</span>        bullet.draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 140</span>        ship.draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 141</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"> 142</span>        ufo.move<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 143</span>        bullet.move<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 144</span>        ship.move<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 145</span>        <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>bullet.active<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 146</span>          bullet <span class="k3">=</span> fire<span class="k2">(</span>ufo, ship<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 147</span>        <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 148</span>          <span class="k1">if</span> <span class="k2">(</span>collide<span class="k2">(</span>bullet, ship<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 149</span>            ship.active <span class="k3">=</span> bullet.active <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 150</span>          <span class="k2">}</span>
<span class="number"> 151</span>        <span class="k2">}</span>
<span class="number"> 152</span>        <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>ship.active<span class="k2">)</span>
<span class="number"> 153</span>          ship.setup<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 154</span>      <span class="k2">}</span>
<span class="number"> 155</span>    <span class="k2">}</span>
<span class="number"> 156</span>  <span class="k2">}</span>
<span class="number"> 157</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 158</span><span class="k2">}</span>
</div></div><p>

The <span class="source-code">fire</span> function is the important bit, all the rest is fluff to provide a runnable demo
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Sat, 19 Mar 2022 21:21:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wow!</p><p>Thanks to all you guys for your help and insights.</p><p>I am going to try to work through them, but it will take some time.</p><p>I spent a few hours adding a page to my documentation where I describe my approach in great detail.</p><p><a href="https://mweiss001.github.io/bullets.html">https://mweiss001.github.io/bullets.html</a></p><p>I hope to understand the answers I have gotten from you guys and update my bullet page. (with credits due to all who helped)</p><p>Thanks again!</p><p>I am in awe of the level of technical knowledge here!</p><p>UPDATE</p><p>I tried Edgar&#39;s solution and it worked perfectly...<br />I guess my math skills are not what they could be.</p><p>Thank you Edgar! You are so smart and helpful.<br />Sorry I didn&#39;t understand your answer when you first posted it.</p><p>Here is how I patched it into my code.<br />(for testing only, later I will redo it with fixed numbers)</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> fire_enemy_bulleta<span class="k2">(</span><span class="k1">int</span> EN, <span class="k1">int</span> bullet_ans, <span class="k1">int</span> p<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>   <span class="k1">float</span> bx <span class="k3">=</span> Efi<span class="k2">[</span>EN<span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  4</span>   <span class="k1">float</span> by <span class="k3">=</span> Efi<span class="k2">[</span>EN<span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  5</span>   <span class="k1">float</span> bv <span class="k3">=</span> Efi<span class="k2">[</span>EN<span class="k2">]</span><span class="k2">[</span><span class="n">7</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  6</span>   <span class="k1">float</span> px  <span class="k3">=</span> players<span class="k2">[</span>p<span class="k2">]</span>.PX<span class="k2">;</span>
<span class="number">  7</span>   <span class="k1">float</span> py  <span class="k3">=</span> players<span class="k2">[</span>p<span class="k2">]</span>.PY<span class="k2">;</span>
<span class="number">  8</span>   <span class="k1">float</span> pvx <span class="k3">=</span> players<span class="k2">[</span>p<span class="k2">]</span>.xinc<span class="k2">;</span>
<span class="number">  9</span>   <span class="k1">float</span> pvy <span class="k3">=</span> players<span class="k2">[</span>p<span class="k2">]</span>.yinc<span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>   <span class="k1">float</span> A <span class="k3">=</span> <span class="k2">(</span>pvx<span class="k3">*</span>pvx<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>pvy<span class="k3">*</span>pvy<span class="k2">)</span> <span class="k3">-</span> <span class="k2">(</span>bv<span class="k3">*</span>bv<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>   <span class="k1">float</span> B <span class="k3">=</span> <span class="n">2</span><span class="k3">*</span><span class="k2">(</span>px<span class="k3">*</span>pvx<span class="k2">)</span> <span class="k3">+</span> <span class="n">2</span><span class="k3">*</span><span class="k2">(</span>py<span class="k3">*</span>pvy<span class="k2">)</span> <span class="k3">-</span><span class="n">2</span><span class="k3">*</span><span class="k2">(</span>bx<span class="k3">*</span>pvx<span class="k2">)</span> <span class="k3">-</span><span class="n">2</span><span class="k3">*</span><span class="k2">(</span>by<span class="k3">*</span>pvy<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>   <span class="k1">float</span> C <span class="k3">=</span> <span class="k2">(</span>px<span class="k3">*</span>px<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>bx<span class="k3">*</span>bx<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>py<span class="k3">*</span>py<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>by<span class="k3">*</span>by<span class="k2">)</span> <span class="k3">-</span> <span class="n">2</span><span class="k3">*</span><span class="k2">(</span>bx<span class="k3">*</span>px<span class="k2">)</span> <span class="k3">-</span><span class="n">2</span><span class="k3">*</span><span class="k2">(</span>by<span class="k3">*</span>py<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>   <span class="k1">float</span> t <span class="k3">=</span> <span class="k2">(</span> <span class="k3">-</span>B <span class="k3">-</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span><span class="k2">(</span>B<span class="k3">*</span>B<span class="k2">)</span> <span class="k3">-</span> <span class="n">4</span><span class="k3">*</span><span class="k2">(</span>A<span class="k3">*</span>C<span class="k2">)</span><span class="k2">)</span> <span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span><span class="n">2</span> <span class="k3">*</span> A<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> px1 <span class="k3">=</span> px <span class="k3">+</span> <a href="http://www.allegro.cc/manual/al_fixmul"><span class="a">al_fixmul</span></a><span class="k2">(</span>pvx, <a href="http://www.allegro.cc/manual/al_ftofix"><span class="a">al_ftofix</span></a><span class="k2">(</span>t<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// get player target position based on t</span>
<span class="number"> 17</span>   <a href="http://www.allegro.cc/manual/al_fixed"><span class="a">al_fixed</span></a> py1 <span class="k3">=</span> py <span class="k3">+</span> <a href="http://www.allegro.cc/manual/al_fixmul"><span class="a">al_fixmul</span></a><span class="k2">(</span>pvy, <a href="http://www.allegro.cc/manual/al_ftofix"><span class="a">al_ftofix</span></a><span class="k2">(</span>t<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>   fire_enemy_bulletz<span class="k2">(</span>EN, bullet_ans, px1, py1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Weiss)</author>
		<pubDate>Sat, 19 Mar 2022 23:09:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Good stuff. If you take your final equation, square both sides and substitute x = px - bx and y = py - by then it&#39;s the same as my equation (5) so I think we agree. Which is a relief!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Sun, 20 Mar 2022 00:18:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Peter, I worked through your solution and it works just the same.<br />Like you said, the math is slightly simpler.</p><p>Thank you for all the time and effort you put into helping me.</p><p>EDIT</p><p>I have fully implemented this new bullet firing strategy.<br />And updated my documentation at:<br /><a href="https://mweiss001.github.io/purple_martians/bullets">https://mweiss001.github.io/purple_martians/bullets</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Weiss)</author>
		<pubDate>Sun, 20 Mar 2022 01:38:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You will have to check your code for division by A=0 and for a negative B^2 - 4AC discriminant.</p><p>I am coming up with a different, more general solution. I&#39;ll let you know when it&#39;s done.</p><p>It&#39;s taken me about a week to get the math right but I think I have it. t from theta and theta from t.</p><p><span class="remote-thumbnail"><span class="json">{"name":"613155","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/8\/d\/8d3e173992e3fdfc9e2b91ce552c5926.png","w":3072,"h":4096,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/8\/d\/8d3e173992e3fdfc9e2b91ce552c5926"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/8/d/8d3e173992e3fdfc9e2b91ce552c5926-240.jpg" alt="613155" width="240" height="320" /></span></p><p>So everything is derived from Dx(t) and Dy(t), the x and y distance between the player and the projectile based on time.</p><pre>
(0a) DX(t) = dx + pvx*t - bvz*t*cos(theta) = 0
(0b) DY(t) = dy + pvy*t - bvz*t*sin(theta) = 0
</pre><p>
dx and dy are the starting distance between the player and the launcher. pvx and pvy are the x and y velocity of the player. bvz is the magnitude of the velocity of the projectile. t is time and theta is the angle of the launcher&#39;s aim.</p><p>Since we need the x and y distance between the projectile and the player to be 0 we can set them equal to zero and henceforth equal to each other. Then it is a matter of separating t and theta depending on which we want to solve for.</p><p>The base equation is thus :
</p><pre>
(1) bvz*t*(cos(theta) - sin(theta)) = (pvy - pvx)*t + (dy - dx)
</pre><p>

Solve 0b for sin(theta) and cos(theta) and then form tan(theta) using the two as sin(theta) / cos(theta). Then take the arctangent (2) of both sides and you have the angle necessary. You can also solve for t in one and substitute in the other.</p><p><b>UPDATE</b><br />So the formulas for the angle at time t are as follows :</p><p>(I wish Matthew would fix those darn MathML thingies or Latex or w/e it was.)</p><pre>
sin(theta) = (dy + pvy*t)/bvz*t

cos(theta) = (dx + pvx*t)/bvz*t

tan(theta) = ((dy/bvz*t + pvy/bvz) / (dx/bvz*t + pvx/bvz)) = DY/DX
</pre><p>

Just send that mess to atan2 as <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_50.html" target="_blank">atan2</a><span class="k2">(</span>DY,DX<span class="k2">)</span><span class="k2">;</span></span>.</p><p>And then similarly you can also solve for t from a given angle to aim at and it will tell you if it is possible or not.</p><p>I think the equation is this : (I&#39;ve been staring at this all week)
</p><pre>
t^2 * (pvx-pvy)^2 - bvz^2 * (1 - sin(2*theta)) +
t^1 * 2*(pvy-pvy)(dx-dy) +
t^0 * (dx - dy)^2
</pre><p>

Then you have another quadratic equation.<br />\frac{-B +/-sqrt(B^2 - 4AC)}{2*A}</p><p>I will try to explain better later. Don&#39;t want the thread to lock.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 04 Apr 2022 18:58:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If player is headed directly to or directly away, the following won&#39;t work</p><p>Take your 3 points and make a triangle</p><p><span class="remote-thumbnail"><span class="json">{"name":"613158","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/a\/7\/a7bdfc4beef455bda1d9bdcb5684873a.png","w":615,"h":355,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/a\/7\/a7bdfc4beef455bda1d9bdcb5684873a"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/a/7/a7bdfc4beef455bda1d9bdcb5684873a-240.jpg" alt="613158" width="240" height="138" /></span></p><p>point p = player<br />point b = bullet<br />point x = collision (unknown)</p><p>side a = p to x, distance = t * pv<br />side b = b to x, distance = t * bv<br />side c = p to x, distance we can calculate = sqrt((bx - px)^2 + (by - py)^2)</p><p>divide all 3 by time (t) to make it easier later on</p><p>a = pv, which we know<br />b = bv, which we know<br />c = sqrt((bx - px)^2 + (by - py)^2)/t</p><p>angles<br />B = we can calculate using &quot;angle between two vectors&quot; formula</p><p>v1 = (bx - px, by - py)<br />v2 = (pvx, pvy)</p><p>cos(angle) = (v1 . v2)/(||v1||||v2||) // dot product divided by magnitudes</p><p>dot product:<br />(v1 . v2) = v1.x * v2.x + v1.y * v2.y</p><p>magnitude:<br />||v1|| = sqrt(v1.x^2 + v1.y^2)<br />||v2|| = sqrt(v2.x^2 + v2.y^2)</p><p>Law of Sines<br />sin(B)/b = sin(A)/a = sin(C)/c</p><p>sin(B)/b = sin(A)/a<br />rearrange<br />sin(A) = asin(B)/b<br />A = arcsin(asin(B)/b)</p><p>we know B, b and a so calculate A</p><p>Use to A and B to calculate final angle C</p><p>C = pi - A - B (or 180deg - A - B)</p><p>Law of cosines<br />c^2 = a^2 + b^2 - 2abcos(C)</p><p>((bx - px)^2 + (by - py)^2)/t^2 = pv^2 + bv^2 - 2*pv*bv*cos(C)</p><p>t^2 = ((bx - px)^2 + (by - py)^2) / (pv^2 + bv^2 - 2*pv*bv*cos(C))</p><p>t = sqrt(((bx - px)^2 + (by - py)^2) / (pv^2 + bv^2 - 2*pv*bv*cos(C)))</p><p>My head hurts!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Tue, 05 Apr 2022 02:46:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>DanielH<br />I&#39;m trying to follow your math. Yeah, it makes me dizzy too. ;p</p><p>I&#39;m writing a simple game to test my theories. Don&#39;t want the thread to lock! :X
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 11 Apr 2022 18:10:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><a href="https://www.desmos.com/calculator/rury746m4s">This</a> is what I was referring to.</p><p><span class="remote-thumbnail"><span class="json">{"name":"613172","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/a\/6\/a60603168a8cc3dee45134ec2332f6df.png","w":616,"h":574,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/a\/6\/a60603168a8cc3dee45134ec2332f6df"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/a/6/a60603168a8cc3dee45134ec2332f6df-240.jpg" alt="613172" width="240" height="223" /></span></p><p>***** this graph only works if bullet is to the right of player, Would need alteration otherwise, bullet speed must also not be too low or will never reach player ******</p><p>What you can adjust:<br />A is angle relative to B (not absolute)<br />p1 is player<br />p2 is bullet start<br />v1 is player speed<br />v2 is bullet speed</p><p>Other stuff below that:<br />j = horizontal difference bullet to player<br />k = vertical difference bullet to player<br />l = distance bullet to player<br />F = angle relative to x axes<br />B = bullet angle from player to collision<br />C = collision angle from player to bullet<br />c = distance using speed (player and bullet) alone<br />t = actual distance / speed distance = number of iterations until collision<br />p3 and p4 is the point of collision using absolute angles from p1 and p2 respectively
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Wed, 13 Apr 2022 22:41:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve been trying to solve this myself and I just can&#39;t get it right. I come up with something different every time, and even when I plug in the equation I came up with for Michael Weiss it still doesn&#39;t work. My times are negative always.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 20 Apr 2022 21:20:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sometimes I struggled with these problems as well. Then something clicked.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Wed, 20 Apr 2022 22:57:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I know this part is right.</p><pre>
(0a) DX(t) = dx + pvx*t - bvz*t*cos(theta) = 0
(0b) DY(t) = dy + pvy*t - bvz*t*sin(theta) = 0

sin(theta) = (dy + pvy*t)/bvz*t

cos(theta) = (dx + pvx*t)/bvz*t

tan(theta) = ((dy/bvz*t + pvy/bvz) / (dx/bvz*t + pvx/bvz)) = DY/DX
</pre><p>
This is the angle at time t. But t is still unknown.</p><p>So go back to 0a and 0b. Solve for t. I did that, like 5 times. I came up with something different like three times. Grr. I&#39;ve got a little demo setup that has a plane and a tank and the tank shoots at the plane, but t is negative.</p><p>Now, next (just now) I read carefully through your last explanation. I follow most of it, but how can you possibly calculate v2.x and v2.y??? You don&#39;t know the angle to shoot at! So that leaves B undefined and the whole mess falls apart.</p><p>After that I visited your link. Neat tutorial. Neat diagram. How do they calculate A? Do they define theta (the angle the bullet travels) ? That&#39;s v2.x and v2.y, which is unknown.</p><p>I&#39;m missing something.</p><p><img src="http://www.allegro.cc/forums/smileys/embarassed.gif" alt=":-[" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 21 Apr 2022 04:47:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Similar triangles</p><p>Assumptions: bullet speed should be known even if we don&#39;t know direction. Normally a constant.</p><p>Small triangle sides:<br />a = known = player speed<br />b = known = bullet speed - direction unknown but irrelevant at this point<br />c = unknown</p><p>Small triangle angles:<br />A = known<br />B = unknown<br />C = unknown</p><p>Big triangle sides:<br />a = t * player speed<br />b = t * bullet speed<br />c = distance p to b</p><p>Using small triangle, solve the rest.</p><p>Law of Sines:<br />sin(A)/a = sin(B)/b = sin(C)/c</p><p>Since we know b, use it to solve for B.<br />B = arcsin(b * sin(A) / a)</p><p>Solve C<br />C = 180 - A - B</p><p>Law of cosines:<br />c^2 = a^2 + b^2 - 2ab*cos(C)<br />c = sqrt(a^2 + b^2 - 2ab*cos(C))</p><p>Time t is the ratio of c from large triangle to c from small triangle.</p><p>t = large c / small c</p><p>The angles are relative to each and not absolute to the x/y axes. In my example, I added the offset.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Thu, 21 Apr 2022 06:50:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I mostly understand your code, but I don&#39;t know where you are getting bv.x and bv.y from for your cos angle trick.</p><p>Bump so the thread doesn&#39;t close. <img src="http://www.allegro.cc/forums/smileys/angry.gif" alt="&gt;:(" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 28 Apr 2022 06:31:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here is the <a href="https://www.desmos.com/calculator/rury746m4s">link</a> again.</p><p>Going down the list line by line:</p><p>1 through 5 are adjustable. You can manually change or drag the points around.</p><p>1. p1 is player position<br />2. p2 is bullet position<br />3. A is angle player is traveling (relative to the line p1 to p2 not the x axis)<br />4. v1 is player speed<br />5. v2 is bullet speed</p><p>make an imaginary triangle<br />6. j is horizontal distance p2 to p1<br />7. k is vertical distance p2 to p1<br />8. l is absolute distance p2 to p1</p><p>9. F is angle from x axis to the line p2 to p1</p><p>10 I meant to remove (it is duplicated at line 18)</p><p>11. calculate B - using the similar triangle method I described earlier (law of sines)<br />12. calculate C<br />13. calculate c of smaller similar triangle where a = pv and b = bv and using C (law of cosines)<br />14. calculate time t based of the two similar c&#39;s, where l is c from big triangle</p><p>Next 2 lines 15 and 16 I calculate collision point using both A and B<br />(A + F) is absolute angle to x axis of player to collision<br />(180 - B + F) is absolute angle to x axis of bullet to collision<br />I have 90 + 90 - (B - F) so I could visualize it in my head while I was doing it. Starting at 90 how much to add 90 - (B - F).</p><p><span class="remote-thumbnail"><span class="json">{"name":"613192","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/e\/0\/e07b47d697607193b4119438b8663fd2.png","w":576,"h":538,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/e\/0\/e07b47d697607193b4119438b8663fd2"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/e/0/e07b47d697607193b4119438b8663fd2-240.jpg" alt="613192" width="240" height="224" /></span></p><p>15. calculate point p3 = player + time * speed * angle<br />16. calculate point p4 = bullet + time * speed * angle</p><p>this part of that is where we get bv.x and bv.y<br />bv.x = bv * cos(180 - B + F)<br />bv.y = bv * sin(180 - B + F)</p><p>p4.x = bullet.x + time * bv.x<br />p4.y = bullet.y + time * bv.y</p><p>17, 18 and 19 are lines drawn between the points with limits put in
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Thu, 28 Apr 2022 07:55:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t see which triangles are similar. Can you let me know?</p><p>I finally gave up and tried the equation I provided to Michael based on his formula and it works perfectly. I now have a little tank shooting down an airplane. I don&#39;t know if I&#39;ll develop it further, but at least now I have proof of concept.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 01 May 2022 19:17:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>2 triangles.</p><p>The &quot;big&quot; triangle has 3 sides.</p><p>Side a is a vector where start is player and end is collision<br />Length a = time * player speed</p><p>Side b is a vector where start is bullet and end is also collision.<br />Length b = time * bullet speed</p><p>Side c is a vector where start is player and end is bullet</p><p>We don&#39;t know time so we can&#39;t calculate a or b. We can calculate c with distance formula.</p><p>&quot;Small&quot; triangle is a similar triangle where all sides lengths are divided by time<br />a = player speed<br />b = bullet speed<br />c = unknown</p><p>In my example I used trig to calculate small c. Then take ratio of big c to little c to calculate time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Mon, 02 May 2022 05:12:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wow! I have been away for a while and I come back to find all this cool discussion.</p><p>When I have time I will see if I can wrap my head around these new concepts.</p><p>Thank you all for working on my little math problem.<br />I find the discussion fascinating....</p><p>I was pretty sure there were multiple ways to get the answer.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Weiss)</author>
		<pubDate>Mon, 02 May 2022 17:35:29 +0000</pubDate>
	</item>
</rss>
