<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF
	xmlns="http://purl.org/rss/1.0/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel rdf:about="http://feeds.garagegames.com/rss/blogs/developer/63486/">
		<title>Blog for James Ford at GarageGames.com</title>
		<description>Blog feeds for Gamers and Developers in the GarageGames community.</description>
		<link>http://www.garagegames.com/</link>
		<image rdf:resource="http://www.garagegames.com/images/GarageGames_logo_small_w.gif" />
		<dc:date>2008-11-21T15:03:05+00:00</dc:date>
		<items>
			<rdf:Seq>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/63486/15483"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/63486/15161"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/63486/14783"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/63486/13522"/>
			</rdf:Seq>
		</items>
	</channel>
	<item rdf:about="http://www.garagegames.com/blogs/63486/15483">
		<dc:format>text/html</dc:format>
		<dc:date>2008-09-28T04:37:57+00:00</dc:date>
		<dc:creator>James Ford</dc:creator>
		<title>Behavior Trees in TGB Experiment</title>
		<link>http://www.garagegames.com/blogs/63486/15483</link>
		<description>If you are interested in game AI and haven't heard of behavior trees you might want to check out &lt;a href='http://www.AIGameDev.com' target=_blank&gt;AIGameDev.com&lt;/a&gt;.  In short they are the new, sexier finite state machines, basically a good way of laying out behaviors for your game agents in a nice modular and reusable way.  &lt;br&gt;&lt;br&gt;I felt like messing around with them and maybe a few other AI techniques for some experience, and ended up with this...&lt;br&gt;&lt;br&gt;&lt;center&gt;&lt;br&gt;&lt;i&gt;Some &amp;quot;monster&amp;quot; agents getting hunted down by a &amp;quot;hero&amp;quot; agent.&lt;/i&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://farm4.static.flickr.com/3019/2894308150_d6bcaebeae_o.png'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;/center&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;To give you an idea what it looks like to put together a behavior tree in script...&lt;br&gt;Note that there's more code behind the scenes doing work of course, in fact some in C++.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;function FighterBehaviorTree::create( %agent )&lt;br&gt;{&lt;br&gt;   %tree = new BehaviorTree()&lt;br&gt;   {&lt;br&gt;      class = &amp;quot;FighterBehaviorTree&amp;quot;;&lt;br&gt;      agent = %agent; &lt;br&gt;   };&lt;br&gt;      &lt;br&gt;   %root = SelectorBehavior::create();&lt;br&gt;   %tree.add( %root );        &lt;br&gt;&lt;br&gt;   // Eat some Food&lt;br&gt;   %beh = %root.add( SequenceBehavior::create() );&lt;br&gt;      %beh.add( Condition::create( &amp;quot;HungryCondition&amp;quot;, false, true ) );                  &lt;br&gt;      %beh.add( ChatBehavior::create( &amp;quot;I'm hungry...&amp;quot; ) );      &lt;br&gt;      %sel = %beh.add( SelectorBehavior::create() );&lt;br&gt;         %beh = %sel.add( SequenceBehavior::create() );      &lt;br&gt;            %beh.add( Condition::create( &amp;quot;HasFoodCondition&amp;quot;, false, true ) );         &lt;br&gt;            %beh.add( ChatBehavior::create( &amp;quot;Eating some food!&amp;quot; ) );&lt;br&gt;            %beh.add( LeafBehavior::create( &amp;quot;EatFoodBehavior&amp;quot; ) );&lt;br&gt;            %beh.add( WaitBehavior::create( 2000 ) );&lt;br&gt;         %beh = %sel.add( SequenceBehavior::create() );&lt;br&gt;            %beh.add( Condition::create( &amp;quot;HasFoodCondition&amp;quot;, false, false ) );        &lt;br&gt;            %beh.add( ChatBehavior::create( &amp;quot;Going to buy food!&amp;quot; ) ); &lt;br&gt;            %beh.add( MoveToPositionBehavior::create( $TavernPos, 0.1 ) );&lt;br&gt;            %beh.add( LeafBehavior::create( &amp;quot;BuyFoodBehavior&amp;quot; ) );&lt;br&gt;   &lt;br&gt;   // Kill a Monster&lt;br&gt;   %beh = %root.add( SequenceBehavior::create() );&lt;br&gt;      %beh.add( Condition::create( &amp;quot;MonstersNearbyCondition&amp;quot;, true, true ) );&lt;br&gt;         %sel = %beh.add( SelectorBehavior::create( &amp;quot;FightOrFleeSelector&amp;quot; ) );&lt;br&gt;            %beh = %sel.add( SequenceBehavior::create() );               &lt;br&gt;               %beh.add( ChatBehavior::create( &amp;quot;Hunting a Monster!&amp;quot; ) );               &lt;br&gt;               %par = %beh.add( ParallelBehavior::create() );          &lt;br&gt;                  %par.add( LeafBehavior::create( &amp;quot;TargetClosestEnemyBehavior&amp;quot; ) );&lt;br&gt;                  %par.add( FollowTargetBehavior::create( 15 ) );        &lt;br&gt;                  %beh = %par.add( LoopBehavior::create( &amp;quot;FOREVER&amp;quot; ) );                  &lt;br&gt;                     %beh = %beh.add( SequenceBehavior::create() );&lt;br&gt;                        %beh.add( LeafBehavior::create( &amp;quot;ChooseWeaponBehavior&amp;quot; ) );&lt;br&gt;                        %beh.add( ChatBehavior::create( &amp;quot;Attacking!&amp;quot; ) );&lt;br&gt;                        %beh.add( LeafBehavior::create( &amp;quot;AttackTargetBehavior&amp;quot; ) );&lt;br&gt;                        %beh.add( WaitBehavior::create( 1000 ) );               &lt;br&gt;   &lt;br&gt;   // Rest at Inn&lt;br&gt;   %beh = %root.add( SequenceBehavior::create() );&lt;br&gt;      %beh.add( Condition::create( &amp;quot;TiredCondition&amp;quot;, false ) );&lt;br&gt;      %beh.add( Condition::create( &amp;quot;MonstersNearbyCondition&amp;quot;, true, false ) );&lt;br&gt;      %beh.add( MoveToPositionBehavior::create( $InnPos, 0.1 ) );&lt;br&gt;      %beh.add( LeafBehavior::create( &amp;quot;SleepBehavior&amp;quot; ) );&lt;br&gt;      &lt;br&gt;   // Wander&lt;br&gt;   %seq = %root.add( SequenceBehavior::create() );   &lt;br&gt;      %seq.add( Condition::create( &amp;quot;MonstersNearbyCondition&amp;quot;, true, false ) );&lt;br&gt;      %beh = %seq.add( TimerBehavior::create( 3000 ) );&lt;br&gt;         %beh.add( LeafBehavior::create( &amp;quot;WanderBehavior&amp;quot; ) );   &lt;br&gt;      %seq.add( WaitBehavior::create( 1500 ) );&lt;br&gt;&lt;br&gt;   return %tree;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;So that looks fairly organized, maybe even a little &amp;quot;tree&amp;quot; like right?  Still, creating them could be easier.  So I've been working on an editor to help out.  &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;center&gt;&lt;br&gt;&lt;i&gt;Looking at the FighterBehaviorTree in game&lt;/i&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://farm4.static.flickr.com/3202/2893467409_926a086a6a_o.png'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;/center&gt;&lt;br&gt;&lt;br&gt;So I'd say my review of behavior trees is &amp;quot;thumbs up&amp;quot;.  Once you have the framework in place, putting together a new tree consisting of a few sequences and selectors is a breeze.&lt;br&gt;&lt;br&gt;Still I'm not doing anything very complex with these yet.  Some more complex things I'd still like to try...&lt;br&gt;&lt;b&gt;*&lt;/b&gt; building behavior trees &lt;b&gt;dynamically&lt;/b&gt;, perhaps under the direction of a &lt;b&gt;planner&lt;/b&gt;&lt;br&gt;&lt;br&gt;And lots of stuff to add to the editor&lt;br&gt;&lt;b&gt;*&lt;/b&gt; substituting one behavior for another ( correctly transferring over children )&lt;br&gt;&lt;b&gt;*&lt;/b&gt; show the &lt;b&gt;execution path&lt;/b&gt; in the tree editor&lt;br&gt;&lt;b&gt;*&lt;/b&gt; Saving assembled trees to a managed script file&lt;br&gt;&lt;br&gt;Of course there's plenty of other ai topics I'd like to look into&lt;br&gt;&lt;b&gt;*&lt;/b&gt; fuzzy logic ( possibly used in a SelectorBehavior )&lt;br&gt;&lt;b&gt;*&lt;/b&gt; a system for working and permanent &lt;b&gt;memory&lt;/b&gt; of agents&lt;br&gt;&lt;b&gt;*&lt;/b&gt; etc ad infinitum</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/63486/15161">
		<dc:format>text/html</dc:format>
		<dc:date>2008-07-28T18:45:43+00:00</dc:date>
		<dc:creator>James Ford</dc:creator>
		<title>My Programming Cheatsheet</title>
		<link>http://www.garagegames.com/blogs/63486/15161</link>
		<description>//---------------------------&lt;br&gt;// Programming Notes&lt;br&gt;//---------------------------&lt;br&gt;&lt;br&gt;These are my &amp;quot;programming notes&amp;quot;, a txt tile I keep on my desktop for things I looked up one to many times and decided to write down.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;const F32*&lt;/i&gt;&lt;br&gt;   means the F32 is const, you can't change its value but you can change the pointer&lt;br&gt;&lt;i&gt;const *F32&lt;/i&gt;&lt;br&gt;   means the pointer is const, you cannot change the pointer, but you can change the F32&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;Rotate vector by an angle ( in 3D this is rotating around the z axis )&lt;/i&gt;&lt;br&gt;  x' = cos(theta)*x - sin(theta)*y &lt;br&gt;  y' = sin(theta)*x + cos(theta)*y&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;EndMission / EndGame script function flowchart&lt;/i&gt;&lt;br&gt;  loadmission() -&amp;gt;   endmission()&lt;br&gt;  destroyserver() -&amp;gt; endmission()&lt;br&gt;  	             endMission() -&amp;gt; onmissionended() -&amp;gt; endgame() -&amp;gt; resetmission()&lt;br&gt;  GameConnection::onDeath() -&amp;gt; cycleGame() -&amp;gt; onCycleExec() -&amp;gt; endgame()&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;How to get a sequence name by its index.&lt;/i&gt;&lt;br&gt;  const char* seqName = mShape-&amp;gt;getName( thread-&amp;gt;sequence-&amp;gt;nameIndex );&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;How to set a conditional breakpoint using string comparisions.&lt;/i&gt;&lt;br&gt;if ( dStrcmp( seqName, &amp;quot;chew&amp;quot; ) == 0 )&lt;br&gt;{&lt;br&gt;   int t = 0; // set breakpoint here&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;This is how you get a nodes name:&lt;/i&gt;&lt;br&gt;      S32 nodeNameIdx = mShapeInstance-&amp;gt;getShape()-&amp;gt;nodes[cast.node].nameIndex;&lt;br&gt;      const UTF8 *nodeName = mShapeInstance-&amp;gt;getShape()-&amp;gt;getName( nodeNameIdx );&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;To regenerate intellisense:&lt;/i&gt;&lt;br&gt;  Close VStudio, delete .ncb and .suo files in the solution folder, reopen and build project.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;description of Player::getTransform MatrixF columns&lt;/i&gt;&lt;br&gt;  column0 = rightvec&lt;br&gt;  column1 = forwardVec&lt;br&gt;  column2 = upVec&lt;br&gt;  column3 = position&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;Calculate Size of a Terrain Block&lt;/i&gt;&lt;br&gt;squaresize x texelsPerMeter = terrain length ( or width )&lt;br&gt;&lt;br&gt;&lt;br&gt;UP is POSITIVE Z&lt;br&gt;  Higher objects have a more POSITIVE z position&lt;br&gt;&lt;br&gt;&lt;br&gt;qSort itemA - itemB is ASCENDING - lowest val is element0&lt;br&gt;      itemB - itemA is DESCENDING - highest val is element0&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;To post a url link with and give it a different visible name.&lt;/i&gt;&lt;br&gt;{url=VisibleName}www.url.com{/url}&lt;br&gt;But use square brackets.&lt;br&gt;&lt;br&gt;&lt;br&gt;PI = 180 Degrees&lt;br&gt;&lt;br&gt;sin(x) = len(opposite) / (len(hypotenuse)&lt;br&gt;&lt;br&gt;cos(x) = len(adjacent) / len(hypotenuse)&lt;br&gt;&lt;br&gt;tan(x) = len(opposite) / len(adjacent)</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/63486/14783">
		<dc:format>text/html</dc:format>
		<dc:date>2008-05-24T02:12:39+00:00</dc:date>
		<dc:creator>James Ford</dc:creator>
		<title>Be the Dinosaur - AI Postmortem</title>
		<link>http://www.garagegames.com/blogs/63486/14783</link>
		<description>&lt;center&gt;&lt;br&gt;&lt;b&gt;Be The Dinosaur&lt;br&gt;AI Postmortem&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://farm3.static.flickr.com/2208/2516680917_055d79d5e3.jpg'  alt=&quot;&quot;&gt;&lt;/center&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;This was originally going to be a blog post but it got way, way too long.  For the complete pdf doc, &lt;a href='http://www.box.net/shared/685814ni8k' target=_blank&gt;click here&lt;/a&gt;.  The rest of this post contains no information not in the full version.  Go ahead and click it. &lt;br&gt;&lt;br&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;br&gt;&lt;br&gt;Be The Dinosaur (BtD) is a museum exhibit featuring an interactive simulation in which the visitor takes first-person control of a dinosaur in the late Cretaceous period.  The exhibit may contain 1 - 32 machines together on the same network.  Currently the two playable dinosaurs are the Triceratops (trike) and Tyrannosaurus rex (trex).  Visitors will interact with each other in the simulation and with AI controlled dinos (DinoAgents).  The most important activities are finding food, water, and defending yourself from other dinos.&lt;br&gt;&lt;br&gt;This project is produced by Eureka Exhibits and developed by us at Sickhead.  The Sickhead team consists of Tom Spilman, Russell Fincher, Ross Pawley, and James Ford (me).  We began work on this project October 1st; 2000+ svn commits and 7 months later we emerge having finished the first project phase.&lt;br&gt;&lt;br&gt;The focus of this paper, however, is the ai in BtD. Serious work on the AI began ~February 25, 2008.  This paper reflects work done from then until May 19, 2008.  This means approximately 2.5 months of full time work by an individual (me) was done for the BtD AI as it is now.&lt;br&gt;&lt;br&gt;&lt;b&gt;Reasons for this Paper&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Spend some time reflecting on what we have done, and what to do next.&lt;br&gt;&lt;li&gt;Let the community know what we are up to here at Sickhead.&lt;br&gt;&lt;li&gt;Give something back to the community; there might be something useful for you in here.&lt;/ul&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;AI Development Cycle&lt;/b&gt;&lt;br&gt;&lt;br&gt;The first BtD museum exhibit opened on Feb.3, 2008.  At that time there was no dinosaur AI except for a random wander behavior which did not perform pathfinding or obstacle avoidance.  Since multiple players were not always available and not reliable for &amp;quot;modeling correct dinosaur behavior&amp;quot;, improvements to the AI were a high priority for both improving the educational value and overall visitor experience.&lt;br&gt;&lt;br&gt;After completing work on other core issues I began working exclusively on the AI around February 25th.  The simulation was already on exhibit and the museum was promised on-going improvements throughout the duration of the exhibit.  Also, visiting publicists and agents from other museums would be visiting and we needed to maximize the chance of booking future exhibits.  If you are getting worried, we did make all deadlines, a good impression, and everyone was happy.  At this time the exhibit has moved to the Louisville Science Center in Kentucky and we are in preparation for beginning a second BtD contract, which will include more AI improvements.&lt;br&gt;&lt;br&gt;Since the simulation was already on exhibit when real work on the AI began it was important to implement features that would make the biggest different in gameplay first.  We did not have an allocated amount of time for a design phase or time to develop a complex architecture.  I also had very little AI programming experience.  This should set the tone for you, and I thought it worthwhile to mention that time constrains played a large role in the AI development.&lt;br&gt;&lt;br&gt;&lt;b&gt;Resources and Acknowledgements&lt;/b&gt;&lt;br&gt;&lt;br&gt;The most valuable resource turned out to be ImmersiveAI provided by Gavin Bunney.&lt;br&gt;&lt;a href='http://www.garagegames.com/blogs/64167/12423'&gt;www.garagegames.com/blogs/64167/12423&lt;/a&gt;&lt;br&gt;&lt;br&gt;The book Programming Game AI by Example by Mat Buckland.&lt;br&gt;&lt;a href='http://www.ai-junkie.com/books/toc_pgaibe.html' target=_blank&gt;www.ai-junkie.com/books/toc_pgaibe.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;And the AI Game Programming Wisdom series of books.&lt;br&gt;&lt;a href='http://www.aiwisdom.com' target=_blank&gt;www.aiwisdom.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;Thank you Gavin for making iAI available to the public, and excellent work!  We had to make a decision early on whether to make our own architecture from scratch or try integrating an ai resource.  We looked at GOAP (goal oriented action planning used in F.E.A.R.) and would have loved to implement it in Torque, but we just didn't have the time.  iAI turned out to be a perfect starting framework for A* pathfinding and goal-based behaviors.&lt;br&gt;&lt;br&gt;Also very useful and often consulted was the book Programming Game AI by Example, thanks Mat Buckland for writing the most practical, and best overview, ai book ever.  In particular, the steering behavior code formed the basis of our SteeringManager class.&lt;br&gt;&lt;br&gt;The AI Game Programming Wisdom books were also excellent for providing general education of contemporary ai techniques.  Obviously not all the papers could apply to this project, and in fact source code from only one or two papers made it into BtD.  Some of the more tantalizing ideas and techniques we just did not have time to mess with.  However, I consider myself a much better educated ai programmer for having read them and that will help solve any problem.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;center&gt;&lt;img src='http://farm3.static.flickr.com/2244/2517200060_43ed94f1e3.jpg'  alt=&quot;&quot;&gt;&lt;/center&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;BtD AI Architecture Overview&lt;/b&gt;&lt;br&gt;&lt;br&gt;Brief list of components:&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Steering Behaviors for managing short range movements and obstacle avoidance.&lt;br&gt;&lt;li&gt;Procedural node generation based on empirical testing and A* pathfinding.&lt;br&gt;&lt;li&gt;A prioritized goal architecture for defining dino behaviors.&lt;br&gt;&lt;li&gt;A DinoAgent class completely separate from the Player class, which can be attached and detached.&lt;br&gt;&lt;li&gt;A DinoAgentManager class to handle updating agents, propagating sound events, and other operations that affect all or multiple DinoAgents.&lt;/ul&gt;&lt;br&gt;&lt;br&gt;Brief list of DinoAgent behaviors:&lt;br&gt;&lt;br&gt;All Dinos:&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Find and drink water.&lt;br&gt;&lt;li&gt;Prefer to remain near their pack.&lt;br&gt;&lt;li&gt;Interact with friendly dinos (eg. vocalization).&lt;br&gt;&lt;li&gt;Respond appropriately to overly aggressive &amp;quot;friendly&amp;quot; dinos.&lt;/ul&gt;&lt;br&gt;&lt;br&gt;Trike:&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Find and eat edible plants.&lt;br&gt;&lt;li&gt;Use a variety of tactics while in combat ( eg. charge, defend, flee ).&lt;/ul&gt;&lt;br&gt;&lt;br&gt;Trex:&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Find and eat dino carcasses.&lt;br&gt;&lt;li&gt;Hunt and kill prey dinos using a variety of tactics ( eg. stalk, charge, circle, flee ).&lt;/ul&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;center&gt;&lt;img src='http://farm3.static.flickr.com/2220/2517197552_6010ba98df.jpg'  alt=&quot;&quot;&gt;&lt;/center&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;A few AI topics covered in the pdf:&lt;/b&gt;&lt;br&gt;&lt;br&gt;Interesting techniques...&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Integrating dynamic and static obstacle avoidance ... what didn't work, what else didn't, and what did&lt;br&gt;&lt;li&gt;Precomputing paths to solve problems ... finding the closest water or plants to a dinos position&lt;br&gt;&lt;li&gt;Handling goal failure and avoiding goals ... don't repeat the same mistake&lt;/ul&gt;&lt;br&gt;&lt;br&gt;Areas for BtD AI to improve...&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Making Dino AIs more responsive to the player ... more interaction options, re-prioritizing interaction goals&lt;br&gt;&lt;li&gt;Improvements to handling goal failure ... better failure tests, more custom code in goal-fail callbacks&lt;br&gt;&lt;li&gt;Improvements to the goal architecture ... goal subclassing, dynamic goal priority ...&lt;br&gt;&lt;/ul&gt;&lt;br&gt;---&lt;br&gt;&lt;br&gt;The rest you can read in the &lt;a href='http://www.box.net/shared/685814ni8k' target=_blank&gt;PDF&lt;/a&gt;.  Also our client put a few &lt;a href='http://www.youtube.com/user/EurekaExhibits' target=_blank&gt;videos on YouTube&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Enjoy!&lt;br&gt;&lt;br&gt;&lt;center&gt;&lt;img src='http://farm3.static.flickr.com/2138/2516376003_24a6140b08.jpg'  alt=&quot;&quot;&gt;&lt;/center&gt;</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/63486/13522">
		<dc:format>text/html</dc:format>
		<dc:date>2007-09-07T00:16:28+00:00</dc:date>
		<dc:creator>James Ford</dc:creator>
		<title>TGB 1.5.1 Tutorial Pack In Development</title>
		<link>http://www.garagegames.com/blogs/63486/13522</link>
		<description>TGB is a powerful engine which, once learned, can be used to create near-anything.  The catch is, the learning curve remains steep, and many a would-be developer gives up in frustration.  The tutorials that ship with TGB are excellent, but do not provide as complete an education as newcomers often hope for.  &lt;br&gt;&lt;br&gt;I hope to change this for every TGB-noob.&lt;br&gt;&lt;br&gt;The TGB tutorial pack will consist of 5 complete and working classic games, made with the latest version of TGB 1.5.1, making heavy use of behaviors, and using script only.  These games may be taken for educational value only or used as a framework for your own classic-style game.  The whole pack will be available for purchase at a very reasonable price.&lt;br&gt;&lt;br&gt;Games Included:&lt;br&gt;Pong, Asteroids, Tetris, Pacman, Bomberman.&lt;br&gt;&lt;br&gt;Although its hard to outline the specific topics covered in each tutorial everyone already knows these games, and each one has its own challenges, most with more than one solution.  In these cases I will try to outline my first approach and if I decided to change it, why.&lt;br&gt;&lt;br&gt;Specific Topics:&lt;br&gt;Behaviors: these are used for controlling the player, AI objects, defining oncollision results, and pretty much everying.&lt;br&gt;Tilemaps: These are used in Tetris, Pacman, and Bomberman (and every 2D game) over and over.&lt;br&gt;Physics and Collision: When to use it, and when not to.&lt;br&gt;&lt;br&gt;Current Progress:&lt;br&gt;Pong: 90% ... An optional amount of fine tuning and writting the tutorial.&lt;br&gt;Asteroids: 50% ... Rigidbody collisions working, adding bullets and particle effects.&lt;br&gt;Tetris: 50% ... Decided to change method of representing pieces so a bit of rework to do.&lt;br&gt;Pacman: 70% ... Player and ghost movement working + powerups and ghost respawing.&lt;br&gt;Bomberman: 50% Working with 1.3 but needs &amp;quot;behaviorization&amp;quot; and cleaning of spagetti code.&lt;br&gt;&lt;br&gt;Expect screenshots soon.&lt;br&gt;&lt;br&gt;I expect a couple months of work before its ready, but I'll keep you posted!</description>
	</item>
</rdf:RDF>
