{"id":1237,"date":"2015-01-18T23:21:25","date_gmt":"2015-01-18T23:21:25","guid":{"rendered":"http:\/\/phoenixgamedevelopment.com\/blog\/?p=1237"},"modified":"2015-01-18T23:26:16","modified_gmt":"2015-01-18T23:26:16","slug":"p-157-resource-uploaded","status":"publish","type":"post","link":"https:\/\/phoenixgamedevelopment.com\/blog\/p-157-resource-uploaded\/","title":{"rendered":"P-157: Resource Uploaded"},"content":{"rendered":"<p>I have submitted my path-following resource to Garagegames. It is available <a href=\"http:\/\/www.garagegames.com\/community\/blogs\/view\/22926\">HERE<\/a>.<\/p>\n<p>A video of the resource is here:<\/p>\n<p><iframe loading=\"lazy\" src=\"\/\/www.youtube.com\/embed\/FV6lUiqSpmg\" width=\"420\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>The text of the resource is as follows:<\/p>\n<h1>ForcePaths Path Following Resource<\/h1>\n<p class=\"date\">by <a href=\"http:\/\/www.garagegames.com\/account\/profile\/42962\">Jack Stone<\/a> <strong>\u00b7<\/strong> 01\/18\/2015 (3:17 pm) <strong>\u00b7<\/strong> 0 comments<\/p>\n<div id=\"blogContent\" class=\"type-blog\">\n<div class=\"body\">\n<p>To use this resource, simply create a path in the usual way (use the gui option under Library\/Level\/Path). Add as many nodes as you wish, and move them to where you would like them to be.<\/p>\n<p>A video of the resource is here:<br \/>\n<a href=\"http:\/\/youtu.be\/FV6lUiqSpmg\" target=\"_blank\" rel=\"nofollow\">youtu.be\/FV6lUiqSpmg<\/a><\/p>\n<p>Make sure the &#8220;isLooping&#8221; property of the path is set if you wish the object to loop around the path, otherwise, it will only follow the path once.<\/p>\n<p>Then, create a file called &#8220;Forcepath.cs&#8221; or similiar, and have it execute. Enter this code:<\/p>\n<div class=\"dp-highlighter\">\n<div class=\"bar\"><\/div>\n<ol class=\"dp-cpp\" start=\"1\">\n<li class=\"alt\">echo(<span class=\"string\">&#8220;ForcePath.cs&#8221;<\/span>);<\/li>\n<li class=\"\">echo(<span class=\"string\">&#8220;Phoenix\u00a0Game\u00a0Development&#8221;<\/span>);<\/li>\n<li class=\"alt\">echo(<span class=\"string\">&#8220;www.phoenxigamedevelopment.com&#8221;<\/span>);<\/li>\n<li class=\"\"><\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">function\u00a0applyforces(%path,%force,%obj){<\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0%pos\u00a0=\u00a0getWords(%obj.getTransform(),0,2);\u00a0<span class=\"comment\">\/\/object\u00a0position<\/span><\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(%obj.curnode\u00a0$=\u00a0<span class=\"string\">&#8220;&#8221;<\/span>){\u00a0<span class=\"comment\">\/\/find\u00a0the\u00a0closest\u00a0path\u00a0node\u00a0to\u00a0this\u00a0object<\/span><\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%closest\u00a0=\u00a0999;<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">for<\/span>(%i\u00a0=\u00a00;%i&lt;%path.getCount();%i++){<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%dist\u00a0=\u00a0vectordist(%pos,%path.getObject(%i).getPosition());<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(%dist\u00a0&lt;\u00a0%closest){<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%closest\u00a0=\u00a0%dist;<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%obj.closestid\u00a0=\u00a0%i;<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%obj.curnode\u00a0=\u00a0%path.getObject(%i);<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0%closestnodepos\u00a0=\u00a0getWords(%obj.curnode.gettransform(),0,2);<\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0%dist\u00a0=\u00a0vectordist(%pos,%closestnodepos);<\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(%dist&lt;1){<span class=\"comment\">\/\/Object\u00a0has\u00a0reached\u00a0this\u00a0node<\/span><\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(%obj.closestid\u00a0&lt;\u00a0%path.getCount()-1)<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%obj.closestid++;<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">else<\/span>{<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(%path.islooping){<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%obj.closestid\u00a0=\u00a00;<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">else<\/span><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">return<\/span>;<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%obj.curnode\u00a0=\u00a0%path.getObject(%obj.closestid);<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"\"><\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"comment\">\/\/get\u00a0a\u00a0vector\u00a0between\u00a0both\u00a0nodes:<\/span><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%pnodepos\u00a0=\u00a0%pos;<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%nnodepos\u00a0=\u00a0getWords(%obj.curnode.getTransform(),0,2);<\/li>\n<li class=\"\"><\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%vec\u00a0=\u00a0vectorsub(%pnodepos,%nnodepos);<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%vec\u00a0=\u00a0\u00a0VectorNormalize(%vec);<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%vec\u00a0=\u00a0vectorscale(%vec,%force);<\/li>\n<li class=\"\"><\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%obj.SetTransform(vectorsub(%pos,%vec));<\/li>\n<li class=\"\"><\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cancel(%path.schedule);<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%path.schedule\u00a0=\u00a0schedule(5,0,<span class=\"string\">&#8220;applyforces&#8221;<\/span>,%path,%force,%obj,%endpath);<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"\"><\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0function\u00a0applyforcesPlayer(%path,%force){<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%player\u00a0=\u00a0localclientconnection.getcontrolobject();<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%pos\u00a0=\u00a0getWords(%player.getTransform(),0,2);<\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(%player.curnode\u00a0$=\u00a0<span class=\"string\">&#8220;&#8221;<\/span>){<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%closest\u00a0=\u00a0999;<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">for<\/span>(%i\u00a0=\u00a00;%i&lt;%path.getCount();%i++){<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%dist\u00a0=\u00a0vectordist(%pos,%path.getObject(%i).getPosition());<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(%dist\u00a0&lt;\u00a0%closest){<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%closest\u00a0=\u00a0%dist;<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%player.closestid\u00a0=\u00a0%i;<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%player.curnode\u00a0=\u00a0%path.getObject(%i);<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%closestnodepos\u00a0=\u00a0getWords(%player.curnode.gettransform(),0,2);<\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%dist\u00a0=\u00a0vectordist(%pos,%closestnodepos);<\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(%dist&lt;1){<\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(%player.closestid\u00a0&lt;\u00a0%path.getCount()-1)<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%player.closestid++;<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">else<\/span>{<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(%path.islooping){<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%player.closestid\u00a0=\u00a00;<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">else<\/span><\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">return<\/span>;<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%player.curnode\u00a0=\u00a0%path.getObject(%player.closestid);<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"comment\">\/\/get\u00a0a\u00a0vector\u00a0between\u00a0both\u00a0nodes:<\/span><\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%pnodepos\u00a0=\u00a0%pos;<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%nnodepos\u00a0=\u00a0getWords(%player.curnode.getTransform(),0,2);<\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"comment\">\/*<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/This\u00a0code\u00a0uses\u00a0vectors\u00a0determine\u00a0the\u00a0distance\u00a0between\u00a0the\u00a0player\u00a0and\u00a0a\u00a0point\u00a0on\u00a0an\u00a0imaginary\u00a0line\u00a0from\u00a0the\u00a0closest\u00a0path\u00a0node\u00a0to\u00a0the\u00a0next\u00a0and\u00a0previous<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/nodes\u00a0on\u00a0the\u00a0path.\u00a0Then,\u00a0if\u00a0this\u00a0distance\u00a0is\u00a0close\u00a0enough,\u00a0the\u00a0player\u00a0is\u00a0included\u00a0in\u00a0the\u00a0force\u00a0field,\u00a0otherwise\u00a0they\u00a0are\u00a0not.<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/This\u00a0is\u00a0not\u00a0working\u00a0100%\u00a0yet,\u00a0so\u00a0with\u00a0it\u00a0commented\u00a0out,\u00a0the\u00a0player\u00a0will\u00a0always\u00a0be\u00a0included\u00a0in\u00a0the\u00a0force\u00a0zone,\u00a0regardless\u00a0of\u00a0their\u00a0position\u00a0in\u00a0the\u00a0level.<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%inrange\u00a0=\u00a00;<\/span><\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%prevnode\u00a0=\u00a0%player.closestid-1;<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(%player.closestid\u00a0&lt;=0)<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%prevnode\u00a0=\u00a0%path.getCount()-1;<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%p1\u00a0=\u00a0getWords(%path.getObject(%prevnode).getTransform(),0,2);<\/span><\/li>\n<li class=\"\"><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/for\u00a0the\u00a0player,\u00a0we\u00a0need\u00a0to\u00a0determine\u00a0if\u00a0they\u00a0are\u00a0close\u00a0enough\u00a0to\u00a0the\u00a0ForcePath\u00a0to\u00a0be\u00a0affected:<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Vector\u00a0Math\u00a0time\u00a0again!<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%d1\u00a0=\u00a0vectordist(%pos,%closestnodepos);<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%v1\u00a0=\u00a0vectorsub(%nnodepos,%p1);<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%v1\u00a0=\u00a0vectornormalize(%v1);<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%v2\u00a0=\u00a0vectorscale(%v1,%d1);<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%pos3\u00a0=\u00a0vectoradd(%nnodepos,%v2);<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%dist2\u00a0=\u00a0vectordist(%pos,%pos3);<\/span><\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(%dist2\u00a0&lt;\u00a015)<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%inrange\u00a0=\u00a01;<\/span><\/li>\n<li class=\"\"><\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%prevnode\u00a0=\u00a0%player.closestid+1;<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(%prevnode\u00a0&gt;=%path.getCount())<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%prevnode\u00a0=\u00a00;<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%p1\u00a0=\u00a0getWords(%path.getObject(%prevnode).getTransform(),0,2);<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/check\u00a0second\u00a0vector:<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%d1\u00a0=\u00a0vectordist(%pos,%closestnodepos);<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%v1\u00a0=\u00a0vectorsub(%nnodepos,%p1);<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%v1\u00a0=\u00a0vectornormalize(%v1);<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%v2\u00a0=\u00a0vectorscale(%v1,%d1);<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%pos3\u00a0=\u00a0vectorsub(%nnodepos,%v2);<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%dist2\u00a0=\u00a0vectordist(%pos,%pos3);<\/span><\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(%dist2\u00a0&lt;\u00a015)<\/span><\/li>\n<li class=\"alt\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%inrange\u00a0=\u00a01;<\/span><\/li>\n<li class=\"\"><span class=\"comment\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0*\/<\/span><\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%inrange\u00a0=\u00a01;<\/li>\n<li class=\"\"><\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(%inrange\u00a0==\u00a01){<\/li>\n<li class=\"\"><\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%vec\u00a0=\u00a0vectorsub(%nnodepos,%pnodepos);<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%vec\u00a0=\u00a0\u00a0VectorNormalize(%vec);<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%vec\u00a0=\u00a0vectorscale(%vec,%force);<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%player.applyimpulse(%pos,%vec);<\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li class=\"\"><\/li>\n<li class=\"alt\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cancel(%path.schedule);<\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0%path.schedule\u00a0=\u00a0schedule(50,0,<span class=\"string\">&#8220;applyforcesplayer&#8221;<\/span>,%path,%force);<\/li>\n<li class=\"alt\"><\/li>\n<li class=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<\/ol>\n<\/div>\n<p>To use the resource, you must call one of the two functions. For an object (static shape, item, etc) use this function:<br \/>\napplyforces(PATHNAME,FORCE,OBJECTNAME);<\/p>\n<p>So, for a path called &#8220;ForcePath&#8221;, a force of 0.02, and an Object called &#8220;tstobj&#8221;:<\/p>\n<p>applyforces(&#8220;ForcePath2&#8221;,0.02,tstobj);<\/p>\n<p>A low &#8220;force&#8221; value works best here. Higher force values mean faster speeds.<\/p>\n<p>To use the resource with a player, call the following function:<\/p>\n<p>applyforcesPlayer(&#8220;ForcePath&#8221;,300);<\/p>\n<p>Higher force values are better here, since the player code uses &#8220;applyimpulse()&#8221; to move the player, rather than setTransform();<\/p>\n<\/div>\n<div class=\"body\"><\/div>\n<div class=\"body\"><\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I have submitted my path-following resource to Garagegames. It is available HERE. A video of the resource is here: The text of the resource is as follows: ForcePaths Path Following Resource by Jack Stone \u00b7 01\/18\/2015 (3:17 pm) \u00b7 0 comments To use this resource, simply create a path in the usual way (use the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,12],"tags":[],"class_list":["post-1237","post","type-post","status-publish","format-standard","hentry","category-software-and-games","category-tutorials","has-post-title","has-post-date","has-post-category","has-post-tag","has-post-comment","has-post-author",""],"aioseo_notices":[],"builder_content":"","_links":{"self":[{"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/posts\/1237"}],"collection":[{"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/comments?post=1237"}],"version-history":[{"count":2,"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/posts\/1237\/revisions"}],"predecessor-version":[{"id":1239,"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/posts\/1237\/revisions\/1239"}],"wp:attachment":[{"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/media?parent=1237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/categories?post=1237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/tags?post=1237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}