root/src/BRAINSFramework/Behaviors/PathFinding/FindPathBehavior.cs

User picture

Author: conkerjo

Revision: 30 («Previous)


File Size: 2.9 KB

(July 05, 2009 18:01 UTC) Almost 3 years ago

Behavior Refactoring

 
Show/hide line numbers

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Brains.Framework.PathFinding;
using Microsoft.Xna.Framework;
using Brains.Framework.Map;

namespace Brains.Framework.Behaviors.PathFinding
{
    public class FindPathBehavior:CompositeBehavior,IActionBehavior
    {
        public object lockMe = new object();
        
        protected PathFinder pathfinder;
        protected GridCell startNode;
        protected GridCell endNode;
        public bool initialized = false;

        public PathFinder PathFinder
        {
            get { return pathfinder; }
        }

        public GridCell StartNode
        {
            get { return startNode; }
            set
            {
                startNode = value;
            }
        }

        public GridCell EndNode
        {
            get { return endNode; }
            set
            {
                endNode = value;
            }
        }

        public FindPathBehavior()
        {
            pathfinder = new PathFinder();
        }

        public override void Update(GameTime gameTime)
        {
            if (!initialized)
            {
                pathfinder.Agent = this.Owner;
                pathfinder.Grid = this.startNode.Parent;
                pathfinder.StartNode = this.startNode;
                pathfinder.EndNode = this.endNode;
                pathfinder.Reset();
                initialized = true;
            }
            else
            {
                if (pathfinder.State == PathFinderState.Idle)
                {
                    pathfinder.FindPath();
                }
            }

            for (int i = 0; i < 10; i++)
            {
                pathfinder.Iterate();
            }

            switch (pathfinder.State)
            {
                case PathFinderState.Idle:
                    this.State = BehaviorState.Idle;
                    break;
                case PathFinderState.Working:
                    this.State = BehaviorState.Running;
                    break;
                case PathFinderState.Finished:
                    this.State = BehaviorState.Success;
                    break;
                case PathFinderState.Failed:
                    this.State = BehaviorState.Failed;
                    break;
                default:
                    Exception err = new Exception("Unknown pathfinder state: " + pathfinder.State.ToString());
                    break;
            }

            // iterate subbehaviours
            base.Update(gameTime);
        }

        public override void Reset()
        {
            initialized = false;
            base.Reset();
            this.State = BehaviorState.Idle;
            pathfinder.Reset();
        }

        ~FindPathBehavior()
        {
            pathfinder = null;
        }
    }
}