Jump to content
  • entries
    10
  • comments
    21
  • views
    22,127

What a behviour code segment looks like behind the previous strange code


Chris Paulson

1,108 views

 Share

In a previous blog entry I showed a code sample of the behaviour tree. In the code below is the code that is fired for each behaviour.

 

The return status mean: -

 

RUNNING - Keep on running the behaviour

FAILED - Exit this behaviour with error (has different effect depending on sequeance/selector/parallel node.

COMPLETE - Exit this behaviour with complete (has different effect depending on sequeance/selector/parallel node.

 

 

 

#include "actor/include/action.h"

#include <alive/TreeBuilder.h>
#include <alive/engine/ConstantNode.h>
#include <alive/tree/Parallel.h>
#include <alive/tree/Repeat.h>
#include <alive/tree/ErrorHandler.h>

void SpatialAction::setup(Pedestrian& ped, Vision& vis, ActorGun& rifle)
{
m_pedestrian = &ped;
m_vision = &vis;
m_rifle = &rifle;
}

void SpatialAction::init()
{
   m_pedestrian = NULL;
m_Observer.BIND(SpatialAction, this, stop);
}
// Moves the actor to the nearest enemy
alive::Status ActionMoveToEnemy::execute()
{
   if (m_pedestrian == 0)
   {
       return FAILED;
   }
   if (m_vision == 0)
   {
       return FAILED;
   }
m_pedestrian->currentAction += "ActionMoveToEnemy,";
if (m_pedestrian->moveToPosition( m_vision->m_lastSeenPos ))
	return RUNNING;
else
	return FAILED; 
}
void ActionMoveToEnemy::stop(alive::Status)
{
m_pedestrian->stopMove();
}

alive::Status ActionStopMove::execute()
{
m_pedestrian->stop();
if(m_pedestrian->moveStatus == MOVE_IDLE)
	return COMPLETED;
return RUNNING;
}

alive::Status hasGun::execute()
{
if( (m_rifle != NULL) == m_Settings.getEquals())
{
	m_pedestrian->currentAction += "hasGun,";
	return COMPLETED;
}
return FAILED;
}

alive::Status WithinFiringRange::execute()
{
if(!m_rifle)
{
	// If no rifle I'm not in firing range
	if (!m_Settings.getEquals())
		return RUNNING;
	else
		return RUNNING;
}

if( m_rifle->withinRange( m_vision->distanceToEnemy() ) == m_Settings.getEquals())
{
	m_pedestrian->currentAction += "WithinFiringRange,";
	return RUNNING;
}
return FAILED;
}

// Moves the actor to the next waypoint
alive::Status ActionMoveToWaypoint::execute()
{
   if (m_pedestrian == 0)
   {
       return FAILED;
   }
m_pedestrian->currentAction += "ActionMoveToWaypoint,";
if (m_pedestrian->moveToNextWaypoint())
	return RUNNING;
else
	return COMPLETED; 
}

void ActionMoveToWaypoint::stop(alive::Status)
{
m_pedestrian->stopMove();
}

alive::Status ActionCurrentMode::execute()
{
m_pedestrian->currentMode = m_Settings.getmode();
return COMPLETED; 
}

void AimAtEnemy::init()
{
}

alive::Status LookForward::execute()
{
m_pedestrian->currentAction += "LookForward,";
if (m_pedestrian->anim->m_bodyControl->needToReset( BONE_SPINE ) )
{
	m_pedestrian->anim->m_bodyControl->reset( BONE_SPINE );
	return RUNNING;
}
if(m_Settings.getParallel())
	return RUNNING;
else
	return COMPLETED;
}

 

This isn't the complete code but it might help people get a feel.

 Share

0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...