root/src/AIDemos/Screens/Demos/Demo2.cs

User picture

Author: conkerjo

Revision: 30 («Previous)


File Size: 6.58 KB

(July 12, 2009 15:10 UTC) Almost 3 years ago


  

 
Show/hide line numbers
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using AIDemos;
using Microsoft.Xna.Framework.Content;
using System.Threading;
using Microsoft.Xna.Framework.Input;
using Brains.Framework;
using AIRendering;
using AIDemos.GameClasses;
using Brains;
using Brains.Framework.Behaviors;
using AIDemos.GameClasses.Behaviors;
using System.Collections;
using Brains.Framework.Map;
using Brains.Framework.Utility;

namespace AIDemos.Screens.Demos
{
    public class Demo2 : DemoGameScreen
    {

        public Demo2():base("Demo 2 - Patrol","")
        {
            TransitionOnTime = TimeSpan.FromSeconds(1.5);
            TransitionOffTime = TimeSpan.FromSeconds(0.5);
            
        }

        public override void LoadContent()
        {
            base.LoadContent();
            
            LoadAI();
            CenterCamOnMap();
            ScreenManager.Game.ResetElapsedTime();
        }
        private void LoadAI()
        {
            
            _engine.CreateWorld(new DrawableWorld());
            _engine.World.LoadMapDataFromTexture(
                content.Load<Texture2D>("DemoTextures/MAPDemo2"),
                32,
                typeof(DrawableGrid));

            AddSecretAgent();
            

        }
        class CellComparer:IComparer
        {
            
            public int Compare(object x, object y)
            {
                GridCell p1;
                GridCell p2;

                if (x is GridCell)
                    p1 = x as GridCell;
                else
                    throw new ArgumentException("Object is not of type GridCell.");

                if (y is GridCell)
                    p2 = y as GridCell;
                else
                    throw new ArgumentException("Object is not of type GridCell.");

                return p1.Labels[AIConsts.COLORR].CompareTo(p2.Labels[AIConsts.COLORR]);
            }
        }
        GameActor _secretAgent;
        private void AddSecretAgent()
        {
            //Setup the behavior
            //Find the marked green node
            IEnumerable<GridCell> cells = _engine.World.Map.AllCells.Where(
                                                    a => a.Labels[AIConsts.COLORG] == 255 &&
                                                    a.Labels[AIConsts.COLORR] < 10 && //Hack - Limit number of patrol points to 10
                                                    a.Labels[AIConsts.COLORB] == 0
                                                    );
            GridCell[] _arrayofCells = cells.ToArray<GridCell>();
            Array.Sort(_arrayofCells, new CellComparer());
            DrawableCyclicRoute _route = new DrawableCyclicRoute();
            foreach (var item in _arrayofCells)
            {
                _route.AddPoint(item);
            }
            GameActor _actor = new GameActor(_route.CellsToVisit[0].Position, 10);
            _actor.RootBehavior = _route;
            _actor.Locomotion = new Brains.Framework.Locomotion.LocomotionController();
            _actor.Locomotion.MaxRotation = MathHelper.TwoPi;
            _actor.Locomotion.MaxSpeed = 50;

            _engine.World.AddActor(_actor);
            _secretAgent = _actor;
        }
        GridCell _endNode;
        public override void UnloadContent()
        {
            content.Unload();
        }

        public override void Update(GameTime gameTime, bool otherScreenHasFocus,
                                                     bool coveredByOtherScreen)
        {
            base.Update(gameTime, otherScreenHasFocus, coveredByOtherScreen);

            if (IsActive)
            {
                _engine.Update(gameTime);
            }
        }
        MouseState _currentMouse;
        MouseState _lastMouse;
        public override void HandleInput(InputState input)
        {
            if (input == null)
                throw new ArgumentNullException("input");

            _lastMouse = _currentMouse;
            _currentMouse = Mouse.GetState();


            int playerIndex = (int)ControllingPlayer.Value;
            
            KeyboardState keyboardState = input.CurrentKeyboardStates[playerIndex];
            GamePadState gamePadState = input.CurrentGamePadStates[playerIndex];

            bool gamePadDisconnected = !gamePadState.IsConnected &&
                                       input.GamePadWasConnected[playerIndex];

            if (!gamePadDisconnected)
            {
                Vector2 mousPos = new Vector2(_currentMouse.X, _currentMouse.Y);

                if (_currentMouse.LeftButton == ButtonState.Released &&
                    _lastMouse.LeftButton == ButtonState.Pressed)
                {
                    Vector2 mapMousePos = mousPos + primitiveBatch.CameraPosition;
                    GridCell cell = _engine.World.Map.ClusterGrid.Grids[0].GetCellAtPosition(mapMousePos);
                    if (cell != null)
                    {
                        GameActor actor = new GameActor(cell.Position, 5);
                        actor.Locomotion = new Brains.Framework.Locomotion.LocomotionController();
                        actor.Locomotion.MaxSpeed = 50;
                        actor.Locomotion.MaxRotation = MathHelper.TwoPi;

                        _engine.World.AddActor(actor);
                        SequenceBehavior _sequence = new SequenceBehavior();
                        
                        DrawableBehaviorGoTo _goto = new DrawableBehaviorGoTo();
                        _goto.StartNode = cell;
                        _goto.EndNode = _secretAgent.CellsIAmIn[0];
                        _sequence.SubBehaviors.Add(_goto);
                        _sequence.SubBehaviors.Add(new DieBehavior());
                        actor.RootBehavior = _sequence;
                    }
                }

            }
            base.HandleInput(input);
        }

        public override void Draw(GameTime gameTime)
        {
            ScreenManager.GraphicsDevice.Clear(ClearOptions.Target,
                                               Color.Black, 0, 0);

            SpriteBatch spriteBatch = ScreenManager.SpriteBatch;

            spriteBatch.Begin();
            ((IRender)_engine.World).Render(primitiveBatch);
            base.Draw(gameTime);
            spriteBatch.End();

            
            if (TransitionPosition > 0)
                ScreenManager.FadeBackBufferToBlack(255 - TransitionAlpha);
        }
    }
}