toasters.rocks/ecco-the-dolphin/index.html

178 lines
46 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html><html lang=en><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=/img/icon.png type=image/png><meta name=generator content="Hugo 0.105.0"><meta property="og:title" content="ecco the dolphin"><meta property="og:description" content="Let's recreate this weird effect from Ecco the Dolphin."><meta property="og:type" content="article"><meta property="og:url" content="http://toasters.rocks/ecco-the-dolphin/"><meta property="og:image" content="http://toasters.rocks/images/2019/11/background.png"><meta property="article:section" content><meta property="article:published_time" content="2019-11-29T02:47:27+00:00"><meta property="article:modified_time" content="2019-12-01T06:13:10+00:00"><meta name=twitter:card content="summary_large_image"><meta name=twitter:image content="http://toasters.rocks/images/2019/11/background.png"><meta name=twitter:title content="ecco the dolphin"><meta name=twitter:description content="Let's recreate this weird effect from Ecco the Dolphin."><meta name=theme-color content="#660066"><title>ecco the dolphin - toasters rocks</title><link rel=stylesheet href=http://toasters.rocks/css/toastersrocks.min.css></head><body><header><img src=/img/icon.png><h1>toasters rocks</h1></header><main><aside><nav><a href=/><i class="fas fa-home"></i>
Home</a><br><a href=http://juju2143.ca/><i class="fas fa-user"></i>
About</a><br><a href=/fr/><i class="fas fa-globe"></i>
Français</a><br><a href=https://yukiis.moe/><i class="far fa-comment"></i>
Comics</a><br><a href=https://codewalr.us/><i class="far fa-folder-open"></i>
Forums</a><br></nav><br><nav><a title="Twitter " href=https://twitter.com/juju2143><i style=color:#4da7de class="fab fa-twitter"></i>
<span style=color:#4da7de>Twitter</span></a><br><a title="Discord " href=https://discord.gg/cuZcfcF><i style=color:#7289da class="fab fa-discord"></i>
<span style=color:#7289da>Discord</span></a><br><a title="GitHub " href=https://github.com/juju2143><i style=color:#fafafa class="fab fa-github"></i>
<span style=color:#fafafa>GitHub</span></a><br><a title="Patreon " href=https://patreon.com/juju2143><i style=color:#f96854 class="fab fa-patreon"></i>
<span style=color:#f96854>Patreon</span></a><br><a title="YouTube " href=https://youtube.com/user/julosoft><i style=color:#e02a20 class="fab fa-youtube"></i>
<span style=color:#e02a20>YouTube</span></a><br><a title="YouTube 2 " href=https://youtube.com/c/juju2143><i style=color:#e02a20 class="fab fa-youtube"></i>
<span style=color:#e02a20>YouTube 2</span></a><br><a title="Twitch " href=https://twitch.tv/juju2143><i style=color:#6441a5 class="fab fa-twitch"></i>
<span style=color:#6441a5>Twitch</span></a><br><a title="Instagram " href=https://instagram.com/j.p.savard><i style=color:#d6249f class="fab fa-instagram"></i>
<span style=color:#d6249f>Instagram</span></a><br><a title="DeviantArt " href=https://deviantart.com/juju2143><i style=color:#c5d200 class="fab fa-deviantart"></i>
<span style=color:#c5d200>DeviantArt</span></a><br><a title="SoundCloud " href=https://soundcloud.com/juju2143><i style=color:#fe3801 class="fab fa-soundcloud"></i>
<span style=color:#fe3801>SoundCloud</span></a><br></nav></aside><article style=background-image:url(/images/2019/11/background.png)><div class=metadata style="height:calc((var(--height) - 2em) * .5833333333333334 - 3.5em)"><h2 name=top>ecco the dolphin</h2><p>Let's recreate this weird effect from Ecco the Dolphin.</p><i class="far fa-calendar-alt"></i>
<time datetime=2019-11-29>November 29, 2019</time><br><i class="fas fa-tags"></i>
#<a class="btn btn-sm btn-outline-dark tag-btn" href=http://toasters.rocks/tags/experiments>Experiments</a>
#<a class="btn btn-sm btn-outline-dark tag-btn" href=http://toasters.rocks/tags/p5.js>p5.js</a><br><i class="fas fa-hourglass"></i> ~6 minutes</div><script src=https://unpkg.com/p5@^0.10/lib/p5.min.js></script>
<script>var shifts="gDkZcB510pQ:3pSf]>4oLh>41pS;nWd_@lYcB5oT;nJ82pSfCkH7nV<3oL82pN9nV<31pNhc_?lH7nKiE6210000pOgcB5oL82pN931pOg>mWe^aA5110pO9nKhAlYdCkG7oL8nVe^a`@5oL82pSf>lXd^?lX=3oM9nV<31pNhEjF6oL8nJiEjF6oU;310pQ:3pSfC6oU;mW=41pN9nK8nJ8nV;nV<310000pPgD6oUe]>4oL9nVe^a`@";function preload(){img=loadImage("/images/2019/11/background.png")}function setup(){var e=createCanvas(320,224);e.parent("sketch-holder")}function draw(){for(var e=0;e<height;e++)image(img,0,e,width,1,shifts.charCodeAt(e+frameCount&255)-48,e,width,1)}</script><p> </p><div id=sketch-holder></div><p>Welcome to the second installment of my code experiments! This time we&rsquo;re gonna look into the weird effect used in the background of messages in Ecco the Dolphin for the Sega Genesis (or MegaDrive, if you&rsquo;re asking someone outside the Americas). I got the idea from Twitter user @Foone who helpfully reverse engineered the game ROM (with Twitter user @Reaper_man02) to figure out how it works and wrote an implementation in Python. Then I went ahead and adapted it in p5.js.</p><p><blockquote class=twitter-tweet><p lang=en dir=ltr>it won't look great here (THANKS, TWITTER)<br>but I've finished reverse engineering the Ecco the Dolphin background distortion effect.<br>This is the output of the script provided here:<a href=https://t.co/oPUb3tJJAC>https://t.co/oPUb3tJJAC</a> <a href=https://t.co/UQtW4ZyTKu>pic.twitter.com/UQtW4ZyTKu</a></p>&mdash; foone🏳 (@Foone) <a href="https://twitter.com/Foone/status/1199590443538796549?ref_src=twsrc%5Etfw">November 27, 2019</a></blockquote><script async src=https://platform.twitter.com/widgets.js></script>
Read the replies for some explanations.</p><p>Turns out it&rsquo;s pretty simple: there&rsquo;s a table in ROM, it&rsquo;s basically how much each line should be shifted in the x axis. Then for each frame we shift the values around so it looks like it&rsquo;s scrolling.</p><p><img src=/images/2019/11/background.png alt>
Base image.</p><div class=highlight><div class=chroma><table class=lntable><tr><td class=lntd><pre tabindex=0 class=chroma><code><span class=lnt> 1
</span><span class=lnt> 2
</span><span class=lnt> 3
</span><span class=lnt> 4
</span><span class=lnt> 5
</span><span class=lnt> 6
</span><span class=lnt> 7
</span><span class=lnt> 8
</span><span class=lnt> 9
</span><span class=lnt>10
</span><span class=lnt>11
</span><span class=lnt>12
</span><span class=lnt>13
</span><span class=lnt>14
</span><span class=lnt>15
</span><span class=lnt>16
</span><span class=lnt>17
</span><span class=lnt>18
</span><span class=lnt>19
</span><span class=lnt>20
</span><span class=lnt>21
</span><span class=lnt>22
</span><span class=lnt>23
</span></code></pre></td><td class=lntd><pre tabindex=0 class=chroma><code class=language-js data-lang=js><span class=line><span class=cl><span class=kd>function</span> <span class=nx>generate_for_offsets</span><span class=p>(</span><span class=nx>offset</span><span class=p>)</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=kd>var</span> <span class=nx>SCREEN_SHIFTS</span> <span class=o>=</span> <span class=p>[</span>
</span></span><span class=line><span class=cl> <span class=mi>55</span><span class=p>,</span> <span class=mi>20</span><span class=p>,</span> <span class=mi>59</span><span class=p>,</span> <span class=mi>42</span><span class=p>,</span> <span class=mi>51</span><span class=p>,</span> <span class=mi>18</span><span class=p>,</span> <span class=mi>5</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>33</span><span class=p>,</span> <span class=mi>10</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>35</span><span class=p>,</span> <span class=mi>54</span><span class=p>,</span> <span class=mi>45</span><span class=p>,</span> <span class=mi>14</span><span class=p>,</span> <span class=mi>4</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>28</span><span class=p>,</span> <span class=mi>56</span><span class=p>,</span> <span class=mi>44</span><span class=p>,</span> <span class=mi>14</span><span class=p>,</span> <span class=mi>4</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>35</span><span class=p>,</span> <span class=mi>11</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>39</span><span class=p>,</span> <span class=mi>52</span><span class=p>,</span> <span class=mi>47</span><span class=p>,</span> <span class=mi>16</span><span class=p>,</span> <span class=mi>60</span><span class=p>,</span> <span class=mi>41</span><span class=p>,</span> <span class=mi>51</span><span class=p>,</span> <span class=mi>18</span><span class=p>,</span> <span class=mi>5</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>63</span><span class=p>,</span> <span class=mi>36</span><span class=p>,</span> <span class=mi>11</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>26</span><span class=p>,</span> <span class=mi>8</span><span class=p>,</span> <span class=mi>2</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>35</span><span class=p>,</span> <span class=mi>54</span><span class=p>,</span> <span class=mi>19</span><span class=p>,</span> <span class=mi>59</span><span class=p>,</span> <span class=mi>24</span><span class=p>,</span> <span class=mi>7</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>12</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>28</span><span class=p>,</span> <span class=mi>8</span><span class=p>,</span> <span class=mi>2</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>30</span><span class=p>,</span> <span class=mi>9</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>12</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>30</span><span class=p>,</span> <span class=mi>56</span><span class=p>,</span> <span class=mi>44</span><span class=p>,</span> <span class=mi>51</span><span class=p>,</span> <span class=mi>47</span><span class=p>,</span> <span class=mi>15</span><span class=p>,</span> <span class=mi>60</span><span class=p>,</span> <span class=mi>24</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>7</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>27</span><span class=p>,</span> <span class=mi>57</span><span class=p>,</span> <span class=mi>21</span><span class=p>,</span> <span class=mi>6</span><span class=p>,</span> <span class=mi>2</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>31</span><span class=p>,</span> <span class=mi>55</span><span class=p>,</span> <span class=mi>44</span><span class=p>,</span> <span class=mi>51</span><span class=p>,</span> <span class=mi>18</span><span class=p>,</span> <span class=mi>5</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>28</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>8</span><span class=p>,</span> <span class=mi>2</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>30</span><span class=p>,</span> <span class=mi>9</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>31</span><span class=p>,</span> <span class=mi>55</span><span class=p>,</span> <span class=mi>44</span><span class=p>,</span> <span class=mi>14</span><span class=p>,</span> <span class=mi>61</span><span class=p>,</span> <span class=mi>39</span><span class=p>,</span> <span class=mi>53</span><span class=p>,</span> <span class=mi>46</span><span class=p>,</span> <span class=mi>49</span><span class=p>,</span> <span class=mi>17</span><span class=p>,</span> <span class=mi>5</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>0</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>31</span><span class=p>,</span> <span class=mi>9</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>27</span><span class=p>,</span> <span class=mi>56</span><span class=p>,</span> <span class=mi>44</span><span class=p>,</span> <span class=mi>50</span><span class=p>,</span> <span class=mi>17</span><span class=p>,</span> <span class=mi>60</span><span class=p>,</span> <span class=mi>41</span><span class=p>,</span> <span class=mi>52</span><span class=p>,</span> <span class=mi>19</span><span class=p>,</span> <span class=mi>59</span><span class=p>,</span> <span class=mi>23</span><span class=p>,</span> <span class=mi>7</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>28</span><span class=p>,</span> <span class=mi>8</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>53</span><span class=p>,</span> <span class=mi>46</span><span class=p>,</span> <span class=mi>49</span><span class=p>,</span> <span class=mi>48</span><span class=p>,</span> <span class=mi>16</span><span class=p>,</span> <span class=mi>5</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>28</span><span class=p>,</span> <span class=mi>8</span><span class=p>,</span> <span class=mi>2</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>35</span><span class=p>,</span> <span class=mi>54</span><span class=p>,</span> <span class=mi>44</span><span class=p>,</span> <span class=mi>14</span><span class=p>,</span> <span class=mi>60</span><span class=p>,</span> <span class=mi>40</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>52</span><span class=p>,</span> <span class=mi>46</span><span class=p>,</span> <span class=mi>15</span><span class=p>,</span> <span class=mi>60</span><span class=p>,</span> <span class=mi>40</span><span class=p>,</span> <span class=mi>13</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>29</span><span class=p>,</span> <span class=mi>9</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>12</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>30</span><span class=p>,</span> <span class=mi>56</span><span class=p>,</span> <span class=mi>21</span><span class=p>,</span> <span class=mi>58</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>22</span><span class=p>,</span> <span class=mi>6</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>28</span><span class=p>,</span> <span class=mi>8</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>26</span><span class=p>,</span> <span class=mi>57</span><span class=p>,</span> <span class=mi>21</span><span class=p>,</span> <span class=mi>58</span><span class=p>,</span> <span class=mi>22</span><span class=p>,</span> <span class=mi>6</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>37</span><span class=p>,</span> <span class=mi>11</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>33</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>10</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>35</span><span class=p>,</span> <span class=mi>54</span><span class=p>,</span> <span class=mi>19</span><span class=p>,</span> <span class=mi>6</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>37</span><span class=p>,</span> <span class=mi>11</span><span class=p>,</span> <span class=mi>61</span><span class=p>,</span> <span class=mi>39</span><span class=p>,</span> <span class=mi>13</span><span class=p>,</span> <span class=mi>4</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>30</span><span class=p>,</span> <span class=mi>9</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>27</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>8</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>26</span><span class=p>,</span> <span class=mi>8</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>11</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>12</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>32</span><span class=p>,</span> <span class=mi>55</span><span class=p>,</span> <span class=mi>20</span><span class=p>,</span> <span class=mi>6</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>63</span><span class=p>,</span> <span class=mi>37</span><span class=p>,</span> <span class=mi>53</span><span class=p>,</span> <span class=mi>45</span><span class=p>,</span> <span class=mi>14</span><span class=p>,</span> <span class=mi>4</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>28</span><span class=p>,</span> <span class=mi>9</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>53</span><span class=p>,</span> <span class=mi>46</span><span class=p>,</span> <span class=mi>49</span><span class=p>,</span> <span class=mi>48</span><span class=p>,</span> <span class=mi>16</span>
</span></span><span class=line><span class=cl> <span class=p>]</span>
</span></span><span class=line><span class=cl> <span class=kd>var</span> <span class=nx>output_shifts</span> <span class=o>=</span> <span class=p>[];</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl> <span class=k>for</span> <span class=p>(</span><span class=kd>var</span> <span class=nx>current_line</span> <span class=o>=</span> <span class=mi>0</span><span class=p>;</span> <span class=nx>current_line</span> <span class=o>&lt;</span> <span class=nx>height</span><span class=p>;</span> <span class=nx>current_line</span><span class=o>++</span><span class=p>)</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nx>output_shifts</span><span class=p>[</span><span class=nx>current_line</span><span class=p>]</span> <span class=o>=</span> <span class=nx>SCREEN_SHIFTS</span><span class=p>[(</span><span class=nx>current_line</span> <span class=o>+</span> <span class=nx>offset</span><span class=p>)</span> <span class=o>&amp;</span> <span class=mh>0xFF</span><span class=p>];</span>
</span></span><span class=line><span class=cl> <span class=p>}</span>
</span></span><span class=line><span class=cl> <span class=k>return</span> <span class=nx>output_shifts</span><span class=p>;</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span></code></pre></td></tr></table></div></div><p>p5.js code for the above canvas, part 1</p><p>This function basically computes a table of offsets for the current frame by adding the line number with the frame number, mod 256. Then a bit of initialization code:</p><div class=highlight><div class=chroma><table class=lntable><tr><td class=lntd><pre tabindex=0 class=chroma><code><span class=lnt>1
</span><span class=lnt>2
</span><span class=lnt>3
</span><span class=lnt>4
</span><span class=lnt>5
</span><span class=lnt>6
</span><span class=lnt>7
</span></code></pre></td><td class=lntd><pre tabindex=0 class=chroma><code class=language-js data-lang=js><span class=line><span class=cl><span class=kd>function</span> <span class=nx>preload</span><span class=p>()</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nx>img</span> <span class=o>=</span> <span class=nx>loadImage</span><span class=p>(</span><span class=s1>&#39;https://toasters.rocks/images/2019/11/background.png&#39;</span><span class=p>);</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=kd>function</span> <span class=nx>setup</span><span class=p>()</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nx>createCanvas</span><span class=p>(</span><span class=mi>320</span><span class=p>,</span> <span class=mi>224</span><span class=p>);</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span></code></pre></td></tr></table></div></div><p>p5.js code for the above canvas, part 2</p><p>And now this is where it gets interesting. For each line we call the <code>image</code> function which crops a 320x1 portion of the image with the appropriate x offset we calculated earlier. Note that the original image is 384x224.</p><div class=highlight><div class=chroma><table class=lntable><tr><td class=lntd><pre tabindex=0 class=chroma><code><span class=lnt>1
</span><span class=lnt>2
</span><span class=lnt>3
</span><span class=lnt>4
</span><span class=lnt>5
</span></code></pre></td><td class=lntd><pre tabindex=0 class=chroma><code class=language-js data-lang=js><span class=line><span class=cl><span class=kd>function</span> <span class=nx>draw</span><span class=p>()</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=kd>var</span> <span class=nx>adjusts</span> <span class=o>=</span> <span class=nx>generate_for_offsets</span><span class=p>(</span><span class=nx>frameCount</span><span class=p>);</span>
</span></span><span class=line><span class=cl> <span class=k>for</span> <span class=p>(</span><span class=kd>var</span> <span class=nx>i</span> <span class=o>=</span> <span class=mi>0</span><span class=p>;</span> <span class=nx>i</span> <span class=o>&lt;</span> <span class=nx>height</span><span class=p>;</span> <span class=nx>i</span><span class=o>++</span><span class=p>)</span>
</span></span><span class=line><span class=cl> <span class=nx>image</span><span class=p>(</span><span class=nx>img</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=nx>i</span><span class=p>,</span> <span class=nx>width</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=nx>adjusts</span><span class=p>[</span><span class=nx>i</span><span class=p>],</span> <span class=nx>i</span><span class=p>,</span> <span class=nx>width</span><span class=p>,</span> <span class=mi>1</span><span class=p>);</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span></code></pre></td></tr></table></div></div><p>p5.js code for the above canvas, part 3</p><p>We can also completely forego the <code>generate_for_offsets</code> function and make it simpler:</p><div class=highlight><div class=chroma><table class=lntable><tr><td class=lntd><pre tabindex=0 class=chroma><code><span class=lnt> 1
</span><span class=lnt> 2
</span><span class=lnt> 3
</span><span class=lnt> 4
</span><span class=lnt> 5
</span><span class=lnt> 6
</span><span class=lnt> 7
</span><span class=lnt> 8
</span><span class=lnt> 9
</span><span class=lnt>10
</span><span class=lnt>11
</span><span class=lnt>12
</span><span class=lnt>13
</span><span class=lnt>14
</span><span class=lnt>15
</span><span class=lnt>16
</span><span class=lnt>17
</span><span class=lnt>18
</span><span class=lnt>19
</span><span class=lnt>20
</span><span class=lnt>21
</span><span class=lnt>22
</span><span class=lnt>23
</span><span class=lnt>24
</span><span class=lnt>25
</span><span class=lnt>26
</span><span class=lnt>27
</span><span class=lnt>28
</span></code></pre></td><td class=lntd><pre tabindex=0 class=chroma><code class=language-js data-lang=js><span class=line><span class=cl><span class=kd>var</span> <span class=nx>shifts</span> <span class=o>=</span> <span class=p>[</span>
</span></span><span class=line><span class=cl> <span class=mi>55</span><span class=p>,</span> <span class=mi>20</span><span class=p>,</span> <span class=mi>59</span><span class=p>,</span> <span class=mi>42</span><span class=p>,</span> <span class=mi>51</span><span class=p>,</span> <span class=mi>18</span><span class=p>,</span> <span class=mi>5</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>33</span><span class=p>,</span> <span class=mi>10</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>35</span><span class=p>,</span> <span class=mi>54</span><span class=p>,</span> <span class=mi>45</span><span class=p>,</span> <span class=mi>14</span><span class=p>,</span> <span class=mi>4</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>28</span><span class=p>,</span> <span class=mi>56</span><span class=p>,</span> <span class=mi>44</span><span class=p>,</span> <span class=mi>14</span><span class=p>,</span> <span class=mi>4</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>35</span><span class=p>,</span> <span class=mi>11</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>39</span><span class=p>,</span> <span class=mi>52</span><span class=p>,</span> <span class=mi>47</span><span class=p>,</span> <span class=mi>16</span><span class=p>,</span> <span class=mi>60</span><span class=p>,</span> <span class=mi>41</span><span class=p>,</span> <span class=mi>51</span><span class=p>,</span> <span class=mi>18</span><span class=p>,</span> <span class=mi>5</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>63</span><span class=p>,</span> <span class=mi>36</span><span class=p>,</span> <span class=mi>11</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>26</span><span class=p>,</span> <span class=mi>8</span><span class=p>,</span> <span class=mi>2</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>35</span><span class=p>,</span> <span class=mi>54</span><span class=p>,</span> <span class=mi>19</span><span class=p>,</span> <span class=mi>59</span><span class=p>,</span> <span class=mi>24</span><span class=p>,</span> <span class=mi>7</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>12</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>28</span><span class=p>,</span> <span class=mi>8</span><span class=p>,</span> <span class=mi>2</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>30</span><span class=p>,</span> <span class=mi>9</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>12</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>30</span><span class=p>,</span> <span class=mi>56</span><span class=p>,</span> <span class=mi>44</span><span class=p>,</span> <span class=mi>51</span><span class=p>,</span> <span class=mi>47</span><span class=p>,</span> <span class=mi>15</span><span class=p>,</span> <span class=mi>60</span><span class=p>,</span> <span class=mi>24</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>7</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>27</span><span class=p>,</span> <span class=mi>57</span><span class=p>,</span> <span class=mi>21</span><span class=p>,</span> <span class=mi>6</span><span class=p>,</span> <span class=mi>2</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>31</span><span class=p>,</span> <span class=mi>55</span><span class=p>,</span> <span class=mi>44</span><span class=p>,</span> <span class=mi>51</span><span class=p>,</span> <span class=mi>18</span><span class=p>,</span> <span class=mi>5</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>28</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>8</span><span class=p>,</span> <span class=mi>2</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>30</span><span class=p>,</span> <span class=mi>9</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>31</span><span class=p>,</span> <span class=mi>55</span><span class=p>,</span> <span class=mi>44</span><span class=p>,</span> <span class=mi>14</span><span class=p>,</span> <span class=mi>61</span><span class=p>,</span> <span class=mi>39</span><span class=p>,</span> <span class=mi>53</span><span class=p>,</span> <span class=mi>46</span><span class=p>,</span> <span class=mi>49</span><span class=p>,</span> <span class=mi>17</span><span class=p>,</span> <span class=mi>5</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>0</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>31</span><span class=p>,</span> <span class=mi>9</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>27</span><span class=p>,</span> <span class=mi>56</span><span class=p>,</span> <span class=mi>44</span><span class=p>,</span> <span class=mi>50</span><span class=p>,</span> <span class=mi>17</span><span class=p>,</span> <span class=mi>60</span><span class=p>,</span> <span class=mi>41</span><span class=p>,</span> <span class=mi>52</span><span class=p>,</span> <span class=mi>19</span><span class=p>,</span> <span class=mi>59</span><span class=p>,</span> <span class=mi>23</span><span class=p>,</span> <span class=mi>7</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>28</span><span class=p>,</span> <span class=mi>8</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>53</span><span class=p>,</span> <span class=mi>46</span><span class=p>,</span> <span class=mi>49</span><span class=p>,</span> <span class=mi>48</span><span class=p>,</span> <span class=mi>16</span><span class=p>,</span> <span class=mi>5</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>28</span><span class=p>,</span> <span class=mi>8</span><span class=p>,</span> <span class=mi>2</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>35</span><span class=p>,</span> <span class=mi>54</span><span class=p>,</span> <span class=mi>44</span><span class=p>,</span> <span class=mi>14</span><span class=p>,</span> <span class=mi>60</span><span class=p>,</span> <span class=mi>40</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>52</span><span class=p>,</span> <span class=mi>46</span><span class=p>,</span> <span class=mi>15</span><span class=p>,</span> <span class=mi>60</span><span class=p>,</span> <span class=mi>40</span><span class=p>,</span> <span class=mi>13</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>29</span><span class=p>,</span> <span class=mi>9</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>12</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>30</span><span class=p>,</span> <span class=mi>56</span><span class=p>,</span> <span class=mi>21</span><span class=p>,</span> <span class=mi>58</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>22</span><span class=p>,</span> <span class=mi>6</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>28</span><span class=p>,</span> <span class=mi>8</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>26</span><span class=p>,</span> <span class=mi>57</span><span class=p>,</span> <span class=mi>21</span><span class=p>,</span> <span class=mi>58</span><span class=p>,</span> <span class=mi>22</span><span class=p>,</span> <span class=mi>6</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>37</span><span class=p>,</span> <span class=mi>11</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>33</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>10</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>35</span><span class=p>,</span> <span class=mi>54</span><span class=p>,</span> <span class=mi>19</span><span class=p>,</span> <span class=mi>6</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>37</span><span class=p>,</span> <span class=mi>11</span><span class=p>,</span> <span class=mi>61</span><span class=p>,</span> <span class=mi>39</span><span class=p>,</span> <span class=mi>13</span><span class=p>,</span> <span class=mi>4</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>30</span><span class=p>,</span> <span class=mi>9</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>27</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>8</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>26</span><span class=p>,</span> <span class=mi>8</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>11</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>12</span><span class=p>,</span> <span class=mi>3</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=mi>64</span><span class=p>,</span> <span class=mi>32</span><span class=p>,</span> <span class=mi>55</span><span class=p>,</span> <span class=mi>20</span><span class=p>,</span> <span class=mi>6</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=mi>63</span><span class=p>,</span> <span class=mi>37</span><span class=p>,</span> <span class=mi>53</span><span class=p>,</span> <span class=mi>45</span><span class=p>,</span> <span class=mi>14</span><span class=p>,</span> <span class=mi>4</span><span class=p>,</span> <span class=mi>63</span><span class=p>,</span> <span class=mi>28</span><span class=p>,</span> <span class=mi>9</span><span class=p>,</span> <span class=mi>62</span><span class=p>,</span> <span class=mi>38</span><span class=p>,</span> <span class=mi>53</span><span class=p>,</span> <span class=mi>46</span><span class=p>,</span> <span class=mi>49</span><span class=p>,</span> <span class=mi>48</span><span class=p>,</span> <span class=mi>16</span>
</span></span><span class=line><span class=cl><span class=p>]</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=kd>function</span> <span class=nx>preload</span><span class=p>()</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nx>img</span> <span class=o>=</span> <span class=nx>loadImage</span><span class=p>(</span><span class=s1>&#39;https://toasters.rocks/images/2019/11/background.png&#39;</span><span class=p>);</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=kd>function</span> <span class=nx>setup</span><span class=p>()</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nx>createCanvas</span><span class=p>(</span><span class=mi>320</span><span class=p>,</span> <span class=mi>224</span><span class=p>);</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=kd>function</span> <span class=nx>draw</span><span class=p>()</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=k>for</span> <span class=p>(</span><span class=kd>var</span> <span class=nx>i</span> <span class=o>=</span> <span class=mi>0</span><span class=p>;</span> <span class=nx>i</span> <span class=o>&lt;</span> <span class=nx>height</span><span class=p>;</span> <span class=nx>i</span><span class=o>++</span><span class=p>)</span>
</span></span><span class=line><span class=cl> <span class=nx>image</span><span class=p>(</span><span class=nx>img</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=nx>i</span><span class=p>,</span> <span class=nx>width</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=nx>shifts</span><span class=p>[(</span><span class=nx>i</span> <span class=o>+</span> <span class=nx>frameCount</span><span class=p>)</span> <span class=o>&amp;</span> <span class=mh>0xFF</span><span class=p>],</span> <span class=nx>i</span><span class=p>,</span> <span class=nx>width</span><span class=p>,</span> <span class=mi>1</span><span class=p>);</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span></code></pre></td></tr></table></div></div><p>p5.js code for the above canvas, version 2</p><p>Now that huge array is a bit unwieldy, maybe you can compress it? Sure thing.</p><div class=highlight><div class=chroma><table class=lntable><tr><td class=lntd><pre tabindex=0 class=chroma><code><span class=lnt>1
</span></code></pre></td><td class=lntd><pre tabindex=0 class=chroma><code class=language-js data-lang=js><span class=line><span class=cl><span class=nx>console</span><span class=p>.</span><span class=nx>log</span><span class=p>(</span><span class=nb>String</span><span class=p>.</span><span class=nx>fromCharCode</span><span class=p>(...</span><span class=nx>shifts</span><span class=p>.</span><span class=nx>map</span><span class=p>(</span><span class=nx>x</span> <span class=p>=&gt;</span> <span class=nx>x</span> <span class=o>+</span> <span class=mh>0x30</span><span class=p>)));</span>
</span></span></code></pre></td></tr></table></div></div><p>Let&rsquo;s transform that stupid array into something better</p><div class=highlight><div class=chroma><table class=lntable><tr><td class=lntd><pre tabindex=0 class=chroma><code><span class=lnt> 1
</span><span class=lnt> 2
</span><span class=lnt> 3
</span><span class=lnt> 4
</span><span class=lnt> 5
</span><span class=lnt> 6
</span><span class=lnt> 7
</span><span class=lnt> 8
</span><span class=lnt> 9
</span><span class=lnt>10
</span><span class=lnt>11
</span><span class=lnt>12
</span><span class=lnt>13
</span><span class=lnt>14
</span></code></pre></td><td class=lntd><pre tabindex=0 class=chroma><code class=language-js data-lang=js><span class=line><span class=cl><span class=kd>var</span> <span class=nx>shifts</span> <span class=o>=</span> <span class=s2>&#34;gDkZcB510pQ:3pSf]&gt;4oLh\&gt;41pS;nWd_@lYcB5oT;nJ82pSfCkH7nV&lt;3oL82pN9nV&lt;31pNh\c_?lH7nKiE6210000pOg\cB5oL82pN931pOg\&gt;mWe^aA5110pO9nKh\bAlYdCkG7oL8nVe^a`@5oL82pSf\&gt;lXd^?lX=3oM9nV&lt;31pNhEjF6oL8nJiEjF6oU;310pQ:3pSfC6oU;mW=41pN9nK8nJ8nV;nV&lt;310000pPgD6oUe]&gt;4oL9nVe^a`@&#34;</span><span class=p>;</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=kd>function</span> <span class=nx>preload</span><span class=p>()</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nx>img</span> <span class=o>=</span> <span class=nx>loadImage</span><span class=p>(</span><span class=s1>&#39;https://toasters.rocks/images/2019/11/background.png&#39;</span><span class=p>);</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=kd>function</span> <span class=nx>setup</span><span class=p>()</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nx>createCanvas</span><span class=p>(</span><span class=mi>320</span><span class=p>,</span> <span class=mi>224</span><span class=p>);</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=kd>function</span> <span class=nx>draw</span><span class=p>()</span> <span class=p>{</span>
</span></span><span class=line><span class=cl>    <span class=k>for</span> <span class=p>(</span><span class=kd>var</span> <span class=nx>i</span> <span class=o>=</span> <span class=mi>0</span><span class=p>;</span> <span class=nx>i</span> <span class=o>&lt;</span> <span class=nx>height</span><span class=p>;</span> <span class=nx>i</span><span class=o>++</span><span class=p>)</span>
</span></span><span class=line><span class=cl>        <span class=nx>image</span><span class=p>(</span><span class=nx>img</span><span class=p>,</span> <span class=mi>0</span><span class=p>,</span> <span class=nx>i</span><span class=p>,</span> <span class=nx>width</span><span class=p>,</span> <span class=mi>1</span><span class=p>,</span> <span class=nx>shifts</span><span class=p>.</span><span class=nx>charCodeAt</span><span class=p>((</span><span class=nx>i</span> <span class=o>+</span> <span class=nx>frameCount</span><span class=p>)</span> <span class=o>&amp;</span> <span class=mh>0xFF</span><span class=p>)</span><span class=o>-</span><span class=mh>0x30</span><span class=p>,</span> <span class=nx>i</span><span class=p>,</span> <span class=nx>width</span><span class=p>,</span> <span class=mi>1</span><span class=p>);</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span></code></pre></td></tr></table></div></div><p>p5.js code for the above canvas, version 3</p><p>From there, there&rsquo;s a lot of tricks to compress your code so it goes a bit faster. With that much code, we went from something that looks complex into something simple, which is pretty cool. Well, that&rsquo;s all for today, hope you learned a bit with that :)</p><p>All content owned by their respective owners: game, data and assets by <a href=https://en.wikipedia.org/wiki/Appaloosa_Interactive>Novotrade International</a>, code by Foone and adapted by myself licenced under GPL3.</p></article><ul class=pagination><li class=page-item><a class=previous href=http://toasters.rocks/commissions/>« commissions</a></li><li class=page-item><a class=next href=http://toasters.rocks/horse-life-98/>Horse Life 98 »</a></li></ul><article><div id=disqus_thread></div><script type=application/javascript>window.disqus_config=function(){},function(){if(["localhost","127.0.0.1"].indexOf(window.location.hostname)!=-1){document.getElementById("disqus_thread").innerHTML="Disqus comments not available by default when the website is previewed locally.";return}var t=document,e=t.createElement("script");e.async=!0,e.src="//juju2143.disqus.com/embed.js",e.setAttribute("data-timestamp",+new Date),(t.head||t.body).appendChild(e)}()</script><noscript>Please enable JavaScript to view the <a href=https://disqus.com/?ref_noscript>comments powered by Disqus.</a></noscript><a href=https://disqus.com class=dsq-brlink>comments powered by <span class=logo-disqus>Disqus</span></a></article></main><footer>Copyright © 2020 J.P. Savard - Theme by <a href=https://github.com/juju2143/hugo-theme-toastersrocks>J. P. Savard</a> - Powered by Hugo 0.105.0</footer></body></html>