skip to content
Frictional Game Wiki
User Tools
Register
Log In
Site Tools
Search
Tools
Show page
Old revisions
Backlinks
Recent Changes
Media Manager
Sitemap
Log In
Register
>
Recent Changes
Media Manager
Sitemap
Trace:
hpl2:tutorials:script:running_up_walls
<h1>Running up walls</h1> <div class="level1"> <p> This code will simulate the player running up walls.<br/> Since code ends up being too large and thus confusing, i'm dividing it in parts. </p> <p> 1. How it works </p> <p> <a href="/lib/exe/fetch.php?tok=cafc6c&media=http%3A%2F%2Fs21.postimg.org%2Fcjfsgmqqv%2Frunning_up_walls_image_1.jpg" class="media" title="http://s21.postimg.org/cjfsgmqqv/running_up_walls_image_1.jpg"><img src="/lib/exe/fetch.php?tok=cafc6c&media=http%3A%2F%2Fs21.postimg.org%2Fcjfsgmqqv%2Frunning_up_walls_image_1.jpg" class="media" title="running_up_walls_image_1.jpg" alt="running_up_walls_image_1.jpg" /></a> </p> <p> This feature uses areas to determine where the wall is and to detect when the player jumps to it.<br/> Using the function <em>AddPlayerBodyForce</em> i can simulate the force of each leg running up. </p> <p> To get the interval between steps, i'm using <em>Timers</em>.<br/> <br/> We declare the area collision: (<em>AreaWall1 </em> is the area covering the wall and <em>WallRunCollide </em> is the function.) </p> <pre class="code php">void OnStart <span class="br0">{</span> AddEntityCollideCallback<span class="br0">(</span> "Player"<span class="sy0">,</span> "AreaWall1"<span class="sy0">,</span> "WallRunCollide"<span class="sy0">,</span> <span class="kw4">false</span><span class="sy0">,</span> <span class="nu0">1</span> <span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> </pre><p> </p> <p> And this is the function that triggers when the players collides with the area: </p> <pre class="code php">void WallRunCollide <span class="br0">(</span> string <span class="sy0">&</span>in p<span class="sy0">,</span> string <span class="sy0">&</span>in c<span class="sy0">,</span> int s <span class="br0">)</span> <span class="br0">{</span> AddPlayerBodyForce<span class="br0">(</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">20000</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="kw4">false</span> <span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> </pre><p> </p> <p> 2. Adjusting code +<em>Timer</em> +<em>Loop</em> </p> <p> <em>BodyForce </em> function uses large numbers, so i'm using a variable instead: </p> <pre class="code php">void WallRunCollide <span class="br0">(</span> string <span class="sy0">&</span>in p<span class="sy0">,</span> string <span class="sy0">&</span>in c<span class="sy0">,</span> int s <span class="br0">)</span> <span class="br0">{</span> float M <span class="sy0">=</span> <span class="nu0">10000</span><span class="sy0">;</span> AddPlayerBodyForce<span class="br0">(</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">2</span><span class="sy0">*</span>M<span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="kw4">false</span> <span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> </pre><p> </p> <p> This will push the player up just once, so i'm adding a <em>Timer+Loop </em> to repeat the impulse (5 times): </p> <pre class="code php">void WallRunCollide <span class="br0">(</span> string <span class="sy0">&</span>in p<span class="sy0">,</span> string <span class="sy0">&</span>in c<span class="sy0">,</span> int s <span class="br0">)</span> <span class="br0">{</span> float i <span class="sy0">=</span> <span class="nu19">0.25</span><span class="sy0">;</span> int n <span class="sy0">=</span> <span class="nu0">5</span><span class="sy0">;</span> float r <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="kw1">for</span> <span class="br0">(</span> int v <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span> v < <span class="sy0">=</span> n<span class="sy0">;</span> v<span class="sy0">++</span> <span class="br0">)</span> <span class="br0">{</span> AddTimer <span class="br0">(</span> ""<span class="sy0">,</span> r<span class="sy0">,</span> "RunOnMe" <span class="br0">)</span><span class="sy0">;</span> r <span class="sy0">=</span> r <span class="sy0">+</span>i<span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> </pre><p> </p> <p> As you can see, the content changed, i moved it to another new function.<br/> I added 3 variables, interval, number and a counter.<br/> These are used in the <em>for loop.<br/> </em> This loop will set a <em>Timer</em> to call the function "<em>RunOnMe</em>" <em>n</em> times, on an interval of <em>i </em> seconds.<em><br/> </em> <br/> <br/> Below is the new function i created that the <em>Timers</em> will trigger: </p> <pre class="code php">void RunOnMe <span class="br0">(</span> string <span class="sy0">&</span>in t <span class="br0">)</span> <span class="br0">{</span> float M <span class="sy0">=</span> <span class="nu0">10000</span><span class="sy0">;</span> AddPlayerBodyForce<span class="br0">(</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">2</span><span class="sy0">*</span>M<span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="kw4">false</span> <span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> </pre><p> </p> <p> This is supposed to be a step, i'm adding a sound: </p> <pre class="code php">void RunOnMe <span class="br0">(</span> string <span class="sy0">&</span>in t <span class="br0">)</span> <span class="br0">{</span> float M <span class="sy0">=</span> <span class="nu0">10000</span><span class="sy0">;</span> AddPlayerBodyForce<span class="br0">(</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">2</span><span class="sy0">*</span>M<span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="kw4">false</span> <span class="br0">)</span><span class="sy0">;</span> PlayGuiSound<span class="br0">(</span> "step_run_female_rock<span class="sy0">.</span>snt"<span class="sy0">,</span> <span class="nu19">0.4</span> <span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> </pre><p> </p> <p> At this point, the code is working fine. You can test it out. </p> <p> 3. Preventions </p> <p> Now we have to consider possible bugs.<br/> We don't want to trigger this if the player didn't jump.<br/> It would look weird and just fail cause there's not enough starting force.<br/> We can avoid that using <em>GetPlayerYSpeed()</em> function, anything below 1 is not jumping: </p> <pre class="code php">void WallRunCollide <span class="br0">(</span> string <span class="sy0">&</span>in p<span class="sy0">,</span> string <span class="sy0">&</span>in c<span class="sy0">,</span> int s <span class="br0">)</span> <span class="br0">{</span> <span class="kw1">if</span> <span class="br0">(</span> GetPlayerYSpeed<span class="br0">(</span><span class="br0">)</span> < 1 <span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span><span class="sy0">;</span> <span class="br0">}</span> float i <span class="sy0">=</span> <span class="nu19">0.25</span><span class="sy0">;</span> int n <span class="sy0">=</span> <span class="nu0">5</span><span class="sy0">;</span> float r <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="kw1">for</span> <span class="br0">(</span> int v <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span> v < <span class="sy0">=</span> n<span class="sy0">;</span> v<span class="sy0">++</span> <span class="br0">)</span> <span class="br0">{</span> AddTimer <span class="br0">(</span> ""<span class="sy0">,</span> r<span class="sy0">,</span> "RunOnMe" <span class="br0">)</span><span class="sy0">;</span> r <span class="sy0">=</span> r <span class="sy0">+</span>i<span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> </pre><p> </p> <p> That new condition i just added will stop the code by using the <em>return </em> function.<br/> So player may walk into the wall area and not get thrown up by the wall running code. </p> <p> 4. Direction </p> <p> We are adding now a small tweak to our code to let the player direct his wall running.<br/> Using <em>AddPlayerBodyForce </em> we can add a slight push ahead: ( just to help the player go where he's looking at) </p> <pre class="code php">void RunOnMe <span class="br0">(</span> string <span class="sy0">&</span>in t <span class="br0">)</span> <span class="br0">{</span> float M <span class="sy0">=</span> <span class="nu0">10000</span><span class="sy0">;</span> AddPlayerBodyForce<span class="br0">(</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">2</span><span class="sy0">*</span>M<span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="kw4">false</span> <span class="br0">)</span><span class="sy0">;</span> AddPlayerBodyForce<span class="br0">(</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu19">0.7</span><span class="sy0">*</span>M<span class="sy0">,</span> <span class="kw4">true</span> <span class="br0">)</span><span class="sy0">;</span> PlayGuiSound<span class="br0">(</span> "step_run_female_rock<span class="sy0">.</span>snt"<span class="sy0">,</span> <span class="nu19">0.4</span> <span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> </pre><p> </p> <p> 0.7<nowiki>*</nowiki> M should be enough, remember this will run on every step. There's 5. </p> <p> 5. Functionality </p> <p> This is the end of this guide. With this code you can experiment new functionalities and expand its possibilities.<br/> If you're interested, you can take a look at my code in any script file from my mod Riukka for more developed functions on wall running. </p> <p> <br/> Amn.- </p> </div>
hpl2/tutorials/script/running_up_walls.txt
· Last modified: 2015/07/17 20:32 by
amn
Page Tools
Show page
Old revisions
Backlinks
Export to PDF
Back to top