<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to BHTreeBuilder</title><link>https://sourceforge.net/p/itsbhtree/wiki/BHTreeBuilder/</link><description>Recent changes to BHTreeBuilder</description><atom:link href="https://sourceforge.net/p/itsbhtree/wiki/BHTreeBuilder/feed" rel="self"/><language>en</language><lastBuildDate>Sat, 28 Dec 2013 23:53:09 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/itsbhtree/wiki/BHTreeBuilder/feed" rel="self" type="application/rss+xml"/><item><title>BHTreeBuilder modified by Si Dunford</title><link>https://sourceforge.net/p/itsbhtree/wiki/BHTreeBuilder/</link><description>&lt;div class="markdown_content"&gt;&lt;h2 id="creating-a-behavior-tree"&gt;Creating a Behavior Tree&lt;/h2&gt;
&lt;p&gt;A behavior tree can be created in code or by loading a textual definition file. The latter has the advantage that no code needs to be changed in order to adjust the size or properties of the tree and is very useful when creating and testing your tree.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In Code&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="err"&gt;'#&lt;/span&gt; &lt;span class="n"&gt;Create&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Must&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Global&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Control&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;New&lt;/span&gt; &lt;span class="n"&gt;Selector&lt;/span&gt;

&lt;span class="err"&gt;'#&lt;/span&gt; &lt;span class="n"&gt;Create&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;
&lt;span class="n"&gt;Global&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;BHTree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;New&lt;/span&gt; &lt;span class="n"&gt;BHTree&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="err"&gt;'#&lt;/span&gt; &lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="n"&gt;children&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addchild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;New&lt;/span&gt; &lt;span class="n"&gt;Movement&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addchild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;New&lt;/span&gt; &lt;span class="n"&gt;ChooseDestination&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="err"&gt;'#&lt;/span&gt; &lt;span class="n"&gt;Dump&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;debug&lt;/span&gt; &lt;span class="n"&gt;purposes&lt;/span&gt;
&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Using the Behavior Builder&lt;/strong&gt;&lt;br /&gt;
The code to build a tree is very simple. &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Global&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;BHTree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;New&lt;/span&gt; &lt;span class="n"&gt;BHTree&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;If&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;Then&lt;/span&gt; &lt;span class="n"&gt;End&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The definition can be defined in your code, loaded from an external file or INC-BIN'd into your application for example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="err"&gt;'#&lt;/span&gt; &lt;span class="n"&gt;Definition&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;
&lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Selector( ShootEnemy() Movement() )&amp;quot;&lt;/span&gt;

&lt;span class="err"&gt;'#&lt;/span&gt; &lt;span class="n"&gt;Load&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;Definition&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;
&lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoadString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sampleTree.def&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="err"&gt;'#&lt;/span&gt; &lt;span class="n"&gt;Load&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;Definition&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;incbin&lt;/span&gt;
&lt;span class="n"&gt;Incbin&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;sampleTree.def&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoadString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;incbin::sampleTree.def&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The BHTree.Load() returns NULL if there are any errors in your definition; to debug it turn on debugging and the parser will dump the errors into the compiler output screen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Definition File Syntax&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Each Node is defined by it's classname, nodename, parameters and children like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;    &lt;span class="n"&gt;CLASSNAME&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NODENAME&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PARAMETERS&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CHILDREN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Classname is any Blitzmax Type descended from Control or Trait.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CLASSNAME&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Any valid Control or Trait Type&lt;/td&gt;
&lt;td&gt;Selector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NODENAME&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Name of the node within square brackets&lt;/td&gt;
&lt;td&gt;"&lt;span&gt;[root]&lt;/span&gt;"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PARAMETERS&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Comma separated values passed to the Type.set() method.&lt;/td&gt;
&lt;td&gt;"{param1,param2}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CHILDREN&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Children of the node&lt;/td&gt;
&lt;td&gt;"()"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For example, a root node (Of type Selector) with two children (A Movement Type and a ShootEnemy Type) may be defined like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ShootEnemy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;Movement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Si Dunford</dc:creator><pubDate>Sat, 28 Dec 2013 23:53:09 -0000</pubDate><guid>https://sourceforge.net5258b370bc711ee3036820bedb00c2c5da9e40fa</guid></item></channel></rss>