HTML5倾斜迷宫小游戏
<p>HTML源代码:</p><div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><!</span><span style="color: rgba(255, 0, 255, 1)">DOCTYPE html</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">html </span><span style="color: rgba(255, 0, 0, 1)">lang</span><span style="color: rgba(0, 0, 255, 1)">="en"</span> <span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">charset</span><span style="color: rgba(0, 0, 255, 1)">="UTF-8"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">></span>HTML5倾斜迷宫<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">link </span><span style="color: rgba(255, 0, 0, 1)">rel</span><span style="color: rgba(0, 0, 255, 1)">="stylesheet"</span><span style="color: rgba(255, 0, 0, 1)"> href</span><span style="color: rgba(0, 0, 255, 1)">="css/style.css"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="center"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="game"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="maze"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="end"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="joystick"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="joystick-arrow"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="joystick-arrow"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="joystick-arrow"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="joystick-arrow"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="joystick-head"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="note"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
点击操纵杆开始!
</span><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>把每个球移到中心。准备好进入硬模式了吗?按H<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="youtube-card"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
如何用JavaScript模拟迷宫中的球运动
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(255, 0, 0, 1)">src</span><span style="color: rgba(0, 0, 255, 1)">="js/script.js"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>CSS(css/style.css)源代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">body {
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">/* https://coolors.co/f06449-ede6e3-7d82b8-36382e-613f75*/
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">--background-color: #ede6e3;
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 0, 1)">--wall-color: #36382e;
</span><span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 0, 1)">--joystick-color: #210124;
</span><span style="color: rgba(0, 128, 128, 1)">6</span> <span style="color: rgba(0, 0, 0, 1)">--joystick-head-color: #f06449;
</span><span style="color: rgba(0, 128, 128, 1)">7</span> <span style="color: rgba(0, 0, 0, 1)">--ball-color: #f06449;
</span><span style="color: rgba(0, 128, 128, 1)">8</span> <span style="color: rgba(0, 0, 0, 1)">--end-color: #7d82b8;
</span><span style="color: rgba(0, 128, 128, 1)">9</span> <span style="color: rgba(0, 0, 0, 1)">--text-color: #210124;
</span><span style="color: rgba(0, 128, 128, 1)"> 10</span>
<span style="color: rgba(0, 128, 128, 1)"> 11</span> <span style="color: rgba(0, 0, 0, 1)">font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
</span><span style="color: rgba(0, 128, 128, 1)"> 12</span> <span style="color: rgba(0, 0, 0, 1)">background-color: var(--background-color);
</span><span style="color: rgba(0, 128, 128, 1)"> 13</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 14</span>
<span style="color: rgba(0, 128, 128, 1)"> 15</span> <span style="color: rgba(0, 0, 0, 1)">html,
</span><span style="color: rgba(0, 128, 128, 1)"> 16</span> <span style="color: rgba(0, 0, 0, 1)">body {
</span><span style="color: rgba(0, 128, 128, 1)"> 17</span> <span style="color: rgba(0, 0, 0, 1)">height: 100%;
</span><span style="color: rgba(0, 128, 128, 1)"> 18</span> <span style="color: rgba(0, 0, 0, 1)">margin: 0;
</span><span style="color: rgba(0, 128, 128, 1)"> 19</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 20</span>
<span style="color: rgba(0, 128, 128, 1)"> 21</span> <span style="color: rgba(0, 0, 0, 1)">#center {
</span><span style="color: rgba(0, 128, 128, 1)"> 22</span> <span style="color: rgba(0, 0, 0, 1)">display: flex;
</span><span style="color: rgba(0, 128, 128, 1)"> 23</span> <span style="color: rgba(0, 0, 0, 1)">align-items: center;
</span><span style="color: rgba(0, 128, 128, 1)"> 24</span> <span style="color: rgba(0, 0, 0, 1)">justify-content: center;
</span><span style="color: rgba(0, 128, 128, 1)"> 25</span> <span style="color: rgba(0, 0, 0, 1)">height: 100%;
</span><span style="color: rgba(0, 128, 128, 1)"> 26</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 27</span>
<span style="color: rgba(0, 128, 128, 1)"> 28</span> <span style="color: rgba(0, 0, 0, 1)">#game {
</span><span style="color: rgba(0, 128, 128, 1)"> 29</span> <span style="color: rgba(0, 0, 0, 1)">display: grid;
</span><span style="color: rgba(0, 128, 128, 1)"> 30</span> <span style="color: rgba(0, 0, 0, 1)">grid-template-columns: auto 150px;
</span><span style="color: rgba(0, 128, 128, 1)"> 31</span> <span style="color: rgba(0, 0, 0, 1)">grid-template-rows: 1fr auto 1fr;
</span><span style="color: rgba(0, 128, 128, 1)"> 32</span> <span style="color: rgba(0, 0, 0, 1)">gap: 30px;
</span><span style="color: rgba(0, 128, 128, 1)"> 33</span> <span style="color: rgba(0, 0, 0, 1)">perspective: 600px;
</span><span style="color: rgba(0, 128, 128, 1)"> 34</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 35</span>
<span style="color: rgba(0, 128, 128, 1)"> 36</span> <span style="color: rgba(0, 0, 0, 1)">#maze {
</span><span style="color: rgba(0, 128, 128, 1)"> 37</span> <span style="color: rgba(0, 0, 0, 1)">position: relative;
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span> <span style="color: rgba(0, 0, 0, 1)">grid-row: 1 / -1;
</span><span style="color: rgba(0, 128, 128, 1)"> 39</span> <span style="color: rgba(0, 0, 0, 1)">grid-column: 1;
</span><span style="color: rgba(0, 128, 128, 1)"> 40</span> <span style="color: rgba(0, 0, 0, 1)">width: 350px;
</span><span style="color: rgba(0, 128, 128, 1)"> 41</span> <span style="color: rgba(0, 0, 0, 1)">height: 315px;
</span><span style="color: rgba(0, 128, 128, 1)"> 42</span> <span style="color: rgba(0, 0, 0, 1)">display: flex;
</span><span style="color: rgba(0, 128, 128, 1)"> 43</span> <span style="color: rgba(0, 0, 0, 1)">justify-content: center;
</span><span style="color: rgba(0, 128, 128, 1)"> 44</span> <span style="color: rgba(0, 0, 0, 1)">align-items: center;
</span><span style="color: rgba(0, 128, 128, 1)"> 45</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 46</span>
<span style="color: rgba(0, 128, 128, 1)"> 47</span> <span style="color: rgba(0, 0, 0, 1)">#end {
</span><span style="color: rgba(0, 128, 128, 1)"> 48</span> <span style="color: rgba(0, 0, 0, 1)">width: 65px;
</span><span style="color: rgba(0, 128, 128, 1)"> 49</span> <span style="color: rgba(0, 0, 0, 1)">height: 65px;
</span><span style="color: rgba(0, 128, 128, 1)"> 50</span> <span style="color: rgba(0, 0, 0, 1)">border: 5px dashed var(--end-color);
</span><span style="color: rgba(0, 128, 128, 1)"> 51</span> <span style="color: rgba(0, 0, 0, 1)">border-radius: 50%;
</span><span style="color: rgba(0, 128, 128, 1)"> 52</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 53</span>
<span style="color: rgba(0, 128, 128, 1)"> 54</span> <span style="color: rgba(0, 0, 0, 1)">#joystick {
</span><span style="color: rgba(0, 128, 128, 1)"> 55</span> <span style="color: rgba(0, 0, 0, 1)">position: relative;
</span><span style="color: rgba(0, 128, 128, 1)"> 56</span> <span style="color: rgba(0, 0, 0, 1)">background-color: var(--joystick-color);
</span><span style="color: rgba(0, 128, 128, 1)"> 57</span> <span style="color: rgba(0, 0, 0, 1)">border-radius: 50%;
</span><span style="color: rgba(0, 128, 128, 1)"> 58</span> <span style="color: rgba(0, 0, 0, 1)">width: 50px;
</span><span style="color: rgba(0, 128, 128, 1)"> 59</span> <span style="color: rgba(0, 0, 0, 1)">height: 50px;
</span><span style="color: rgba(0, 128, 128, 1)"> 60</span> <span style="color: rgba(0, 0, 0, 1)">display: flex;
</span><span style="color: rgba(0, 128, 128, 1)"> 61</span> <span style="color: rgba(0, 0, 0, 1)">align-items: center;
</span><span style="color: rgba(0, 128, 128, 1)"> 62</span> <span style="color: rgba(0, 0, 0, 1)">justify-content: center;
</span><span style="color: rgba(0, 128, 128, 1)"> 63</span> <span style="color: rgba(0, 0, 0, 1)">margin: 10px 50px;
</span><span style="color: rgba(0, 128, 128, 1)"> 64</span> <span style="color: rgba(0, 0, 0, 1)">grid-row: 2;
</span><span style="color: rgba(0, 128, 128, 1)"> 65</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 66</span>
<span style="color: rgba(0, 128, 128, 1)"> 67</span> <span style="color: rgba(0, 0, 0, 1)">#joystick-head {
</span><span style="color: rgba(0, 128, 128, 1)"> 68</span> <span style="color: rgba(0, 0, 0, 1)">position: relative;
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span> <span style="color: rgba(0, 0, 0, 1)">background-color: var(--joystick-head-color);
</span><span style="color: rgba(0, 128, 128, 1)"> 70</span> <span style="color: rgba(0, 0, 0, 1)">border-radius: 50%;
</span><span style="color: rgba(0, 128, 128, 1)"> 71</span> <span style="color: rgba(0, 0, 0, 1)">width: 20px;
</span><span style="color: rgba(0, 128, 128, 1)"> 72</span> <span style="color: rgba(0, 0, 0, 1)">height: 20px;
</span><span style="color: rgba(0, 128, 128, 1)"> 73</span> <span style="color: rgba(0, 0, 0, 1)">cursor: grab;
</span><span style="color: rgba(0, 128, 128, 1)"> 74</span>
<span style="color: rgba(0, 128, 128, 1)"> 75</span> <span style="color: rgba(0, 0, 0, 1)">animation-name: glow;
</span><span style="color: rgba(0, 128, 128, 1)"> 76</span> <span style="color: rgba(0, 0, 0, 1)">animation-duration: 0.6s;
</span><span style="color: rgba(0, 128, 128, 1)"> 77</span> <span style="color: rgba(0, 0, 0, 1)">animation-iteration-count: infinite;
</span><span style="color: rgba(0, 128, 128, 1)"> 78</span> <span style="color: rgba(0, 0, 0, 1)">animation-direction: alternate;
</span><span style="color: rgba(0, 128, 128, 1)"> 79</span> <span style="color: rgba(0, 0, 0, 1)">animation-timing-function: ease-in-out;
</span><span style="color: rgba(0, 128, 128, 1)"> 80</span> <span style="color: rgba(0, 0, 0, 1)">animation-delay: 4s;
</span><span style="color: rgba(0, 128, 128, 1)"> 81</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 82</span>
<span style="color: rgba(0, 128, 128, 1)"> 83</span> <span style="color: rgba(0, 0, 0, 1)">@keyframes glow {
</span><span style="color: rgba(0, 128, 128, 1)"> 84</span> <span style="color: rgba(0, 0, 0, 1)">0% {
</span><span style="color: rgba(0, 128, 128, 1)"> 85</span> <span style="color: rgba(0, 0, 0, 1)"> transform: scale(1);
</span><span style="color: rgba(0, 128, 128, 1)"> 86</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span> <span style="color: rgba(0, 0, 0, 1)">100% {
</span><span style="color: rgba(0, 128, 128, 1)"> 88</span> <span style="color: rgba(0, 0, 0, 1)"> transform: scale(1.2);
</span><span style="color: rgba(0, 128, 128, 1)"> 89</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 90</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 91</span>
<span style="color: rgba(0, 128, 128, 1)"> 92</span> <span style="color: rgba(0, 0, 0, 1)">.joystick-arrow:nth-of-type(1) {
</span><span style="color: rgba(0, 128, 128, 1)"> 93</span> <span style="color: rgba(0, 0, 0, 1)">position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)"> 94</span> <span style="color: rgba(0, 0, 0, 1)">bottom: 55px;
</span><span style="color: rgba(0, 128, 128, 1)"> 95</span>
<span style="color: rgba(0, 128, 128, 1)"> 96</span> <span style="color: rgba(0, 0, 0, 1)">width: 0;
</span><span style="color: rgba(0, 128, 128, 1)"> 97</span> <span style="color: rgba(0, 0, 0, 1)">height: 0;
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span> <span style="color: rgba(0, 0, 0, 1)">border-left: 10px solid transparent;
</span><span style="color: rgba(0, 128, 128, 1)"> 99</span> <span style="color: rgba(0, 0, 0, 1)">border-right: 10px solid transparent;
</span><span style="color: rgba(0, 128, 128, 1)">100</span>
<span style="color: rgba(0, 128, 128, 1)">101</span> <span style="color: rgba(0, 0, 0, 1)">border-bottom: 10px solid var(--joystick-color);
</span><span style="color: rgba(0, 128, 128, 1)">102</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">103</span>
<span style="color: rgba(0, 128, 128, 1)">104</span> <span style="color: rgba(0, 0, 0, 1)">.joystick-arrow:nth-of-type(2) {
</span><span style="color: rgba(0, 128, 128, 1)">105</span> <span style="color: rgba(0, 0, 0, 1)">position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">106</span> <span style="color: rgba(0, 0, 0, 1)">top: 55px;
</span><span style="color: rgba(0, 128, 128, 1)">107</span>
<span style="color: rgba(0, 128, 128, 1)">108</span> <span style="color: rgba(0, 0, 0, 1)">width: 0;
</span><span style="color: rgba(0, 128, 128, 1)">109</span> <span style="color: rgba(0, 0, 0, 1)">height: 0;
</span><span style="color: rgba(0, 128, 128, 1)">110</span> <span style="color: rgba(0, 0, 0, 1)">border-left: 10px solid transparent;
</span><span style="color: rgba(0, 128, 128, 1)">111</span> <span style="color: rgba(0, 0, 0, 1)">border-right: 10px solid transparent;
</span><span style="color: rgba(0, 128, 128, 1)">112</span>
<span style="color: rgba(0, 128, 128, 1)">113</span> <span style="color: rgba(0, 0, 0, 1)">border-top: 10px solid var(--joystick-color);
</span><span style="color: rgba(0, 128, 128, 1)">114</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">115</span>
<span style="color: rgba(0, 128, 128, 1)">116</span> <span style="color: rgba(0, 0, 0, 1)">.joystick-arrow:nth-of-type(3) {
</span><span style="color: rgba(0, 128, 128, 1)">117</span> <span style="color: rgba(0, 0, 0, 1)">position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">118</span> <span style="color: rgba(0, 0, 0, 1)">left: 55px;
</span><span style="color: rgba(0, 128, 128, 1)">119</span>
<span style="color: rgba(0, 128, 128, 1)">120</span> <span style="color: rgba(0, 0, 0, 1)">width: 0;
</span><span style="color: rgba(0, 128, 128, 1)">121</span> <span style="color: rgba(0, 0, 0, 1)">height: 0;
</span><span style="color: rgba(0, 128, 128, 1)">122</span> <span style="color: rgba(0, 0, 0, 1)">border-top: 10px solid transparent;
</span><span style="color: rgba(0, 128, 128, 1)">123</span> <span style="color: rgba(0, 0, 0, 1)">border-bottom: 10px solid transparent;
</span><span style="color: rgba(0, 128, 128, 1)">124</span>
<span style="color: rgba(0, 128, 128, 1)">125</span> <span style="color: rgba(0, 0, 0, 1)">border-left: 10px solid var(--joystick-color);
</span><span style="color: rgba(0, 128, 128, 1)">126</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">127</span>
<span style="color: rgba(0, 128, 128, 1)">128</span> <span style="color: rgba(0, 0, 0, 1)">.joystick-arrow:nth-of-type(4) {
</span><span style="color: rgba(0, 128, 128, 1)">129</span> <span style="color: rgba(0, 0, 0, 1)">position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">130</span> <span style="color: rgba(0, 0, 0, 1)">right: 55px;
</span><span style="color: rgba(0, 128, 128, 1)">131</span>
<span style="color: rgba(0, 128, 128, 1)">132</span> <span style="color: rgba(0, 0, 0, 1)">width: 0;
</span><span style="color: rgba(0, 128, 128, 1)">133</span> <span style="color: rgba(0, 0, 0, 1)">height: 0;
</span><span style="color: rgba(0, 128, 128, 1)">134</span> <span style="color: rgba(0, 0, 0, 1)">border-top: 10px solid transparent;
</span><span style="color: rgba(0, 128, 128, 1)">135</span> <span style="color: rgba(0, 0, 0, 1)">border-bottom: 10px solid transparent;
</span><span style="color: rgba(0, 128, 128, 1)">136</span>
<span style="color: rgba(0, 128, 128, 1)">137</span> <span style="color: rgba(0, 0, 0, 1)">border-right: 10px solid var(--joystick-color);
</span><span style="color: rgba(0, 128, 128, 1)">138</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">139</span>
<span style="color: rgba(0, 128, 128, 1)">140</span> <span style="color: rgba(0, 0, 0, 1)">#note {
</span><span style="color: rgba(0, 128, 128, 1)">141</span> <span style="color: rgba(0, 0, 0, 1)">grid-row: 3;
</span><span style="color: rgba(0, 128, 128, 1)">142</span> <span style="color: rgba(0, 0, 0, 1)">grid-column: 2;
</span><span style="color: rgba(0, 128, 128, 1)">143</span> <span style="color: rgba(0, 0, 0, 1)">text-align: center;
</span><span style="color: rgba(0, 128, 128, 1)">144</span> <span style="color: rgba(0, 0, 0, 1)">font-size: 0.8em;
</span><span style="color: rgba(0, 128, 128, 1)">145</span> <span style="color: rgba(0, 0, 0, 1)">color: var(--text-color);
</span><span style="color: rgba(0, 128, 128, 1)">146</span> <span style="color: rgba(0, 0, 0, 1)">transition: opacity 2s;
</span><span style="color: rgba(0, 128, 128, 1)">147</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">148</span>
<span style="color: rgba(0, 128, 128, 1)">149</span> <span style="color: rgba(0, 0, 0, 1)">a:visited {
</span><span style="color: rgba(0, 128, 128, 1)">150</span> <span style="color: rgba(0, 0, 0, 1)">color: inherit;
</span><span style="color: rgba(0, 128, 128, 1)">151</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">152</span>
<span style="color: rgba(0, 128, 128, 1)">153</span> <span style="color: rgba(0, 0, 0, 1)">.ball {
</span><span style="color: rgba(0, 128, 128, 1)">154</span> <span style="color: rgba(0, 0, 0, 1)">position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">155</span> <span style="color: rgba(0, 0, 0, 1)">margin-top: -5px;
</span><span style="color: rgba(0, 128, 128, 1)">156</span> <span style="color: rgba(0, 0, 0, 1)">margin-left: -5px;
</span><span style="color: rgba(0, 128, 128, 1)">157</span> <span style="color: rgba(0, 0, 0, 1)">border-radius: 50%;
</span><span style="color: rgba(0, 128, 128, 1)">158</span> <span style="color: rgba(0, 0, 0, 1)">background-color: var(--ball-color);
</span><span style="color: rgba(0, 128, 128, 1)">159</span> <span style="color: rgba(0, 0, 0, 1)">width: 10px;
</span><span style="color: rgba(0, 128, 128, 1)">160</span> <span style="color: rgba(0, 0, 0, 1)">height: 10px;
</span><span style="color: rgba(0, 128, 128, 1)">161</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">162</span>
<span style="color: rgba(0, 128, 128, 1)">163</span> <span style="color: rgba(0, 0, 0, 1)">.wall {
</span><span style="color: rgba(0, 128, 128, 1)">164</span> <span style="color: rgba(0, 0, 0, 1)">position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">165</span> <span style="color: rgba(0, 0, 0, 1)">background-color: var(--wall-color);
</span><span style="color: rgba(0, 128, 128, 1)">166</span> <span style="color: rgba(0, 0, 0, 1)">transform-origin: top center;
</span><span style="color: rgba(0, 128, 128, 1)">167</span> <span style="color: rgba(0, 0, 0, 1)">margin-left: -5px;
</span><span style="color: rgba(0, 128, 128, 1)">168</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">169</span>
<span style="color: rgba(0, 128, 128, 1)">170</span> <span style="color: rgba(0, 0, 0, 1)">.wall::before,
</span><span style="color: rgba(0, 128, 128, 1)">171</span> <span style="color: rgba(0, 0, 0, 1)">.wall::after {
</span><span style="color: rgba(0, 128, 128, 1)">172</span> <span style="color: rgba(0, 0, 0, 1)">display: block;
</span><span style="color: rgba(0, 128, 128, 1)">173</span> <span style="color: rgba(0, 0, 0, 1)">content: "";
</span><span style="color: rgba(0, 128, 128, 1)">174</span> <span style="color: rgba(0, 0, 0, 1)">width: 10px;
</span><span style="color: rgba(0, 128, 128, 1)">175</span> <span style="color: rgba(0, 0, 0, 1)">height: 10px;
</span><span style="color: rgba(0, 128, 128, 1)">176</span> <span style="color: rgba(0, 0, 0, 1)">background-color: inherit;
</span><span style="color: rgba(0, 128, 128, 1)">177</span> <span style="color: rgba(0, 0, 0, 1)">border-radius: 50%;
</span><span style="color: rgba(0, 128, 128, 1)">178</span> <span style="color: rgba(0, 0, 0, 1)">position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">179</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">180</span>
<span style="color: rgba(0, 128, 128, 1)">181</span> <span style="color: rgba(0, 0, 0, 1)">.wall::before {
</span><span style="color: rgba(0, 128, 128, 1)">182</span> <span style="color: rgba(0, 0, 0, 1)">top: -5px;
</span><span style="color: rgba(0, 128, 128, 1)">183</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">184</span>
<span style="color: rgba(0, 128, 128, 1)">185</span> <span style="color: rgba(0, 0, 0, 1)">.wall::after {
</span><span style="color: rgba(0, 128, 128, 1)">186</span> <span style="color: rgba(0, 0, 0, 1)">bottom: -5px;
</span><span style="color: rgba(0, 128, 128, 1)">187</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">188</span>
<span style="color: rgba(0, 128, 128, 1)">189</span> <span style="color: rgba(0, 0, 0, 1)">.black-hole {
</span><span style="color: rgba(0, 128, 128, 1)">190</span> <span style="color: rgba(0, 0, 0, 1)">position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">191</span> <span style="color: rgba(0, 0, 0, 1)">margin-top: -9px;
</span><span style="color: rgba(0, 128, 128, 1)">192</span> <span style="color: rgba(0, 0, 0, 1)">margin-left: -9px;
</span><span style="color: rgba(0, 128, 128, 1)">193</span> <span style="color: rgba(0, 0, 0, 1)">border-radius: 50%;
</span><span style="color: rgba(0, 128, 128, 1)">194</span> <span style="color: rgba(0, 0, 0, 1)">background-color: black;
</span><span style="color: rgba(0, 128, 128, 1)">195</span> <span style="color: rgba(0, 0, 0, 1)">width: 18px;
</span><span style="color: rgba(0, 128, 128, 1)">196</span> <span style="color: rgba(0, 0, 0, 1)">height: 18px;
</span><span style="color: rgba(0, 128, 128, 1)">197</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">198</span>
<span style="color: rgba(0, 128, 128, 1)">199</span> <span style="color: rgba(0, 0, 0, 1)">#youtube,
</span><span style="color: rgba(0, 128, 128, 1)">200</span> <span style="color: rgba(0, 0, 0, 1)">#youtube-card {
</span><span style="color: rgba(0, 128, 128, 1)">201</span> <span style="color: rgba(0, 0, 0, 1)">display: none;
</span><span style="color: rgba(0, 128, 128, 1)">202</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">203</span>
<span style="color: rgba(0, 128, 128, 1)">204</span> <span style="color: rgba(0, 0, 0, 1)">@media (min-height: 425px) {
</span><span style="color: rgba(0, 128, 128, 1)">205</span> <span style="color: rgba(0, 0, 0, 1)">/** Youtube logo by https://codepen.io/alvaromontoro */
</span><span style="color: rgba(0, 128, 128, 1)">206</span> <span style="color: rgba(0, 0, 0, 1)">#youtube {
</span><span style="color: rgba(0, 128, 128, 1)">207</span> <span style="color: rgba(0, 0, 0, 1)"> z-index: 2;
</span><span style="color: rgba(0, 128, 128, 1)">208</span> <span style="color: rgba(0, 0, 0, 1)"> display: block;
</span><span style="color: rgba(0, 128, 128, 1)">209</span> <span style="color: rgba(0, 0, 0, 1)"> width: 100px;
</span><span style="color: rgba(0, 128, 128, 1)">210</span> <span style="color: rgba(0, 0, 0, 1)"> height: 70px;
</span><span style="color: rgba(0, 128, 128, 1)">211</span> <span style="color: rgba(0, 0, 0, 1)"> position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">212</span> <span style="color: rgba(0, 0, 0, 1)"> bottom: 20px;
</span><span style="color: rgba(0, 128, 128, 1)">213</span> <span style="color: rgba(0, 0, 0, 1)"> right: 20px;
</span><span style="color: rgba(0, 128, 128, 1)">214</span> <span style="color: rgba(0, 0, 0, 1)"> background: red;
</span><span style="color: rgba(0, 128, 128, 1)">215</span> <span style="color: rgba(0, 0, 0, 1)"> border-radius: 50% / 11%;
</span><span style="color: rgba(0, 128, 128, 1)">216</span> <span style="color: rgba(0, 0, 0, 1)"> transform: scale(0.8);
</span><span style="color: rgba(0, 128, 128, 1)">217</span> <span style="color: rgba(0, 0, 0, 1)"> transition: transform 0.5s;
</span><span style="color: rgba(0, 128, 128, 1)">218</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">219</span>
<span style="color: rgba(0, 128, 128, 1)">220</span> <span style="color: rgba(0, 0, 0, 1)">#youtube:hover,
</span><span style="color: rgba(0, 128, 128, 1)">221</span> <span style="color: rgba(0, 0, 0, 1)">#youtube:focus {
</span><span style="color: rgba(0, 128, 128, 1)">222</span> <span style="color: rgba(0, 0, 0, 1)"> transform: scale(0.9);
</span><span style="color: rgba(0, 128, 128, 1)">223</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">224</span>
<span style="color: rgba(0, 128, 128, 1)">225</span> <span style="color: rgba(0, 0, 0, 1)">#youtube::before {
</span><span style="color: rgba(0, 128, 128, 1)">226</span> <span style="color: rgba(0, 0, 0, 1)"> content: "";
</span><span style="color: rgba(0, 128, 128, 1)">227</span> <span style="color: rgba(0, 0, 0, 1)"> display: block;
</span><span style="color: rgba(0, 128, 128, 1)">228</span> <span style="color: rgba(0, 0, 0, 1)"> position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">229</span> <span style="color: rgba(0, 0, 0, 1)"> top: 7.5%;
</span><span style="color: rgba(0, 128, 128, 1)">230</span> <span style="color: rgba(0, 0, 0, 1)"> left: -6%;
</span><span style="color: rgba(0, 128, 128, 1)">231</span> <span style="color: rgba(0, 0, 0, 1)"> width: 112%;
</span><span style="color: rgba(0, 128, 128, 1)">232</span> <span style="color: rgba(0, 0, 0, 1)"> height: 85%;
</span><span style="color: rgba(0, 128, 128, 1)">233</span> <span style="color: rgba(0, 0, 0, 1)"> background: red;
</span><span style="color: rgba(0, 128, 128, 1)">234</span> <span style="color: rgba(0, 0, 0, 1)"> border-radius: 9% / 50%;
</span><span style="color: rgba(0, 128, 128, 1)">235</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">236</span>
<span style="color: rgba(0, 128, 128, 1)">237</span> <span style="color: rgba(0, 0, 0, 1)">#youtube::after {
</span><span style="color: rgba(0, 128, 128, 1)">238</span> <span style="color: rgba(0, 0, 0, 1)"> content: "";
</span><span style="color: rgba(0, 128, 128, 1)">239</span> <span style="color: rgba(0, 0, 0, 1)"> display: block;
</span><span style="color: rgba(0, 128, 128, 1)">240</span> <span style="color: rgba(0, 0, 0, 1)"> position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">241</span> <span style="color: rgba(0, 0, 0, 1)"> top: 20px;
</span><span style="color: rgba(0, 128, 128, 1)">242</span> <span style="color: rgba(0, 0, 0, 1)"> left: 40px;
</span><span style="color: rgba(0, 128, 128, 1)">243</span> <span style="color: rgba(0, 0, 0, 1)"> width: 45px;
</span><span style="color: rgba(0, 128, 128, 1)">244</span> <span style="color: rgba(0, 0, 0, 1)"> height: 30px;
</span><span style="color: rgba(0, 128, 128, 1)">245</span> <span style="color: rgba(0, 0, 0, 1)"> border: 15px solid transparent;
</span><span style="color: rgba(0, 128, 128, 1)">246</span> <span style="color: rgba(0, 0, 0, 1)"> box-sizing: border-box;
</span><span style="color: rgba(0, 128, 128, 1)">247</span> <span style="color: rgba(0, 0, 0, 1)"> border-left: 30px solid white;
</span><span style="color: rgba(0, 128, 128, 1)">248</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">249</span>
<span style="color: rgba(0, 128, 128, 1)">250</span> <span style="color: rgba(0, 0, 0, 1)">#youtube span {
</span><span style="color: rgba(0, 128, 128, 1)">251</span> <span style="color: rgba(0, 0, 0, 1)"> font-size: 0;
</span><span style="color: rgba(0, 128, 128, 1)">252</span> <span style="color: rgba(0, 0, 0, 1)"> position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">253</span> <span style="color: rgba(0, 0, 0, 1)"> width: 0;
</span><span style="color: rgba(0, 128, 128, 1)">254</span> <span style="color: rgba(0, 0, 0, 1)"> height: 0;
</span><span style="color: rgba(0, 128, 128, 1)">255</span> <span style="color: rgba(0, 0, 0, 1)"> overflow: hidden;
</span><span style="color: rgba(0, 128, 128, 1)">256</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">257</span>
<span style="color: rgba(0, 128, 128, 1)">258</span> <span style="color: rgba(0, 0, 0, 1)">#youtube:hover + #youtube-card {
</span><span style="color: rgba(0, 128, 128, 1)">259</span> <span style="color: rgba(0, 0, 0, 1)"> display: block;
</span><span style="color: rgba(0, 128, 128, 1)">260</span> <span style="color: rgba(0, 0, 0, 1)"> position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">261</span> <span style="color: rgba(0, 0, 0, 1)"> bottom: 12px;
</span><span style="color: rgba(0, 128, 128, 1)">262</span> <span style="color: rgba(0, 0, 0, 1)"> right: 10px;
</span><span style="color: rgba(0, 128, 128, 1)">263</span> <span style="color: rgba(0, 0, 0, 1)"> padding: 25px 130px 25px 25px;
</span><span style="color: rgba(0, 128, 128, 1)">264</span> <span style="color: rgba(0, 0, 0, 1)"> width: 300px;
</span><span style="color: rgba(0, 128, 128, 1)">265</span> <span style="color: rgba(0, 0, 0, 1)"> background-color: white;
</span><span style="color: rgba(0, 128, 128, 1)">266</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">267</span> }</pre>
</div>
<p>JS(js/script.js)源代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">/*
</span><span style="color: rgba(0, 128, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">If you want to know how this game works, you can find a source code walkthrough video here: https://youtu.be/bTk6dcAckuI
</span><span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 0, 1)">Follow me on twitter for more: https://twitter.com/HunorBorbely
</span><span style="color: rgba(0, 128, 128, 1)">6</span>
<span style="color: rgba(0, 128, 128, 1)">7</span> <span style="color: rgba(0, 0, 0, 1)">*/
</span><span style="color: rgba(0, 128, 128, 1)">8</span>
<span style="color: rgba(0, 128, 128, 1)">9</span> <span style="color: rgba(0, 0, 0, 1)">Math.minmax = (value, limit) => {
</span><span style="color: rgba(0, 128, 128, 1)"> 10</span> <span style="color: rgba(0, 0, 0, 1)">return Math.max(Math.min(value, limit), -limit);
</span><span style="color: rgba(0, 128, 128, 1)"> 11</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 12</span>
<span style="color: rgba(0, 128, 128, 1)"> 13</span> <span style="color: rgba(0, 0, 0, 1)">const distance2D = (p1, p2) => {
</span><span style="color: rgba(0, 128, 128, 1)"> 14</span> <span style="color: rgba(0, 0, 0, 1)">return Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2);
</span><span style="color: rgba(0, 128, 128, 1)"> 15</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 16</span>
<span style="color: rgba(0, 128, 128, 1)"> 17</span> <span style="color: rgba(0, 0, 0, 1)">// Angle between the two points
</span><span style="color: rgba(0, 128, 128, 1)"> 18</span> <span style="color: rgba(0, 0, 0, 1)">const getAngle = (p1, p2) => {
</span><span style="color: rgba(0, 128, 128, 1)"> 19</span> <span style="color: rgba(0, 0, 0, 1)">let angle = Math.atan((p2.y - p1.y) / (p2.x - p1.x));
</span><span style="color: rgba(0, 128, 128, 1)"> 20</span> if (p2.x - p1.x <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)"> 0</span><span style="color: rgba(255, 0, 0, 1)">) angle +</span><span style="color: rgba(0, 0, 255, 1)">= Math.PI;
</span><span style="color: rgba(0, 128, 128, 1)"> 21</span> <span style="color: rgba(255, 0, 0, 1)">return angle;
</span><span style="color: rgba(0, 128, 128, 1)"> 22</span> <span style="color: rgba(255, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 23</span>
<span style="color: rgba(0, 128, 128, 1)"> 24</span> <span style="color: rgba(255, 0, 0, 1)">// The closest a ball and a wall cap can be
</span><span style="color: rgba(0, 128, 128, 1)"> 25</span> <span style="color: rgba(255, 0, 0, 1)">const closestItCanBe </span><span style="color: rgba(0, 0, 255, 1)">= (cap, </span><span style="color: rgba(255, 0, 0, 1)">ball) </span><span style="color: rgba(0, 0, 255, 1)">=</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 26</span> <span style="color: rgba(0, 0, 0, 1)">let angle = getAngle(cap, ball);
</span><span style="color: rgba(0, 128, 128, 1)"> 27</span>
<span style="color: rgba(0, 128, 128, 1)"> 28</span> <span style="color: rgba(0, 0, 0, 1)">const deltaX = Math.cos(angle) * (wallW / 2 + ballSize / 2);
</span><span style="color: rgba(0, 128, 128, 1)"> 29</span> <span style="color: rgba(0, 0, 0, 1)">const deltaY = Math.sin(angle) * (wallW / 2 + ballSize / 2);
</span><span style="color: rgba(0, 128, 128, 1)"> 30</span>
<span style="color: rgba(0, 128, 128, 1)"> 31</span> <span style="color: rgba(0, 0, 0, 1)">return { x: cap.x + deltaX, y: cap.y + deltaY };
</span><span style="color: rgba(0, 128, 128, 1)"> 32</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 33</span>
<span style="color: rgba(0, 128, 128, 1)"> 34</span> <span style="color: rgba(0, 0, 0, 1)">// Roll the ball around the wall cap
</span><span style="color: rgba(0, 128, 128, 1)"> 35</span> <span style="color: rgba(0, 0, 0, 1)">const rollAroundCap = (cap, ball) => {
</span><span style="color: rgba(0, 128, 128, 1)"> 36</span> <span style="color: rgba(0, 0, 0, 1)">// The direction the ball can't move any further because the wall holds it back
</span><span style="color: rgba(0, 128, 128, 1)"> 37</span> <span style="color: rgba(0, 0, 0, 1)">let impactAngle = getAngle(ball, cap);
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span>
<span style="color: rgba(0, 128, 128, 1)"> 39</span> <span style="color: rgba(0, 0, 0, 1)">// The direction the ball wants to move based on it's velocity
</span><span style="color: rgba(0, 128, 128, 1)"> 40</span> <span style="color: rgba(0, 0, 0, 1)">let heading = getAngle(
</span><span style="color: rgba(0, 128, 128, 1)"> 41</span> <span style="color: rgba(0, 0, 0, 1)"> { x: 0, y: 0 },
</span><span style="color: rgba(0, 128, 128, 1)"> 42</span> <span style="color: rgba(0, 0, 0, 1)"> { x: ball.velocityX, y: ball.velocityY }
</span><span style="color: rgba(0, 128, 128, 1)"> 43</span> <span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 44</span>
<span style="color: rgba(0, 128, 128, 1)"> 45</span> <span style="color: rgba(0, 0, 0, 1)">// The angle between the impact direction and the ball's desired direction
</span><span style="color: rgba(0, 128, 128, 1)"> 46</span> <span style="color: rgba(0, 0, 0, 1)">// The smaller this angle is, the bigger the impact
</span><span style="color: rgba(0, 128, 128, 1)"> 47</span> <span style="color: rgba(0, 0, 0, 1)">// The closer it is to 90 degrees the smoother it gets (at 90 there would be no collision)
</span><span style="color: rgba(0, 128, 128, 1)"> 48</span> <span style="color: rgba(0, 0, 0, 1)">let impactHeadingAngle = impactAngle - heading;
</span><span style="color: rgba(0, 128, 128, 1)"> 49</span>
<span style="color: rgba(0, 128, 128, 1)"> 50</span> <span style="color: rgba(0, 0, 0, 1)">// Velocity distance if not hit would have occurred
</span><span style="color: rgba(0, 128, 128, 1)"> 51</span> <span style="color: rgba(0, 0, 0, 1)">const velocityMagnitude = distance2D(
</span><span style="color: rgba(0, 128, 128, 1)"> 52</span> <span style="color: rgba(0, 0, 0, 1)"> { x: 0, y: 0 },
</span><span style="color: rgba(0, 128, 128, 1)"> 53</span> <span style="color: rgba(0, 0, 0, 1)"> { x: ball.velocityX, y: ball.velocityY }
</span><span style="color: rgba(0, 128, 128, 1)"> 54</span> <span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 55</span> <span style="color: rgba(0, 0, 0, 1)">// Velocity component diagonal to the impact
</span><span style="color: rgba(0, 128, 128, 1)"> 56</span> <span style="color: rgba(0, 0, 0, 1)">const velocityMagnitudeDiagonalToTheImpact =
</span><span style="color: rgba(0, 128, 128, 1)"> 57</span> <span style="color: rgba(0, 0, 0, 1)"> Math.sin(impactHeadingAngle) * velocityMagnitude;
</span><span style="color: rgba(0, 128, 128, 1)"> 58</span>
<span style="color: rgba(0, 128, 128, 1)"> 59</span> <span style="color: rgba(0, 0, 0, 1)">// How far should the ball be from the wall cap
</span><span style="color: rgba(0, 128, 128, 1)"> 60</span> <span style="color: rgba(0, 0, 0, 1)">const closestDistance = wallW / 2 + ballSize / 2;
</span><span style="color: rgba(0, 128, 128, 1)"> 61</span>
<span style="color: rgba(0, 128, 128, 1)"> 62</span> <span style="color: rgba(0, 0, 0, 1)">const rotationAngle = Math.atan(
</span><span style="color: rgba(0, 128, 128, 1)"> 63</span> <span style="color: rgba(0, 0, 0, 1)"> velocityMagnitudeDiagonalToTheImpact / closestDistance
</span><span style="color: rgba(0, 128, 128, 1)"> 64</span> <span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 65</span>
<span style="color: rgba(0, 128, 128, 1)"> 66</span> <span style="color: rgba(0, 0, 0, 1)">const deltaFromCap = {
</span><span style="color: rgba(0, 128, 128, 1)"> 67</span> <span style="color: rgba(0, 0, 0, 1)"> x: Math.cos(impactAngle + Math.PI - rotationAngle) * closestDistance,
</span><span style="color: rgba(0, 128, 128, 1)"> 68</span> <span style="color: rgba(0, 0, 0, 1)"> y: Math.sin(impactAngle + Math.PI - rotationAngle) * closestDistance
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 70</span>
<span style="color: rgba(0, 128, 128, 1)"> 71</span> <span style="color: rgba(0, 0, 0, 1)">const x = ball.x;
</span><span style="color: rgba(0, 128, 128, 1)"> 72</span> <span style="color: rgba(0, 0, 0, 1)">const y = ball.y;
</span><span style="color: rgba(0, 128, 128, 1)"> 73</span> <span style="color: rgba(0, 0, 0, 1)">const velocityX = ball.x - (cap.x + deltaFromCap.x);
</span><span style="color: rgba(0, 128, 128, 1)"> 74</span> <span style="color: rgba(0, 0, 0, 1)">const velocityY = ball.y - (cap.y + deltaFromCap.y);
</span><span style="color: rgba(0, 128, 128, 1)"> 75</span> <span style="color: rgba(0, 0, 0, 1)">const nextX = x + velocityX;
</span><span style="color: rgba(0, 128, 128, 1)"> 76</span> <span style="color: rgba(0, 0, 0, 1)">const nextY = y + velocityY;
</span><span style="color: rgba(0, 128, 128, 1)"> 77</span>
<span style="color: rgba(0, 128, 128, 1)"> 78</span> <span style="color: rgba(0, 0, 0, 1)">return { x, y, velocityX, velocityY, nextX, nextY };
</span><span style="color: rgba(0, 128, 128, 1)"> 79</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 80</span>
<span style="color: rgba(0, 128, 128, 1)"> 81</span> <span style="color: rgba(0, 0, 0, 1)">// Decreases the absolute value of a number but keeps it's sign, doesn't go below abs 0
</span><span style="color: rgba(0, 128, 128, 1)"> 82</span> <span style="color: rgba(0, 0, 0, 1)">const slow = (number, difference) => {
</span><span style="color: rgba(0, 128, 128, 1)"> 83</span> if (Math.abs(number) <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">= difference</span><span style="color: rgba(255, 0, 0, 1)">) return 0;
</span><span style="color: rgba(0, 128, 128, 1)"> 84</span> <span style="color: rgba(255, 0, 0, 1)">if (number </span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> difference) return number - difference;
</span><span style="color: rgba(0, 128, 128, 1)"> 85</span> <span style="color: rgba(0, 0, 0, 1)">return number + difference;
</span><span style="color: rgba(0, 128, 128, 1)"> 86</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span>
<span style="color: rgba(0, 128, 128, 1)"> 88</span> <span style="color: rgba(0, 0, 0, 1)">const mazeElement = document.getElementById("maze");
</span><span style="color: rgba(0, 128, 128, 1)"> 89</span> <span style="color: rgba(0, 0, 0, 1)">const joystickHeadElement = document.getElementById("joystick-head");
</span><span style="color: rgba(0, 128, 128, 1)"> 90</span> <span style="color: rgba(0, 0, 0, 1)">const noteElement = document.getElementById("note"); // Note element for instructions and game won, game failed texts
</span><span style="color: rgba(0, 128, 128, 1)"> 91</span>
<span style="color: rgba(0, 128, 128, 1)"> 92</span> <span style="color: rgba(0, 0, 0, 1)">let hardMode = false;
</span><span style="color: rgba(0, 128, 128, 1)"> 93</span> <span style="color: rgba(0, 0, 0, 1)">let previousTimestamp;
</span><span style="color: rgba(0, 128, 128, 1)"> 94</span> <span style="color: rgba(0, 0, 0, 1)">let gameInProgress;
</span><span style="color: rgba(0, 128, 128, 1)"> 95</span> <span style="color: rgba(0, 0, 0, 1)">let mouseStartX;
</span><span style="color: rgba(0, 128, 128, 1)"> 96</span> <span style="color: rgba(0, 0, 0, 1)">let mouseStartY;
</span><span style="color: rgba(0, 128, 128, 1)"> 97</span> <span style="color: rgba(0, 0, 0, 1)">let accelerationX;
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span> <span style="color: rgba(0, 0, 0, 1)">let accelerationY;
</span><span style="color: rgba(0, 128, 128, 1)"> 99</span> <span style="color: rgba(0, 0, 0, 1)">let frictionX;
</span><span style="color: rgba(0, 128, 128, 1)">100</span> <span style="color: rgba(0, 0, 0, 1)">let frictionY;
</span><span style="color: rgba(0, 128, 128, 1)">101</span>
<span style="color: rgba(0, 128, 128, 1)">102</span> <span style="color: rgba(0, 0, 0, 1)">const pathW = 25; // Path width
</span><span style="color: rgba(0, 128, 128, 1)">103</span> <span style="color: rgba(0, 0, 0, 1)">const wallW = 10; // Wall width
</span><span style="color: rgba(0, 128, 128, 1)">104</span> <span style="color: rgba(0, 0, 0, 1)">const ballSize = 10; // Width and height of the ball
</span><span style="color: rgba(0, 128, 128, 1)">105</span> <span style="color: rgba(0, 0, 0, 1)">const holeSize = 18;
</span><span style="color: rgba(0, 128, 128, 1)">106</span>
<span style="color: rgba(0, 128, 128, 1)">107</span> <span style="color: rgba(0, 0, 0, 1)">const debugMode = false;
</span><span style="color: rgba(0, 128, 128, 1)">108</span>
<span style="color: rgba(0, 128, 128, 1)">109</span> <span style="color: rgba(0, 0, 0, 1)">let balls = [];
</span><span style="color: rgba(0, 128, 128, 1)">110</span> <span style="color: rgba(0, 0, 0, 1)">let ballElements = [];
</span><span style="color: rgba(0, 128, 128, 1)">111</span> <span style="color: rgba(0, 0, 0, 1)">let holeElements = [];
</span><span style="color: rgba(0, 128, 128, 1)">112</span>
<span style="color: rgba(0, 128, 128, 1)">113</span> <span style="color: rgba(0, 0, 0, 1)">resetGame();
</span><span style="color: rgba(0, 128, 128, 1)">114</span>
<span style="color: rgba(0, 128, 128, 1)">115</span> <span style="color: rgba(0, 0, 0, 1)">// Draw balls for the first time
</span><span style="color: rgba(0, 128, 128, 1)">116</span> <span style="color: rgba(0, 0, 0, 1)">balls.forEach(({ x, y }) => {
</span><span style="color: rgba(0, 128, 128, 1)">117</span> <span style="color: rgba(0, 0, 0, 1)">const ball = document.createElement("div");
</span><span style="color: rgba(0, 128, 128, 1)">118</span> <span style="color: rgba(0, 0, 0, 1)">ball.setAttribute("class", "ball");
</span><span style="color: rgba(0, 128, 128, 1)">119</span> <span style="color: rgba(0, 0, 0, 1)">ball.style.cssText = `left: ${x}px; top: ${y}px; `;
</span><span style="color: rgba(0, 128, 128, 1)">120</span>
<span style="color: rgba(0, 128, 128, 1)">121</span> <span style="color: rgba(0, 0, 0, 1)">mazeElement.appendChild(ball);
</span><span style="color: rgba(0, 128, 128, 1)">122</span> <span style="color: rgba(0, 0, 0, 1)">ballElements.push(ball);
</span><span style="color: rgba(0, 128, 128, 1)">123</span> <span style="color: rgba(0, 0, 0, 1)">});
</span><span style="color: rgba(0, 128, 128, 1)">124</span>
<span style="color: rgba(0, 128, 128, 1)">125</span> <span style="color: rgba(0, 0, 0, 1)">// Wall metadata
</span><span style="color: rgba(0, 128, 128, 1)">126</span> <span style="color: rgba(0, 0, 0, 1)">const walls = [
</span><span style="color: rgba(0, 128, 128, 1)">127</span> <span style="color: rgba(0, 0, 0, 1)">// Border
</span><span style="color: rgba(0, 128, 128, 1)">128</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 0, row: 0, horizontal: true, length: 10 },
</span><span style="color: rgba(0, 128, 128, 1)">129</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 0, row: 0, horizontal: false, length: 9 },
</span><span style="color: rgba(0, 128, 128, 1)">130</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 0, row: 9, horizontal: true, length: 10 },
</span><span style="color: rgba(0, 128, 128, 1)">131</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 10, row: 0, horizontal: false, length: 9 },
</span><span style="color: rgba(0, 128, 128, 1)">132</span>
<span style="color: rgba(0, 128, 128, 1)">133</span> <span style="color: rgba(0, 0, 0, 1)">// Horizontal lines starting in 1st column
</span><span style="color: rgba(0, 128, 128, 1)">134</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 0, row: 6, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">135</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 0, row: 8, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">136</span>
<span style="color: rgba(0, 128, 128, 1)">137</span> <span style="color: rgba(0, 0, 0, 1)">// Horizontal lines starting in 2nd column
</span><span style="color: rgba(0, 128, 128, 1)">138</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 1, row: 1, horizontal: true, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">139</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 1, row: 7, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">140</span>
<span style="color: rgba(0, 128, 128, 1)">141</span> <span style="color: rgba(0, 0, 0, 1)">// Horizontal lines starting in 3rd column
</span><span style="color: rgba(0, 128, 128, 1)">142</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 2, row: 2, horizontal: true, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">143</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 2, row: 4, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">144</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 2, row: 5, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">145</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 2, row: 6, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">146</span>
<span style="color: rgba(0, 128, 128, 1)">147</span> <span style="color: rgba(0, 0, 0, 1)">// Horizontal lines starting in 4th column
</span><span style="color: rgba(0, 128, 128, 1)">148</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 3, row: 3, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">149</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 3, row: 8, horizontal: true, length: 3 },
</span><span style="color: rgba(0, 128, 128, 1)">150</span>
<span style="color: rgba(0, 128, 128, 1)">151</span> <span style="color: rgba(0, 0, 0, 1)">// Horizontal lines starting in 5th column
</span><span style="color: rgba(0, 128, 128, 1)">152</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 4, row: 6, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">153</span>
<span style="color: rgba(0, 128, 128, 1)">154</span> <span style="color: rgba(0, 0, 0, 1)">// Horizontal lines starting in 6th column
</span><span style="color: rgba(0, 128, 128, 1)">155</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 5, row: 2, horizontal: true, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">156</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 5, row: 7, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">157</span>
<span style="color: rgba(0, 128, 128, 1)">158</span> <span style="color: rgba(0, 0, 0, 1)">// Horizontal lines starting in 7th column
</span><span style="color: rgba(0, 128, 128, 1)">159</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 6, row: 1, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">160</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 6, row: 6, horizontal: true, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">161</span>
<span style="color: rgba(0, 128, 128, 1)">162</span> <span style="color: rgba(0, 0, 0, 1)">// Horizontal lines starting in 8th column
</span><span style="color: rgba(0, 128, 128, 1)">163</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 7, row: 3, horizontal: true, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">164</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 7, row: 7, horizontal: true, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">165</span>
<span style="color: rgba(0, 128, 128, 1)">166</span> <span style="color: rgba(0, 0, 0, 1)">// Horizontal lines starting in 9th column
</span><span style="color: rgba(0, 128, 128, 1)">167</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 8, row: 1, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">168</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 8, row: 2, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">169</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 8, row: 3, horizontal: true, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">170</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 8, row: 4, horizontal: true, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">171</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 8, row: 8, horizontal: true, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">172</span>
<span style="color: rgba(0, 128, 128, 1)">173</span> <span style="color: rgba(0, 0, 0, 1)">// Vertical lines after the 1st column
</span><span style="color: rgba(0, 128, 128, 1)">174</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 1, row: 1, horizontal: false, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">175</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 1, row: 4, horizontal: false, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">176</span>
<span style="color: rgba(0, 128, 128, 1)">177</span> <span style="color: rgba(0, 0, 0, 1)">// Vertical lines after the 2nd column
</span><span style="color: rgba(0, 128, 128, 1)">178</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 2, row: 2, horizontal: false, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">179</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 2, row: 5, horizontal: false, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">180</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 2, row: 7, horizontal: false, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">181</span>
<span style="color: rgba(0, 128, 128, 1)">182</span> <span style="color: rgba(0, 0, 0, 1)">// Vertical lines after the 3rd column
</span><span style="color: rgba(0, 128, 128, 1)">183</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 3, row: 0, horizontal: false, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">184</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 3, row: 4, horizontal: false, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">185</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 3, row: 6, horizontal: false, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">186</span>
<span style="color: rgba(0, 128, 128, 1)">187</span> <span style="color: rgba(0, 0, 0, 1)">// Vertical lines after the 4th column
</span><span style="color: rgba(0, 128, 128, 1)">188</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 4, row: 1, horizontal: false, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">189</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 4, row: 6, horizontal: false, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">190</span>
<span style="color: rgba(0, 128, 128, 1)">191</span> <span style="color: rgba(0, 0, 0, 1)">// Vertical lines after the 5th column
</span><span style="color: rgba(0, 128, 128, 1)">192</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 5, row: 0, horizontal: false, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">193</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 5, row: 6, horizontal: false, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">194</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 5, row: 8, horizontal: false, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">195</span>
<span style="color: rgba(0, 128, 128, 1)">196</span> <span style="color: rgba(0, 0, 0, 1)">// Vertical lines after the 6th column
</span><span style="color: rgba(0, 128, 128, 1)">197</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 6, row: 4, horizontal: false, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">198</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 6, row: 6, horizontal: false, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">199</span>
<span style="color: rgba(0, 128, 128, 1)">200</span> <span style="color: rgba(0, 0, 0, 1)">// Vertical lines after the 7th column
</span><span style="color: rgba(0, 128, 128, 1)">201</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 7, row: 1, horizontal: false, length: 4 },
</span><span style="color: rgba(0, 128, 128, 1)">202</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 7, row: 7, horizontal: false, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">203</span>
<span style="color: rgba(0, 128, 128, 1)">204</span> <span style="color: rgba(0, 0, 0, 1)">// Vertical lines after the 8th column
</span><span style="color: rgba(0, 128, 128, 1)">205</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 8, row: 2, horizontal: false, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">206</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 8, row: 4, horizontal: false, length: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">207</span>
<span style="color: rgba(0, 128, 128, 1)">208</span> <span style="color: rgba(0, 0, 0, 1)">// Vertical lines after the 9th column
</span><span style="color: rgba(0, 128, 128, 1)">209</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 9, row: 1, horizontal: false, length: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">210</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 9, row: 5, horizontal: false, length: 2 }
</span><span style="color: rgba(0, 128, 128, 1)">211</span> <span style="color: rgba(0, 0, 0, 1)">].map((wall) => ({
</span><span style="color: rgba(0, 128, 128, 1)">212</span> <span style="color: rgba(0, 0, 0, 1)">x: wall.column * (pathW + wallW),
</span><span style="color: rgba(0, 128, 128, 1)">213</span> <span style="color: rgba(0, 0, 0, 1)">y: wall.row * (pathW + wallW),
</span><span style="color: rgba(0, 128, 128, 1)">214</span> <span style="color: rgba(0, 0, 0, 1)">horizontal: wall.horizontal,
</span><span style="color: rgba(0, 128, 128, 1)">215</span> <span style="color: rgba(0, 0, 0, 1)">length: wall.length * (pathW + wallW)
</span><span style="color: rgba(0, 128, 128, 1)">216</span> <span style="color: rgba(0, 0, 0, 1)">}));
</span><span style="color: rgba(0, 128, 128, 1)">217</span>
<span style="color: rgba(0, 128, 128, 1)">218</span> <span style="color: rgba(0, 0, 0, 1)">// Draw walls
</span><span style="color: rgba(0, 128, 128, 1)">219</span> <span style="color: rgba(0, 0, 0, 1)">walls.forEach(({ x, y, horizontal, length }) => {
</span><span style="color: rgba(0, 128, 128, 1)">220</span> <span style="color: rgba(0, 0, 0, 1)">const wall = document.createElement("div");
</span><span style="color: rgba(0, 128, 128, 1)">221</span> <span style="color: rgba(0, 0, 0, 1)">wall.setAttribute("class", "wall");
</span><span style="color: rgba(0, 128, 128, 1)">222</span> <span style="color: rgba(0, 0, 0, 1)">wall.style.cssText = `
</span><span style="color: rgba(0, 128, 128, 1)">223</span> <span style="color: rgba(0, 0, 0, 1)"> left: ${x}px;
</span><span style="color: rgba(0, 128, 128, 1)">224</span> <span style="color: rgba(0, 0, 0, 1)"> top: ${y}px;
</span><span style="color: rgba(0, 128, 128, 1)">225</span> <span style="color: rgba(0, 0, 0, 1)"> width: ${wallW}px;
</span><span style="color: rgba(0, 128, 128, 1)">226</span> <span style="color: rgba(0, 0, 0, 1)"> height: ${length}px;
</span><span style="color: rgba(0, 128, 128, 1)">227</span> <span style="color: rgba(0, 0, 0, 1)"> transform: rotate(${horizontal ? -90 : 0}deg);
</span><span style="color: rgba(0, 128, 128, 1)">228</span> <span style="color: rgba(0, 0, 0, 1)"> `;
</span><span style="color: rgba(0, 128, 128, 1)">229</span>
<span style="color: rgba(0, 128, 128, 1)">230</span> <span style="color: rgba(0, 0, 0, 1)">mazeElement.appendChild(wall);
</span><span style="color: rgba(0, 128, 128, 1)">231</span> <span style="color: rgba(0, 0, 0, 1)">});
</span><span style="color: rgba(0, 128, 128, 1)">232</span>
<span style="color: rgba(0, 128, 128, 1)">233</span> <span style="color: rgba(0, 0, 0, 1)">const holes = [
</span><span style="color: rgba(0, 128, 128, 1)">234</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 0, row: 5 },
</span><span style="color: rgba(0, 128, 128, 1)">235</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 2, row: 0 },
</span><span style="color: rgba(0, 128, 128, 1)">236</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 2, row: 4 },
</span><span style="color: rgba(0, 128, 128, 1)">237</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 4, row: 6 },
</span><span style="color: rgba(0, 128, 128, 1)">238</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 6, row: 2 },
</span><span style="color: rgba(0, 128, 128, 1)">239</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 6, row: 8 },
</span><span style="color: rgba(0, 128, 128, 1)">240</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 8, row: 1 },
</span><span style="color: rgba(0, 128, 128, 1)">241</span> <span style="color: rgba(0, 0, 0, 1)">{ column: 8, row: 2 }
</span><span style="color: rgba(0, 128, 128, 1)">242</span> <span style="color: rgba(0, 0, 0, 1)">].map((hole) => ({
</span><span style="color: rgba(0, 128, 128, 1)">243</span> <span style="color: rgba(0, 0, 0, 1)">x: hole.column * (wallW + pathW) + (wallW / 2 + pathW / 2),
</span><span style="color: rgba(0, 128, 128, 1)">244</span> <span style="color: rgba(0, 0, 0, 1)">y: hole.row * (wallW + pathW) + (wallW / 2 + pathW / 2)
</span><span style="color: rgba(0, 128, 128, 1)">245</span> <span style="color: rgba(0, 0, 0, 1)">}));
</span><span style="color: rgba(0, 128, 128, 1)">246</span>
<span style="color: rgba(0, 128, 128, 1)">247</span> <span style="color: rgba(0, 0, 0, 1)">joystickHeadElement.addEventListener("mousedown", function (event) {
</span><span style="color: rgba(0, 128, 128, 1)">248</span> <span style="color: rgba(0, 0, 0, 1)">if (!gameInProgress) {
</span><span style="color: rgba(0, 128, 128, 1)">249</span> <span style="color: rgba(0, 0, 0, 1)"> mouseStartX = event.clientX;
</span><span style="color: rgba(0, 128, 128, 1)">250</span> <span style="color: rgba(0, 0, 0, 1)"> mouseStartY = event.clientY;
</span><span style="color: rgba(0, 128, 128, 1)">251</span> <span style="color: rgba(0, 0, 0, 1)"> gameInProgress = true;
</span><span style="color: rgba(0, 128, 128, 1)">252</span> <span style="color: rgba(0, 0, 0, 1)"> window.requestAnimationFrame(main);
</span><span style="color: rgba(0, 128, 128, 1)">253</span> <span style="color: rgba(0, 0, 0, 1)"> noteElement.style.opacity = 0;
</span><span style="color: rgba(0, 128, 128, 1)">254</span> <span style="color: rgba(0, 0, 0, 1)"> joystickHeadElement.style.cssText = `
</span><span style="color: rgba(0, 128, 128, 1)">255</span> <span style="color: rgba(0, 0, 0, 1)"> animation: none;
</span><span style="color: rgba(0, 128, 128, 1)">256</span> <span style="color: rgba(0, 0, 0, 1)"> cursor: grabbing;
</span><span style="color: rgba(0, 128, 128, 1)">257</span> <span style="color: rgba(0, 0, 0, 1)"> `;
</span><span style="color: rgba(0, 128, 128, 1)">258</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">259</span> <span style="color: rgba(0, 0, 0, 1)">});
</span><span style="color: rgba(0, 128, 128, 1)">260</span>
<span style="color: rgba(0, 128, 128, 1)">261</span> <span style="color: rgba(0, 0, 0, 1)">window.addEventListener("mousemove", function (event) {
</span><span style="color: rgba(0, 128, 128, 1)">262</span> <span style="color: rgba(0, 0, 0, 1)">if (gameInProgress) {
</span><span style="color: rgba(0, 128, 128, 1)">263</span> <span style="color: rgba(0, 0, 0, 1)"> const mouseDeltaX = -Math.minmax(mouseStartX - event.clientX, 15);
</span><span style="color: rgba(0, 128, 128, 1)">264</span> <span style="color: rgba(0, 0, 0, 1)"> const mouseDeltaY = -Math.minmax(mouseStartY - event.clientY, 15);
</span><span style="color: rgba(0, 128, 128, 1)">265</span>
<span style="color: rgba(0, 128, 128, 1)">266</span> <span style="color: rgba(0, 0, 0, 1)"> joystickHeadElement.style.cssText = `
</span><span style="color: rgba(0, 128, 128, 1)">267</span> <span style="color: rgba(0, 0, 0, 1)"> left: ${mouseDeltaX}px;
</span><span style="color: rgba(0, 128, 128, 1)">268</span> <span style="color: rgba(0, 0, 0, 1)"> top: ${mouseDeltaY}px;
</span><span style="color: rgba(0, 128, 128, 1)">269</span> <span style="color: rgba(0, 0, 0, 1)"> animation: none;
</span><span style="color: rgba(0, 128, 128, 1)">270</span> <span style="color: rgba(0, 0, 0, 1)"> cursor: grabbing;
</span><span style="color: rgba(0, 128, 128, 1)">271</span> <span style="color: rgba(0, 0, 0, 1)"> `;
</span><span style="color: rgba(0, 128, 128, 1)">272</span>
<span style="color: rgba(0, 128, 128, 1)">273</span> <span style="color: rgba(0, 0, 0, 1)"> const rotationY = mouseDeltaX * 0.8; // Max rotation = 12
</span><span style="color: rgba(0, 128, 128, 1)">274</span> <span style="color: rgba(0, 0, 0, 1)"> const rotationX = mouseDeltaY * 0.8;
</span><span style="color: rgba(0, 128, 128, 1)">275</span>
<span style="color: rgba(0, 128, 128, 1)">276</span> <span style="color: rgba(0, 0, 0, 1)"> mazeElement.style.cssText = `
</span><span style="color: rgba(0, 128, 128, 1)">277</span> <span style="color: rgba(0, 0, 0, 1)"> transform: rotateY(${rotationY}deg) rotateX(${-rotationX}deg)
</span><span style="color: rgba(0, 128, 128, 1)">278</span> <span style="color: rgba(0, 0, 0, 1)"> `;
</span><span style="color: rgba(0, 128, 128, 1)">279</span>
<span style="color: rgba(0, 128, 128, 1)">280</span> <span style="color: rgba(0, 0, 0, 1)"> const gravity = 2;
</span><span style="color: rgba(0, 128, 128, 1)">281</span> <span style="color: rgba(0, 0, 0, 1)"> const friction = 0.01; // Coefficients of friction
</span><span style="color: rgba(0, 128, 128, 1)">282</span>
<span style="color: rgba(0, 128, 128, 1)">283</span> <span style="color: rgba(0, 0, 0, 1)"> accelerationX = gravity * Math.sin((rotationY / 180) * Math.PI);
</span><span style="color: rgba(0, 128, 128, 1)">284</span> <span style="color: rgba(0, 0, 0, 1)"> accelerationY = gravity * Math.sin((rotationX / 180) * Math.PI);
</span><span style="color: rgba(0, 128, 128, 1)">285</span> <span style="color: rgba(0, 0, 0, 1)"> frictionX = gravity * Math.cos((rotationY / 180) * Math.PI) * friction;
</span><span style="color: rgba(0, 128, 128, 1)">286</span> <span style="color: rgba(0, 0, 0, 1)"> frictionY = gravity * Math.cos((rotationX / 180) * Math.PI) * friction;
</span><span style="color: rgba(0, 128, 128, 1)">287</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">288</span> <span style="color: rgba(0, 0, 0, 1)">});
</span><span style="color: rgba(0, 128, 128, 1)">289</span>
<span style="color: rgba(0, 128, 128, 1)">290</span> <span style="color: rgba(0, 0, 0, 1)">window.addEventListener("keydown", function (event) {
</span><span style="color: rgba(0, 128, 128, 1)">291</span> <span style="color: rgba(0, 0, 0, 1)">// If not an arrow key or space or H was pressed then return
</span><span style="color: rgba(0, 128, 128, 1)">292</span> <span style="color: rgba(0, 0, 0, 1)">if (![" ", "H", "h", "E", "e"].includes(event.key)) return;
</span><span style="color: rgba(0, 128, 128, 1)">293</span>
<span style="color: rgba(0, 128, 128, 1)">294</span> <span style="color: rgba(0, 0, 0, 1)">// If an arrow key was pressed then first prevent default
</span><span style="color: rgba(0, 128, 128, 1)">295</span> <span style="color: rgba(0, 0, 0, 1)">event.preventDefault();
</span><span style="color: rgba(0, 128, 128, 1)">296</span>
<span style="color: rgba(0, 128, 128, 1)">297</span> <span style="color: rgba(0, 0, 0, 1)">// If space was pressed restart the game
</span><span style="color: rgba(0, 128, 128, 1)">298</span> <span style="color: rgba(0, 0, 0, 1)">if (event.key == " ") {
</span><span style="color: rgba(0, 128, 128, 1)">299</span> <span style="color: rgba(0, 0, 0, 1)"> resetGame();
</span><span style="color: rgba(0, 128, 128, 1)">300</span> <span style="color: rgba(0, 0, 0, 1)"> return;
</span><span style="color: rgba(0, 128, 128, 1)">301</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">302</span>
<span style="color: rgba(0, 128, 128, 1)">303</span> <span style="color: rgba(0, 0, 0, 1)">// Set Hard mode
</span><span style="color: rgba(0, 128, 128, 1)">304</span> <span style="color: rgba(0, 0, 0, 1)">if (event.key == "H" || event.key == "h") {
</span><span style="color: rgba(0, 128, 128, 1)">305</span> <span style="color: rgba(0, 0, 0, 1)"> hardMode = true;
</span><span style="color: rgba(0, 128, 128, 1)">306</span> <span style="color: rgba(0, 0, 0, 1)"> resetGame();
</span><span style="color: rgba(0, 128, 128, 1)">307</span> <span style="color: rgba(0, 0, 0, 1)"> return;
</span><span style="color: rgba(0, 128, 128, 1)">308</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">309</span>
<span style="color: rgba(0, 128, 128, 1)">310</span> <span style="color: rgba(0, 0, 0, 1)">// Set Easy mode
</span><span style="color: rgba(0, 128, 128, 1)">311</span> <span style="color: rgba(0, 0, 0, 1)">if (event.key == "E" || event.key == "e") {
</span><span style="color: rgba(0, 128, 128, 1)">312</span> <span style="color: rgba(0, 0, 0, 1)"> hardMode = false;
</span><span style="color: rgba(0, 128, 128, 1)">313</span> <span style="color: rgba(0, 0, 0, 1)"> resetGame();
</span><span style="color: rgba(0, 128, 128, 1)">314</span> <span style="color: rgba(0, 0, 0, 1)"> return;
</span><span style="color: rgba(0, 128, 128, 1)">315</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">316</span> <span style="color: rgba(0, 0, 0, 1)">});
</span><span style="color: rgba(0, 128, 128, 1)">317</span>
<span style="color: rgba(0, 128, 128, 1)">318</span> <span style="color: rgba(0, 0, 0, 1)">function resetGame() {
</span><span style="color: rgba(0, 128, 128, 1)">319</span> <span style="color: rgba(0, 0, 0, 1)">previousTimestamp = undefined;
</span><span style="color: rgba(0, 128, 128, 1)">320</span> <span style="color: rgba(0, 0, 0, 1)">gameInProgress = false;
</span><span style="color: rgba(0, 128, 128, 1)">321</span> <span style="color: rgba(0, 0, 0, 1)">mouseStartX = undefined;
</span><span style="color: rgba(0, 128, 128, 1)">322</span> <span style="color: rgba(0, 0, 0, 1)">mouseStartY = undefined;
</span><span style="color: rgba(0, 128, 128, 1)">323</span> <span style="color: rgba(0, 0, 0, 1)">accelerationX = undefined;
</span><span style="color: rgba(0, 128, 128, 1)">324</span> <span style="color: rgba(0, 0, 0, 1)">accelerationY = undefined;
</span><span style="color: rgba(0, 128, 128, 1)">325</span> <span style="color: rgba(0, 0, 0, 1)">frictionX = undefined;
</span><span style="color: rgba(0, 128, 128, 1)">326</span> <span style="color: rgba(0, 0, 0, 1)">frictionY = undefined;
</span><span style="color: rgba(0, 128, 128, 1)">327</span>
<span style="color: rgba(0, 128, 128, 1)">328</span> <span style="color: rgba(0, 0, 0, 1)">mazeElement.style.cssText = `
</span><span style="color: rgba(0, 128, 128, 1)">329</span> <span style="color: rgba(0, 0, 0, 1)"> transform: rotateY(0deg) rotateX(0deg)
</span><span style="color: rgba(0, 128, 128, 1)">330</span> <span style="color: rgba(0, 0, 0, 1)"> `;
</span><span style="color: rgba(0, 128, 128, 1)">331</span>
<span style="color: rgba(0, 128, 128, 1)">332</span> <span style="color: rgba(0, 0, 0, 1)">joystickHeadElement.style.cssText = `
</span><span style="color: rgba(0, 128, 128, 1)">333</span> <span style="color: rgba(0, 0, 0, 1)"> left: 0;
</span><span style="color: rgba(0, 128, 128, 1)">334</span> <span style="color: rgba(0, 0, 0, 1)"> top: 0;
</span><span style="color: rgba(0, 128, 128, 1)">335</span> <span style="color: rgba(0, 0, 0, 1)"> animation: glow;
</span><span style="color: rgba(0, 128, 128, 1)">336</span> <span style="color: rgba(0, 0, 0, 1)"> cursor: grab;
</span><span style="color: rgba(0, 128, 128, 1)">337</span> <span style="color: rgba(0, 0, 0, 1)"> `;
</span><span style="color: rgba(0, 128, 128, 1)">338</span>
<span style="color: rgba(0, 128, 128, 1)">339</span> <span style="color: rgba(0, 0, 0, 1)">if (hardMode) {
</span><span style="color: rgba(0, 128, 128, 1)">340</span> <span style="color: rgba(0, 0, 0, 1)"> noteElement.innerHTML = `Click the joystick to start!
</span><span style="color: rgba(0, 128, 128, 1)">341</span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>Hard mode, Avoid black holes. Back to easy mode? Press E<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">`;
</span><span style="color: rgba(0, 128, 128, 1)">342</span> <span style="color: rgba(0, 0, 0, 1)">} else {
</span><span style="color: rgba(0, 128, 128, 1)">343</span> <span style="color: rgba(0, 0, 0, 1)"> noteElement.innerHTML = `Click the joystick to start!
</span><span style="color: rgba(0, 128, 128, 1)">344</span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>Move every ball to the center. Ready for hard mode? Press H<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">`;
</span><span style="color: rgba(0, 128, 128, 1)">345</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">346</span> <span style="color: rgba(0, 0, 0, 1)">noteElement.style.opacity = 1;
</span><span style="color: rgba(0, 128, 128, 1)">347</span>
<span style="color: rgba(0, 128, 128, 1)">348</span> <span style="color: rgba(0, 0, 0, 1)">balls = [
</span><span style="color: rgba(0, 128, 128, 1)">349</span> <span style="color: rgba(0, 0, 0, 1)"> { column: 0, row: 0 },
</span><span style="color: rgba(0, 128, 128, 1)">350</span> <span style="color: rgba(0, 0, 0, 1)"> { column: 9, row: 0 },
</span><span style="color: rgba(0, 128, 128, 1)">351</span> <span style="color: rgba(0, 0, 0, 1)"> { column: 0, row: 8 },
</span><span style="color: rgba(0, 128, 128, 1)">352</span> <span style="color: rgba(0, 0, 0, 1)"> { column: 9, row: 8 }
</span><span style="color: rgba(0, 128, 128, 1)">353</span> <span style="color: rgba(0, 0, 0, 1)">].map((ball) => ({
</span><span style="color: rgba(0, 128, 128, 1)">354</span> <span style="color: rgba(0, 0, 0, 1)"> x: ball.column * (wallW + pathW) + (wallW / 2 + pathW / 2),
</span><span style="color: rgba(0, 128, 128, 1)">355</span> <span style="color: rgba(0, 0, 0, 1)"> y: ball.row * (wallW + pathW) + (wallW / 2 + pathW / 2),
</span><span style="color: rgba(0, 128, 128, 1)">356</span> <span style="color: rgba(0, 0, 0, 1)"> velocityX: 0,
</span><span style="color: rgba(0, 128, 128, 1)">357</span> <span style="color: rgba(0, 0, 0, 1)"> velocityY: 0
</span><span style="color: rgba(0, 128, 128, 1)">358</span> <span style="color: rgba(0, 0, 0, 1)">}));
</span><span style="color: rgba(0, 128, 128, 1)">359</span>
<span style="color: rgba(0, 128, 128, 1)">360</span> <span style="color: rgba(0, 0, 0, 1)">if (ballElements.length) {
</span><span style="color: rgba(0, 128, 128, 1)">361</span> <span style="color: rgba(0, 0, 0, 1)"> balls.forEach(({ x, y }, index) => {
</span><span style="color: rgba(0, 128, 128, 1)">362</span> <span style="color: rgba(0, 0, 0, 1)"> ballElements.style.cssText = `left: ${x}px; top: ${y}px; `;
</span><span style="color: rgba(0, 128, 128, 1)">363</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">364</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">365</span>
<span style="color: rgba(0, 128, 128, 1)">366</span> <span style="color: rgba(0, 0, 0, 1)">// Remove previous hole elements
</span><span style="color: rgba(0, 128, 128, 1)">367</span> <span style="color: rgba(0, 0, 0, 1)">holeElements.forEach((holeElement) => {
</span><span style="color: rgba(0, 128, 128, 1)">368</span> <span style="color: rgba(0, 0, 0, 1)"> mazeElement.removeChild(holeElement);
</span><span style="color: rgba(0, 128, 128, 1)">369</span> <span style="color: rgba(0, 0, 0, 1)">});
</span><span style="color: rgba(0, 128, 128, 1)">370</span> <span style="color: rgba(0, 0, 0, 1)">holeElements = [];
</span><span style="color: rgba(0, 128, 128, 1)">371</span>
<span style="color: rgba(0, 128, 128, 1)">372</span> <span style="color: rgba(0, 0, 0, 1)">// Reset hole elements if hard mode
</span><span style="color: rgba(0, 128, 128, 1)">373</span> <span style="color: rgba(0, 0, 0, 1)">if (hardMode) {
</span><span style="color: rgba(0, 128, 128, 1)">374</span> <span style="color: rgba(0, 0, 0, 1)"> holes.forEach(({ x, y }) => {
</span><span style="color: rgba(0, 128, 128, 1)">375</span> <span style="color: rgba(0, 0, 0, 1)"> const ball = document.createElement("div");
</span><span style="color: rgba(0, 128, 128, 1)">376</span> <span style="color: rgba(0, 0, 0, 1)"> ball.setAttribute("class", "black-hole");
</span><span style="color: rgba(0, 128, 128, 1)">377</span> <span style="color: rgba(0, 0, 0, 1)"> ball.style.cssText = `left: ${x}px; top: ${y}px; `;
</span><span style="color: rgba(0, 128, 128, 1)">378</span>
<span style="color: rgba(0, 128, 128, 1)">379</span> <span style="color: rgba(0, 0, 0, 1)"> mazeElement.appendChild(ball);
</span><span style="color: rgba(0, 128, 128, 1)">380</span> <span style="color: rgba(0, 0, 0, 1)"> holeElements.push(ball);
</span><span style="color: rgba(0, 128, 128, 1)">381</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">382</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">383</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">384</span>
<span style="color: rgba(0, 128, 128, 1)">385</span> <span style="color: rgba(0, 0, 0, 1)">function main(timestamp) {
</span><span style="color: rgba(0, 128, 128, 1)">386</span> <span style="color: rgba(0, 0, 0, 1)">// It is possible to reset the game mid-game. This case the look should stop
</span><span style="color: rgba(0, 128, 128, 1)">387</span> <span style="color: rgba(0, 0, 0, 1)">if (!gameInProgress) return;
</span><span style="color: rgba(0, 128, 128, 1)">388</span>
<span style="color: rgba(0, 128, 128, 1)">389</span> <span style="color: rgba(0, 0, 0, 1)">if (previousTimestamp === undefined) {
</span><span style="color: rgba(0, 128, 128, 1)">390</span> <span style="color: rgba(0, 0, 0, 1)"> previousTimestamp = timestamp;
</span><span style="color: rgba(0, 128, 128, 1)">391</span> <span style="color: rgba(0, 0, 0, 1)"> window.requestAnimationFrame(main);
</span><span style="color: rgba(0, 128, 128, 1)">392</span> <span style="color: rgba(0, 0, 0, 1)"> return;
</span><span style="color: rgba(0, 128, 128, 1)">393</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">394</span>
<span style="color: rgba(0, 128, 128, 1)">395</span> <span style="color: rgba(0, 0, 0, 1)">const maxVelocity = 1.5;
</span><span style="color: rgba(0, 128, 128, 1)">396</span>
<span style="color: rgba(0, 128, 128, 1)">397</span> <span style="color: rgba(0, 0, 0, 1)">// Time passed since last cycle divided by 16
</span><span style="color: rgba(0, 128, 128, 1)">398</span> <span style="color: rgba(0, 0, 0, 1)">// This function gets called every 16 ms on average so dividing by 16 will result in 1
</span><span style="color: rgba(0, 128, 128, 1)">399</span> <span style="color: rgba(0, 0, 0, 1)">const timeElapsed = (timestamp - previousTimestamp) / 16;
</span><span style="color: rgba(0, 128, 128, 1)">400</span>
<span style="color: rgba(0, 128, 128, 1)">401</span> <span style="color: rgba(0, 0, 0, 1)">try {
</span><span style="color: rgba(0, 128, 128, 1)">402</span> <span style="color: rgba(0, 0, 0, 1)"> // If mouse didn't move yet don't do anything
</span><span style="color: rgba(0, 128, 128, 1)">403</span> <span style="color: rgba(0, 0, 0, 1)"> if (accelerationX != undefined && accelerationY != undefined) {
</span><span style="color: rgba(0, 128, 128, 1)">404</span> <span style="color: rgba(0, 0, 0, 1)"> const velocityChangeX = accelerationX * timeElapsed;
</span><span style="color: rgba(0, 128, 128, 1)">405</span> <span style="color: rgba(0, 0, 0, 1)"> const velocityChangeY = accelerationY * timeElapsed;
</span><span style="color: rgba(0, 128, 128, 1)">406</span> <span style="color: rgba(0, 0, 0, 1)"> const frictionDeltaX = frictionX * timeElapsed;
</span><span style="color: rgba(0, 128, 128, 1)">407</span> <span style="color: rgba(0, 0, 0, 1)"> const frictionDeltaY = frictionY * timeElapsed;
</span><span style="color: rgba(0, 128, 128, 1)">408</span>
<span style="color: rgba(0, 128, 128, 1)">409</span> <span style="color: rgba(0, 0, 0, 1)"> balls.forEach((ball) => {
</span><span style="color: rgba(0, 128, 128, 1)">410</span> <span style="color: rgba(0, 0, 0, 1)"> if (velocityChangeX == 0) {
</span><span style="color: rgba(0, 128, 128, 1)">411</span> <span style="color: rgba(0, 0, 0, 1)"> // No rotation, the plane is flat
</span><span style="color: rgba(0, 128, 128, 1)">412</span> <span style="color: rgba(0, 0, 0, 1)"> // On flat surface friction can only slow down, but not reverse movement
</span><span style="color: rgba(0, 128, 128, 1)">413</span> <span style="color: rgba(0, 0, 0, 1)"> ball.velocityX = slow(ball.velocityX, frictionDeltaX);
</span><span style="color: rgba(0, 128, 128, 1)">414</span> <span style="color: rgba(0, 0, 0, 1)"> } else {
</span><span style="color: rgba(0, 128, 128, 1)">415</span> <span style="color: rgba(0, 0, 0, 1)"> ball.velocityX = ball.velocityX + velocityChangeX;
</span><span style="color: rgba(0, 128, 128, 1)">416</span> <span style="color: rgba(0, 0, 0, 1)"> ball.velocityX = Math.max(Math.min(ball.velocityX, 1.5), -1.5);
</span><span style="color: rgba(0, 128, 128, 1)">417</span> <span style="color: rgba(0, 0, 0, 1)"> ball.velocityX =
</span><span style="color: rgba(0, 128, 128, 1)">418</span> <span style="color: rgba(0, 0, 0, 1)"> ball.velocityX - Math.sign(velocityChangeX) * frictionDeltaX;
</span><span style="color: rgba(0, 128, 128, 1)">419</span> <span style="color: rgba(0, 0, 0, 1)"> ball.velocityX = Math.minmax(ball.velocityX, maxVelocity);
</span><span style="color: rgba(0, 128, 128, 1)">420</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">421</span>
<span style="color: rgba(0, 128, 128, 1)">422</span> <span style="color: rgba(0, 0, 0, 1)"> if (velocityChangeY == 0) {
</span><span style="color: rgba(0, 128, 128, 1)">423</span> <span style="color: rgba(0, 0, 0, 1)"> // No rotation, the plane is flat
</span><span style="color: rgba(0, 128, 128, 1)">424</span> <span style="color: rgba(0, 0, 0, 1)"> // On flat surface friction can only slow down, but not reverse movement
</span><span style="color: rgba(0, 128, 128, 1)">425</span> <span style="color: rgba(0, 0, 0, 1)"> ball.velocityY = slow(ball.velocityY, frictionDeltaY);
</span><span style="color: rgba(0, 128, 128, 1)">426</span> <span style="color: rgba(0, 0, 0, 1)"> } else {
</span><span style="color: rgba(0, 128, 128, 1)">427</span> <span style="color: rgba(0, 0, 0, 1)"> ball.velocityY = ball.velocityY + velocityChangeY;
</span><span style="color: rgba(0, 128, 128, 1)">428</span> <span style="color: rgba(0, 0, 0, 1)"> ball.velocityY =
</span><span style="color: rgba(0, 128, 128, 1)">429</span> <span style="color: rgba(0, 0, 0, 1)"> ball.velocityY - Math.sign(velocityChangeY) * frictionDeltaY;
</span><span style="color: rgba(0, 128, 128, 1)">430</span> <span style="color: rgba(0, 0, 0, 1)"> ball.velocityY = Math.minmax(ball.velocityY, maxVelocity);
</span><span style="color: rgba(0, 128, 128, 1)">431</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">432</span>
<span style="color: rgba(0, 128, 128, 1)">433</span> <span style="color: rgba(0, 0, 0, 1)"> // Preliminary next ball position, only becomes true if no hit occurs
</span><span style="color: rgba(0, 128, 128, 1)">434</span> <span style="color: rgba(0, 0, 0, 1)"> // Used only for hit testing, does not mean that the ball will reach this position
</span><span style="color: rgba(0, 128, 128, 1)">435</span> <span style="color: rgba(0, 0, 0, 1)"> ball.nextX = ball.x + ball.velocityX;
</span><span style="color: rgba(0, 128, 128, 1)">436</span> <span style="color: rgba(0, 0, 0, 1)"> ball.nextY = ball.y + ball.velocityY;
</span><span style="color: rgba(0, 128, 128, 1)">437</span>
<span style="color: rgba(0, 128, 128, 1)">438</span> <span style="color: rgba(0, 0, 0, 1)"> if (debugMode) console.log("tick", ball);
</span><span style="color: rgba(0, 128, 128, 1)">439</span>
<span style="color: rgba(0, 128, 128, 1)">440</span> <span style="color: rgba(0, 0, 0, 1)"> walls.forEach((wall, wi) => {
</span><span style="color: rgba(0, 128, 128, 1)">441</span> <span style="color: rgba(0, 0, 0, 1)"> if (wall.horizontal) {
</span><span style="color: rgba(0, 128, 128, 1)">442</span> <span style="color: rgba(0, 0, 0, 1)"> // Horizontal wall
</span><span style="color: rgba(0, 128, 128, 1)">443</span>
<span style="color: rgba(0, 128, 128, 1)">444</span> <span style="color: rgba(0, 0, 0, 1)"> if (
</span><span style="color: rgba(0, 128, 128, 1)">445</span> <span style="color: rgba(0, 0, 0, 1)"> ball.nextY + ballSize / 2 >= wall.y - wallW / 2 &&
</span><span style="color: rgba(0, 128, 128, 1)">446</span> ball.nextY - ballSize / 2 <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">= wall</span><span style="color: rgba(255, 0, 0, 1)">.y + wallW / 2
</span><span style="color: rgba(0, 128, 128, 1)">447</span> <span style="color: rgba(255, 0, 0, 1)"> ) {
</span><span style="color: rgba(0, 128, 128, 1)">448</span> <span style="color: rgba(255, 0, 0, 1)"> // Ball got within the strip of the wall
</span><span style="color: rgba(0, 128, 128, 1)">449</span> <span style="color: rgba(255, 0, 0, 1)"> // (not necessarily hit it, could be before or after)
</span><span style="color: rgba(0, 128, 128, 1)">450</span>
<span style="color: rgba(0, 128, 128, 1)">451</span> <span style="color: rgba(255, 0, 0, 1)"> const wallStart </span><span style="color: rgba(0, 0, 255, 1)">= {
</span><span style="color: rgba(0, 128, 128, 1)">452</span> <span style="color: rgba(255, 0, 0, 1)">x: wall.x,
</span><span style="color: rgba(0, 128, 128, 1)">453</span> <span style="color: rgba(255, 0, 0, 1)"> y: wall.y
</span><span style="color: rgba(0, 128, 128, 1)">454</span> <span style="color: rgba(255, 0, 0, 1)"> };
</span><span style="color: rgba(0, 128, 128, 1)">455</span> <span style="color: rgba(255, 0, 0, 1)"> const wallEnd </span><span style="color: rgba(0, 0, 255, 1)">= {
</span><span style="color: rgba(0, 128, 128, 1)">456</span> <span style="color: rgba(255, 0, 0, 1)">x: wall.x + wall.length,
</span><span style="color: rgba(0, 128, 128, 1)">457</span> <span style="color: rgba(255, 0, 0, 1)"> y: wall.y
</span><span style="color: rgba(0, 128, 128, 1)">458</span> <span style="color: rgba(255, 0, 0, 1)"> };
</span><span style="color: rgba(0, 128, 128, 1)">459</span>
<span style="color: rgba(0, 128, 128, 1)">460</span> <span style="color: rgba(255, 0, 0, 1)"> if (
</span><span style="color: rgba(0, 128, 128, 1)">461</span> <span style="color: rgba(255, 0, 0, 1)"> ball.nextX + ballSize / 2 </span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">= wallStart.x - wallW / 2 &&
</span><span style="color: rgba(0, 128, 128, 1)">462</span> ball.nextX <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)"> wallStart</span><span style="color: rgba(255, 0, 0, 1)">.x
</span><span style="color: rgba(0, 128, 128, 1)">463</span> <span style="color: rgba(255, 0, 0, 1)"> ) {
</span><span style="color: rgba(0, 128, 128, 1)">464</span> <span style="color: rgba(255, 0, 0, 1)"> // Ball might hit the left cap of a horizontal wall
</span><span style="color: rgba(0, 128, 128, 1)">465</span> <span style="color: rgba(255, 0, 0, 1)"> const distance </span><span style="color: rgba(0, 0, 255, 1)">= distance2D(wallStart, </span><span style="color: rgba(255, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">466</span> <span style="color: rgba(255, 0, 0, 1)"> x: ball.nextX,
</span><span style="color: rgba(0, 128, 128, 1)">467</span> <span style="color: rgba(255, 0, 0, 1)"> y: ball.nextY
</span><span style="color: rgba(0, 128, 128, 1)">468</span> <span style="color: rgba(255, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">469</span> <span style="color: rgba(255, 0, 0, 1)"> if (distance < ballSize / 2 + wallW / 2) {
</span><span style="color: rgba(0, 128, 128, 1)">470</span> <span style="color: rgba(255, 0, 0, 1)"> if (debugMode && wi </span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> 4)
</span><span style="color: rgba(0, 128, 128, 1)">471</span> <span style="color: rgba(0, 0, 0, 1)"> console.warn("too close h head", distance, ball);
</span><span style="color: rgba(0, 128, 128, 1)">472</span>
<span style="color: rgba(0, 128, 128, 1)">473</span> <span style="color: rgba(0, 0, 0, 1)"> // Ball hits the left cap of a horizontal wall
</span><span style="color: rgba(0, 128, 128, 1)">474</span> <span style="color: rgba(0, 0, 0, 1)"> const closest = closestItCanBe(wallStart, {
</span><span style="color: rgba(0, 128, 128, 1)">475</span> <span style="color: rgba(0, 0, 0, 1)"> x: ball.nextX,
</span><span style="color: rgba(0, 128, 128, 1)">476</span> <span style="color: rgba(0, 0, 0, 1)"> y: ball.nextY
</span><span style="color: rgba(0, 128, 128, 1)">477</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">478</span> <span style="color: rgba(0, 0, 0, 1)"> const rolled = rollAroundCap(wallStart, {
</span><span style="color: rgba(0, 128, 128, 1)">479</span> <span style="color: rgba(0, 0, 0, 1)"> x: closest.x,
</span><span style="color: rgba(0, 128, 128, 1)">480</span> <span style="color: rgba(0, 0, 0, 1)"> y: closest.y,
</span><span style="color: rgba(0, 128, 128, 1)">481</span> <span style="color: rgba(0, 0, 0, 1)"> velocityX: ball.velocityX,
</span><span style="color: rgba(0, 128, 128, 1)">482</span> <span style="color: rgba(0, 0, 0, 1)"> velocityY: ball.velocityY
</span><span style="color: rgba(0, 128, 128, 1)">483</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">484</span>
<span style="color: rgba(0, 128, 128, 1)">485</span> <span style="color: rgba(0, 0, 0, 1)"> Object.assign(ball, rolled);
</span><span style="color: rgba(0, 128, 128, 1)">486</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">487</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">488</span>
<span style="color: rgba(0, 128, 128, 1)">489</span> <span style="color: rgba(0, 0, 0, 1)"> if (
</span><span style="color: rgba(0, 128, 128, 1)">490</span> ball.nextX - ballSize / 2 <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">= wallEnd</span><span style="color: rgba(255, 0, 0, 1)">.x + wallW / 2 &&
</span><span style="color: rgba(0, 128, 128, 1)">491</span> <span style="color: rgba(255, 0, 0, 1)"> ball.nextX </span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> wallEnd.x
</span><span style="color: rgba(0, 128, 128, 1)">492</span> <span style="color: rgba(0, 0, 0, 1)"> ) {
</span><span style="color: rgba(0, 128, 128, 1)">493</span> <span style="color: rgba(0, 0, 0, 1)"> // Ball might hit the right cap of a horizontal wall
</span><span style="color: rgba(0, 128, 128, 1)">494</span> <span style="color: rgba(0, 0, 0, 1)"> const distance = distance2D(wallEnd, {
</span><span style="color: rgba(0, 128, 128, 1)">495</span> <span style="color: rgba(0, 0, 0, 1)"> x: ball.nextX,
</span><span style="color: rgba(0, 128, 128, 1)">496</span> <span style="color: rgba(0, 0, 0, 1)"> y: ball.nextY
</span><span style="color: rgba(0, 128, 128, 1)">497</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">498</span> if (distance <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)"> ballSize </span><span style="color: rgba(255, 0, 0, 1)">/ 2 + wallW / 2) {
</span><span style="color: rgba(0, 128, 128, 1)">499</span> <span style="color: rgba(255, 0, 0, 1)"> if (debugMode && wi </span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> 4)
</span><span style="color: rgba(0, 128, 128, 1)">500</span> <span style="color: rgba(0, 0, 0, 1)"> console.warn("too close h tail", distance, ball);
</span><span style="color: rgba(0, 128, 128, 1)">501</span>
<span style="color: rgba(0, 128, 128, 1)">502</span> <span style="color: rgba(0, 0, 0, 1)"> // Ball hits the right cap of a horizontal wall
</span><span style="color: rgba(0, 128, 128, 1)">503</span> <span style="color: rgba(0, 0, 0, 1)"> const closest = closestItCanBe(wallEnd, {
</span><span style="color: rgba(0, 128, 128, 1)">504</span> <span style="color: rgba(0, 0, 0, 1)"> x: ball.nextX,
</span><span style="color: rgba(0, 128, 128, 1)">505</span> <span style="color: rgba(0, 0, 0, 1)"> y: ball.nextY
</span><span style="color: rgba(0, 128, 128, 1)">506</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">507</span> <span style="color: rgba(0, 0, 0, 1)"> const rolled = rollAroundCap(wallEnd, {
</span><span style="color: rgba(0, 128, 128, 1)">508</span> <span style="color: rgba(0, 0, 0, 1)"> x: closest.x,
</span><span style="color: rgba(0, 128, 128, 1)">509</span> <span style="color: rgba(0, 0, 0, 1)"> y: closest.y,
</span><span style="color: rgba(0, 128, 128, 1)">510</span> <span style="color: rgba(0, 0, 0, 1)"> velocityX: ball.velocityX,
</span><span style="color: rgba(0, 128, 128, 1)">511</span> <span style="color: rgba(0, 0, 0, 1)"> velocityY: ball.velocityY
</span><span style="color: rgba(0, 128, 128, 1)">512</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">513</span>
<span style="color: rgba(0, 128, 128, 1)">514</span> <span style="color: rgba(0, 0, 0, 1)"> Object.assign(ball, rolled);
</span><span style="color: rgba(0, 128, 128, 1)">515</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">516</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">517</span>
<span style="color: rgba(0, 128, 128, 1)">518</span> if (ball.nextX >= wallStart.x && ball.nextX <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">= wallEnd</span><span style="color: rgba(255, 0, 0, 1)">.x) {
</span><span style="color: rgba(0, 128, 128, 1)">519</span> <span style="color: rgba(255, 0, 0, 1)"> // The ball got inside the main body of the wall
</span><span style="color: rgba(0, 128, 128, 1)">520</span> <span style="color: rgba(255, 0, 0, 1)"> if (ball.nextY < wall.y) {
</span><span style="color: rgba(0, 128, 128, 1)">521</span> <span style="color: rgba(255, 0, 0, 1)"> // Hit horizontal wall from top
</span><span style="color: rgba(0, 128, 128, 1)">522</span> <span style="color: rgba(255, 0, 0, 1)"> ball.nextY </span><span style="color: rgba(0, 0, 255, 1)">= wall.y </span><span style="color: rgba(255, 0, 0, 1)">- wallW / 2 - ballSize / 2;
</span><span style="color: rgba(0, 128, 128, 1)">523</span> <span style="color: rgba(255, 0, 0, 1)"> } else {
</span><span style="color: rgba(0, 128, 128, 1)">524</span> <span style="color: rgba(255, 0, 0, 1)"> // Hit horizontal wall from bottom
</span><span style="color: rgba(0, 128, 128, 1)">525</span> <span style="color: rgba(255, 0, 0, 1)"> ball.nextY </span><span style="color: rgba(0, 0, 255, 1)">= wall.y </span><span style="color: rgba(255, 0, 0, 1)">+ wallW / 2 + ballSize / 2;
</span><span style="color: rgba(0, 128, 128, 1)">526</span> <span style="color: rgba(255, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">527</span> <span style="color: rgba(255, 0, 0, 1)"> ball.y </span><span style="color: rgba(0, 0, 255, 1)">= ball.nextY;
</span><span style="color: rgba(0, 128, 128, 1)">528</span> <span style="color: rgba(255, 0, 0, 1)">ball.velocityY </span><span style="color: rgba(0, 0, 255, 1)">= -ball.velocityY </span><span style="color: rgba(255, 0, 0, 1)">/ 3;
</span><span style="color: rgba(0, 128, 128, 1)">529</span>
<span style="color: rgba(0, 128, 128, 1)">530</span> <span style="color: rgba(255, 0, 0, 1)"> if (debugMode && wi </span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> 4)
</span><span style="color: rgba(0, 128, 128, 1)">531</span> <span style="color: rgba(0, 0, 0, 1)"> console.error("crossing h line, HIT", ball);
</span><span style="color: rgba(0, 128, 128, 1)">532</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">533</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">534</span> <span style="color: rgba(0, 0, 0, 1)"> } else {
</span><span style="color: rgba(0, 128, 128, 1)">535</span> <span style="color: rgba(0, 0, 0, 1)"> // Vertical wall
</span><span style="color: rgba(0, 128, 128, 1)">536</span>
<span style="color: rgba(0, 128, 128, 1)">537</span> <span style="color: rgba(0, 0, 0, 1)"> if (
</span><span style="color: rgba(0, 128, 128, 1)">538</span> <span style="color: rgba(0, 0, 0, 1)"> ball.nextX + ballSize / 2 >= wall.x - wallW / 2 &&
</span><span style="color: rgba(0, 128, 128, 1)">539</span> ball.nextX - ballSize / 2 <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">= wall</span><span style="color: rgba(255, 0, 0, 1)">.x + wallW / 2
</span><span style="color: rgba(0, 128, 128, 1)">540</span> <span style="color: rgba(255, 0, 0, 1)"> ) {
</span><span style="color: rgba(0, 128, 128, 1)">541</span> <span style="color: rgba(255, 0, 0, 1)"> // Ball got within the strip of the wall
</span><span style="color: rgba(0, 128, 128, 1)">542</span> <span style="color: rgba(255, 0, 0, 1)"> // (not necessarily hit it, could be before or after)
</span><span style="color: rgba(0, 128, 128, 1)">543</span>
<span style="color: rgba(0, 128, 128, 1)">544</span> <span style="color: rgba(255, 0, 0, 1)"> const wallStart </span><span style="color: rgba(0, 0, 255, 1)">= {
</span><span style="color: rgba(0, 128, 128, 1)">545</span> <span style="color: rgba(255, 0, 0, 1)">x: wall.x,
</span><span style="color: rgba(0, 128, 128, 1)">546</span> <span style="color: rgba(255, 0, 0, 1)"> y: wall.y
</span><span style="color: rgba(0, 128, 128, 1)">547</span> <span style="color: rgba(255, 0, 0, 1)"> };
</span><span style="color: rgba(0, 128, 128, 1)">548</span> <span style="color: rgba(255, 0, 0, 1)"> const wallEnd </span><span style="color: rgba(0, 0, 255, 1)">= {
</span><span style="color: rgba(0, 128, 128, 1)">549</span> <span style="color: rgba(255, 0, 0, 1)">x: wall.x,
</span><span style="color: rgba(0, 128, 128, 1)">550</span> <span style="color: rgba(255, 0, 0, 1)"> y: wall.y + wall.length
</span><span style="color: rgba(0, 128, 128, 1)">551</span> <span style="color: rgba(255, 0, 0, 1)"> };
</span><span style="color: rgba(0, 128, 128, 1)">552</span>
<span style="color: rgba(0, 128, 128, 1)">553</span> <span style="color: rgba(255, 0, 0, 1)"> if (
</span><span style="color: rgba(0, 128, 128, 1)">554</span> <span style="color: rgba(255, 0, 0, 1)"> ball.nextY + ballSize / 2 </span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">= wallStart.y - wallW / 2 &&
</span><span style="color: rgba(0, 128, 128, 1)">555</span> ball.nextY <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)"> wallStart</span><span style="color: rgba(255, 0, 0, 1)">.y
</span><span style="color: rgba(0, 128, 128, 1)">556</span> <span style="color: rgba(255, 0, 0, 1)"> ) {
</span><span style="color: rgba(0, 128, 128, 1)">557</span> <span style="color: rgba(255, 0, 0, 1)"> // Ball might hit the top cap of a horizontal wall
</span><span style="color: rgba(0, 128, 128, 1)">558</span> <span style="color: rgba(255, 0, 0, 1)"> const distance </span><span style="color: rgba(0, 0, 255, 1)">= distance2D(wallStart, </span><span style="color: rgba(255, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">559</span> <span style="color: rgba(255, 0, 0, 1)"> x: ball.nextX,
</span><span style="color: rgba(0, 128, 128, 1)">560</span> <span style="color: rgba(255, 0, 0, 1)"> y: ball.nextY
</span><span style="color: rgba(0, 128, 128, 1)">561</span> <span style="color: rgba(255, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">562</span> <span style="color: rgba(255, 0, 0, 1)"> if (distance < ballSize / 2 + wallW / 2) {
</span><span style="color: rgba(0, 128, 128, 1)">563</span> <span style="color: rgba(255, 0, 0, 1)"> if (debugMode && wi </span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> 4)
</span><span style="color: rgba(0, 128, 128, 1)">564</span> <span style="color: rgba(0, 0, 0, 1)"> console.warn("too close v head", distance, ball);
</span><span style="color: rgba(0, 128, 128, 1)">565</span>
<span style="color: rgba(0, 128, 128, 1)">566</span> <span style="color: rgba(0, 0, 0, 1)"> // Ball hits the left cap of a horizontal wall
</span><span style="color: rgba(0, 128, 128, 1)">567</span> <span style="color: rgba(0, 0, 0, 1)"> const closest = closestItCanBe(wallStart, {
</span><span style="color: rgba(0, 128, 128, 1)">568</span> <span style="color: rgba(0, 0, 0, 1)"> x: ball.nextX,
</span><span style="color: rgba(0, 128, 128, 1)">569</span> <span style="color: rgba(0, 0, 0, 1)"> y: ball.nextY
</span><span style="color: rgba(0, 128, 128, 1)">570</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">571</span> <span style="color: rgba(0, 0, 0, 1)"> const rolled = rollAroundCap(wallStart, {
</span><span style="color: rgba(0, 128, 128, 1)">572</span> <span style="color: rgba(0, 0, 0, 1)"> x: closest.x,
</span><span style="color: rgba(0, 128, 128, 1)">573</span> <span style="color: rgba(0, 0, 0, 1)"> y: closest.y,
</span><span style="color: rgba(0, 128, 128, 1)">574</span> <span style="color: rgba(0, 0, 0, 1)"> velocityX: ball.velocityX,
</span><span style="color: rgba(0, 128, 128, 1)">575</span> <span style="color: rgba(0, 0, 0, 1)"> velocityY: ball.velocityY
</span><span style="color: rgba(0, 128, 128, 1)">576</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">577</span>
<span style="color: rgba(0, 128, 128, 1)">578</span> <span style="color: rgba(0, 0, 0, 1)"> Object.assign(ball, rolled);
</span><span style="color: rgba(0, 128, 128, 1)">579</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">580</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">581</span>
<span style="color: rgba(0, 128, 128, 1)">582</span> <span style="color: rgba(0, 0, 0, 1)"> if (
</span><span style="color: rgba(0, 128, 128, 1)">583</span> ball.nextY - ballSize / 2 <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">= wallEnd</span><span style="color: rgba(255, 0, 0, 1)">.y + wallW / 2 &&
</span><span style="color: rgba(0, 128, 128, 1)">584</span> <span style="color: rgba(255, 0, 0, 1)"> ball.nextY </span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> wallEnd.y
</span><span style="color: rgba(0, 128, 128, 1)">585</span> <span style="color: rgba(0, 0, 0, 1)"> ) {
</span><span style="color: rgba(0, 128, 128, 1)">586</span> <span style="color: rgba(0, 0, 0, 1)"> // Ball might hit the bottom cap of a horizontal wall
</span><span style="color: rgba(0, 128, 128, 1)">587</span> <span style="color: rgba(0, 0, 0, 1)"> const distance = distance2D(wallEnd, {
</span><span style="color: rgba(0, 128, 128, 1)">588</span> <span style="color: rgba(0, 0, 0, 1)"> x: ball.nextX,
</span><span style="color: rgba(0, 128, 128, 1)">589</span> <span style="color: rgba(0, 0, 0, 1)"> y: ball.nextY
</span><span style="color: rgba(0, 128, 128, 1)">590</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">591</span> if (distance <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)"> ballSize </span><span style="color: rgba(255, 0, 0, 1)">/ 2 + wallW / 2) {
</span><span style="color: rgba(0, 128, 128, 1)">592</span> <span style="color: rgba(255, 0, 0, 1)"> if (debugMode && wi </span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> 4)
</span><span style="color: rgba(0, 128, 128, 1)">593</span> <span style="color: rgba(0, 0, 0, 1)"> console.warn("too close v tail", distance, ball);
</span><span style="color: rgba(0, 128, 128, 1)">594</span>
<span style="color: rgba(0, 128, 128, 1)">595</span> <span style="color: rgba(0, 0, 0, 1)"> // Ball hits the right cap of a horizontal wall
</span><span style="color: rgba(0, 128, 128, 1)">596</span> <span style="color: rgba(0, 0, 0, 1)"> const closest = closestItCanBe(wallEnd, {
</span><span style="color: rgba(0, 128, 128, 1)">597</span> <span style="color: rgba(0, 0, 0, 1)"> x: ball.nextX,
</span><span style="color: rgba(0, 128, 128, 1)">598</span> <span style="color: rgba(0, 0, 0, 1)"> y: ball.nextY
</span><span style="color: rgba(0, 128, 128, 1)">599</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">600</span> <span style="color: rgba(0, 0, 0, 1)"> const rolled = rollAroundCap(wallEnd, {
</span><span style="color: rgba(0, 128, 128, 1)">601</span> <span style="color: rgba(0, 0, 0, 1)"> x: closest.x,
</span><span style="color: rgba(0, 128, 128, 1)">602</span> <span style="color: rgba(0, 0, 0, 1)"> y: closest.y,
</span><span style="color: rgba(0, 128, 128, 1)">603</span> <span style="color: rgba(0, 0, 0, 1)"> velocityX: ball.velocityX,
</span><span style="color: rgba(0, 128, 128, 1)">604</span> <span style="color: rgba(0, 0, 0, 1)"> velocityY: ball.velocityY
</span><span style="color: rgba(0, 128, 128, 1)">605</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">606</span>
<span style="color: rgba(0, 128, 128, 1)">607</span> <span style="color: rgba(0, 0, 0, 1)"> Object.assign(ball, rolled);
</span><span style="color: rgba(0, 128, 128, 1)">608</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">609</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">610</span>
<span style="color: rgba(0, 128, 128, 1)">611</span> if (ball.nextY >= wallStart.y && ball.nextY <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">= wallEnd</span><span style="color: rgba(255, 0, 0, 1)">.y) {
</span><span style="color: rgba(0, 128, 128, 1)">612</span> <span style="color: rgba(255, 0, 0, 1)"> // The ball got inside the main body of the wall
</span><span style="color: rgba(0, 128, 128, 1)">613</span> <span style="color: rgba(255, 0, 0, 1)"> if (ball.nextX < wall.x) {
</span><span style="color: rgba(0, 128, 128, 1)">614</span> <span style="color: rgba(255, 0, 0, 1)"> // Hit vertical wall from left
</span><span style="color: rgba(0, 128, 128, 1)">615</span> <span style="color: rgba(255, 0, 0, 1)"> ball.nextX </span><span style="color: rgba(0, 0, 255, 1)">= wall.x </span><span style="color: rgba(255, 0, 0, 1)">- wallW / 2 - ballSize / 2;
</span><span style="color: rgba(0, 128, 128, 1)">616</span> <span style="color: rgba(255, 0, 0, 1)"> } else {
</span><span style="color: rgba(0, 128, 128, 1)">617</span> <span style="color: rgba(255, 0, 0, 1)"> // Hit vertical wall from right
</span><span style="color: rgba(0, 128, 128, 1)">618</span> <span style="color: rgba(255, 0, 0, 1)"> ball.nextX </span><span style="color: rgba(0, 0, 255, 1)">= wall.x </span><span style="color: rgba(255, 0, 0, 1)">+ wallW / 2 + ballSize / 2;
</span><span style="color: rgba(0, 128, 128, 1)">619</span> <span style="color: rgba(255, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">620</span> <span style="color: rgba(255, 0, 0, 1)"> ball.x </span><span style="color: rgba(0, 0, 255, 1)">= ball.nextX;
</span><span style="color: rgba(0, 128, 128, 1)">621</span> <span style="color: rgba(255, 0, 0, 1)">ball.velocityX </span><span style="color: rgba(0, 0, 255, 1)">= -ball.velocityX </span><span style="color: rgba(255, 0, 0, 1)">/ 3;
</span><span style="color: rgba(0, 128, 128, 1)">622</span>
<span style="color: rgba(0, 128, 128, 1)">623</span> <span style="color: rgba(255, 0, 0, 1)"> if (debugMode && wi </span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> 4)
</span><span style="color: rgba(0, 128, 128, 1)">624</span> <span style="color: rgba(0, 0, 0, 1)"> console.error("crossing v line, HIT", ball);
</span><span style="color: rgba(0, 128, 128, 1)">625</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">626</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">627</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">628</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">629</span>
<span style="color: rgba(0, 128, 128, 1)">630</span> <span style="color: rgba(0, 0, 0, 1)"> // Detect is a ball fell into a hole
</span><span style="color: rgba(0, 128, 128, 1)">631</span> <span style="color: rgba(0, 0, 0, 1)"> if (hardMode) {
</span><span style="color: rgba(0, 128, 128, 1)">632</span> <span style="color: rgba(0, 0, 0, 1)"> holes.forEach((hole, hi) => {
</span><span style="color: rgba(0, 128, 128, 1)">633</span> <span style="color: rgba(0, 0, 0, 1)"> const distance = distance2D(hole, {
</span><span style="color: rgba(0, 128, 128, 1)">634</span> <span style="color: rgba(0, 0, 0, 1)"> x: ball.nextX,
</span><span style="color: rgba(0, 128, 128, 1)">635</span> <span style="color: rgba(0, 0, 0, 1)"> y: ball.nextY
</span><span style="color: rgba(0, 128, 128, 1)">636</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">637</span>
<span style="color: rgba(0, 128, 128, 1)">638</span> if (distance <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">= holeSize </span><span style="color: rgba(255, 0, 0, 1)">/ 2) {
</span><span style="color: rgba(0, 128, 128, 1)">639</span> <span style="color: rgba(255, 0, 0, 1)"> // The ball fell into a hole
</span><span style="color: rgba(0, 128, 128, 1)">640</span> <span style="color: rgba(255, 0, 0, 1)"> holeElements.style.backgroundColor </span><span style="color: rgba(0, 0, 255, 1)">= "red"</span><span style="color: rgba(255, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">641</span> <span style="color: rgba(255, 0, 0, 1)"> throw Error("The ball fell into a hole");
</span><span style="color: rgba(0, 128, 128, 1)">642</span> <span style="color: rgba(255, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">643</span> <span style="color: rgba(255, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">644</span> <span style="color: rgba(255, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">645</span>
<span style="color: rgba(0, 128, 128, 1)">646</span> <span style="color: rgba(255, 0, 0, 1)"> // Adjust ball metadata
</span><span style="color: rgba(0, 128, 128, 1)">647</span> <span style="color: rgba(255, 0, 0, 1)"> ball.x </span><span style="color: rgba(0, 0, 255, 1)">= ball.x </span><span style="color: rgba(255, 0, 0, 1)">+ ball.velocityX;
</span><span style="color: rgba(0, 128, 128, 1)">648</span> <span style="color: rgba(255, 0, 0, 1)"> ball.y </span><span style="color: rgba(0, 0, 255, 1)">= ball.y </span><span style="color: rgba(255, 0, 0, 1)">+ ball.velocityY;
</span><span style="color: rgba(0, 128, 128, 1)">649</span> <span style="color: rgba(255, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">650</span>
<span style="color: rgba(0, 128, 128, 1)">651</span> <span style="color: rgba(255, 0, 0, 1)"> // Move balls to their new position on the UI
</span><span style="color: rgba(0, 128, 128, 1)">652</span> <span style="color: rgba(255, 0, 0, 1)"> balls.forEach(({ x, y }, index) </span><span style="color: rgba(0, 0, 255, 1)">=</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">653</span> <span style="color: rgba(0, 0, 0, 1)"> ballElements.style.cssText = `left: ${x}px; top: ${y}px; `;
</span><span style="color: rgba(0, 128, 128, 1)">654</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">655</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">656</span>
<span style="color: rgba(0, 128, 128, 1)">657</span> <span style="color: rgba(0, 0, 0, 1)"> // Win detection
</span><span style="color: rgba(0, 128, 128, 1)">658</span> <span style="color: rgba(0, 0, 0, 1)"> if (
</span><span style="color: rgba(0, 128, 128, 1)">659</span> <span style="color: rgba(0, 0, 0, 1)"> balls.every(
</span><span style="color: rgba(0, 128, 128, 1)">660</span> (ball) => distance2D(ball, { x: 350 / 2, y: 315 / 2 }) <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)"> 65 </span><span style="color: rgba(255, 0, 0, 1)">/ 2
</span><span style="color: rgba(0, 128, 128, 1)">661</span> <span style="color: rgba(255, 0, 0, 1)"> )
</span><span style="color: rgba(0, 128, 128, 1)">662</span> <span style="color: rgba(255, 0, 0, 1)"> ) {
</span><span style="color: rgba(0, 128, 128, 1)">663</span> <span style="color: rgba(255, 0, 0, 1)"> noteElement.innerHTML </span><span style="color: rgba(0, 0, 255, 1)">= `Congrats, </span><span style="color: rgba(255, 0, 0, 1)">you did it!
</span><span style="color: rgba(0, 128, 128, 1)">664</span> <span style="color: rgba(255, 0, 0, 1)"> ${!hardMode && "<p</span><span style="color: rgba(0, 0, 255, 1)">></span>Press H for hard mode<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">"}
</span><span style="color: rgba(0, 128, 128, 1)">665</span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 128, 1)">666</span> <span style="color: rgba(0, 0, 0, 1)"> Follow me
</span><span style="color: rgba(0, 128, 128, 1)">667</span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">a </span><span style="color: rgba(255, 0, 0, 1)">href</span><span style="color: rgba(0, 0, 255, 1)">="https://www.17sucai.com"</span><span style="color: rgba(255, 0, 0, 1)"> , target</span><span style="color: rgba(0, 0, 255, 1)">="_blank"</span>
<span style="color: rgba(0, 128, 128, 1)">668</span> <span style="color: rgba(0, 0, 255, 1)">></span>@HunorBorbely<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">a
</span><span style="color: rgba(0, 128, 128, 1)">669</span> <span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 128, 1)">670</span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">`;
</span><span style="color: rgba(0, 128, 128, 1)">671</span> <span style="color: rgba(0, 0, 0, 1)"> noteElement.style.opacity = 1;
</span><span style="color: rgba(0, 128, 128, 1)">672</span> <span style="color: rgba(0, 0, 0, 1)"> gameInProgress = false;
</span><span style="color: rgba(0, 128, 128, 1)">673</span> <span style="color: rgba(0, 0, 0, 1)"> } else {
</span><span style="color: rgba(0, 128, 128, 1)">674</span> <span style="color: rgba(0, 0, 0, 1)"> previousTimestamp = timestamp;
</span><span style="color: rgba(0, 128, 128, 1)">675</span> <span style="color: rgba(0, 0, 0, 1)"> window.requestAnimationFrame(main);
</span><span style="color: rgba(0, 128, 128, 1)">676</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">677</span> <span style="color: rgba(0, 0, 0, 1)">} catch (error) {
</span><span style="color: rgba(0, 128, 128, 1)">678</span> <span style="color: rgba(0, 0, 0, 1)"> if (error.message == "The ball fell into a hole") {
</span><span style="color: rgba(0, 128, 128, 1)">679</span> <span style="color: rgba(0, 0, 0, 1)"> noteElement.innerHTML = `A ball fell into a black hole! Press space to reset the game.
</span><span style="color: rgba(0, 128, 128, 1)">680</span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 128, 1)">681</span> <span style="color: rgba(0, 0, 0, 1)"> Back to easy? Press E
</span><span style="color: rgba(0, 128, 128, 1)">682</span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">`;
</span><span style="color: rgba(0, 128, 128, 1)">683</span> <span style="color: rgba(0, 0, 0, 1)"> noteElement.style.opacity = 1;
</span><span style="color: rgba(0, 128, 128, 1)">684</span> <span style="color: rgba(0, 0, 0, 1)"> gameInProgress = false;
</span><span style="color: rgba(0, 128, 128, 1)">685</span> <span style="color: rgba(0, 0, 0, 1)"> } else throw error;
</span><span style="color: rgba(0, 128, 128, 1)">686</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">687</span> }</pre>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/ypha/p/14301338.html
頁:
[1]