예제 #1
0
        private void TreasureSeekUpdate(GameTime gameTime)
        {
            Treasure t = stage.GetClosestTreasure(agentObject.Translation);

            if (t == null)
            {
                // No more treasure. Stop Moving
                state = NPAgentState.DONE;
                return;
            }

            if (treasureNav == null || treasureNav.Translation != t.Obj.Translation)
            {
                treasureNav = new NavNode(t.Obj.Translation, NavNode.NavNodeEnum.WAYPOINT);
                agentObject.turnToFace(treasureNav.Translation);
            }

            ObjectAvoidance();

            float distance = Vector3.Distance(
                new Vector3(treasureNav.Translation.X, 0, treasureNav.Translation.Z),
                new Vector3(agentObject.Translation.X, 0, agentObject.Translation.Z));

            stage.setInfo(15, stage.agentLocation(this));
            stage.setInfo(16,
                          string.Format("          nextGoal ({0:f0}, {1:f0}, {2:f0})  distance to next goal = {3,5:f2})",
                                        treasureNav.Translation.X / stage.Spacing, treasureNav.Translation.Y, treasureNav.Translation.Z / stage.Spacing, distance));
            // Add in the bounding sphere radius to make distance 200 from edge of bounding box instead of 200 from center of object
            if (distance <= (tagDistance + t.BoundingSphereRadius))
            {
                //Tag the treasure so it can't be found again.
                stage.TagTreasure(t, this);
                this.treasuresFound++;
                //Found treasure, stop seeking and switch states.
                treasureNav = null;

                Treasure anyMore = stage.GetClosestTreasure(agentObject.Translation);
                if (anyMore != null)
                {
                    state = NPAgentState.PATH_SEEK;
                    // snap to nextGoal and orient toward the new nextGoal
                    agentObject.turnToFace(nextGoal.Translation);
                }
                else
                {
                    state = NPAgentState.DONE;
                }
            }
        }
예제 #2
0
        public Treasures(Stage theStage, string label, string meshFile) : base(theStage, label, meshFile)
        {
            isCollidable = true;
            int     spacing = stage.Terrain.Spacing;
            Terrain terrain = stage.Terrain;

            treasureList    = new Treasure[numberOfTreasures];
            treasureList[0] = new Treasure(447, 453);
            treasureList[1] = new Treasure(320, 320);
            treasureList[2] = new Treasure(480, 320);
            treasureList[3] = new Treasure(400, 490);

            for (int i = 0; i < treasureList.Length; i++)
            {
                addObject(new Vector3(treasureList[i].getXPos() * spacing, terrain.surfaceHeight((int)treasureList[i].getXPos(),
                                                                                                 (int)treasureList[i].getZPos()), treasureList[i].getZPos() * spacing), Vector3.Up, 0.0f);
            }
        }
예제 #3
0
        /// <summary>
        /// Handle player input that affects the player.
        /// See Stage.Update(...) for handling user input that affects
        /// how the stage is rendered.
        /// First check if gamepad is connected, if true use gamepad
        /// otherwise assume and use keyboard.
        /// </summary>
        /// <param name="gameTime"></param>
        public override void Update(GameTime gameTime)
        {
            KeyboardState keyboardState = Keyboard.GetState();

            if (keyboardState.IsKeyDown(Keys.R) && !oldKeyboardState.IsKeyDown(Keys.R))
            {
                agentObject.Orientation = initialOrientation;
            }
            // allow more than one keyboardState to be pressed
            if (keyboardState.IsKeyDown(Keys.Up))
            {
                agentObject.Step++;
            }
            if (keyboardState.IsKeyDown(Keys.Down))
            {
                agentObject.Step--;
            }
            if (keyboardState.IsKeyDown(Keys.Left))
            {
                rotate++;
            }
            if (keyboardState.IsKeyDown(Keys.Right))
            {
                rotate--;
            }
            oldKeyboardState = keyboardState;    // Update saved state.
            agentObject.Yaw  = rotate * angle;

            Treasure t = stage.GetClosestTreasure(agentObject.Translation);

            if (t != null)
            {
                float distance = Vector3.Distance(agentObject.Translation, t.Obj.Translation);
                if (distance < distanceToTagTreasure + t.BoundingSphereRadius)
                {
                    stage.TagTreasure(t, this);
                    this.treasuresFound++;
                }
            }

            base.Update(gameTime);
            rotate = agentObject.Step = 0;
        }
예제 #4
0
        internal Treasure GetClosestTreasure(Vector3 translation)
        {
            // Set distance to Maximum, find the closest untagged treasure
            float    closestDistance = float.MaxValue;
            Treasure closestTreasure = null;

            // Find closest treasure
            foreach (Treasure t in Treasures)
            {
                float distanceToTreasure = Vector3.Distance(translation, t.Obj.Translation);
                if (distanceToTreasure < closestDistance && !t.IsTagged())
                {
                    closestDistance = distanceToTreasure;
                    closestTreasure = t;
                }
            }

            return(closestTreasure);
        }
예제 #5
0
        /// <summary>
        /// Set GraphicDevice display and rendering BasicEffect effect.
        /// Create SpriteBatch, font, and font positions.
        /// Creates the traceViewport to display information and the sceneViewport
        /// to render the environment.
        /// Create and add all DrawableGameComponents and Cameras.
        /// First, add all required contest:  Inspector, Cameras, Terrain, Agents
        /// Second, add all optional (scene specific) content
        /// </summary>
        protected override void LoadContent()
        {
            display = graphics.GraphicsDevice;
            effect  = new BasicEffect(display);
            // Set up Inspector display
            spriteBatch   = new SpriteBatch(display);              // Create a new SpriteBatch
            inspectorFont = Content.Load <SpriteFont>("Consolas"); // Windows XNA && MonoGames
                                                                   // set window size
            graphics.PreferredBackBufferWidth  = windowWidth;
            graphics.PreferredBackBufferHeight = windowHeight;

            graphics.ApplyChanges();
            // viewports
            defaultViewport          = GraphicsDevice.Viewport;
            inspectorViewport        = defaultViewport;
            sceneViewport            = defaultViewport;
            inspectorViewport.Height = InfoPaneSize * inspectorFont.LineSpacing;
            inspectorProjection      = Matrix.CreatePerspectiveFieldOfView(fov,
                                                                           inspectorViewport.Width / inspectorViewport.Height, hither, yon);
            sceneViewport.Height = defaultViewport.Height - inspectorViewport.Height;
            sceneViewport.Y      = inspectorViewport.Height;
            sceneProjection      = Matrix.CreatePerspectiveFieldOfView(fov,
                                                                       sceneViewport.Width / sceneViewport.Height, hither, yon);
            // create Inspector display
            Texture2D inspectorBackground = Content.Load <Texture2D>("inspectorBackground");

            inspector = new Inspector(display, inspectorViewport, inspectorFont, Color.Black, inspectorBackground);
            // create information display strings
            // help strings
            inspector.setInfo(0, "Academic Graphics MonoGames 3.6 Starter Kit for CSUN Comp 565 assignments.");
            inspector.setInfo(1, "Press keyboard for input (not case sensitive 'H' || 'h')   'Esc' to quit");
            inspector.setInfo(2, "Inspector toggles:  'H' help or info   'M'  matrix or info   'I'  displays next info pane.");
            inspector.setInfo(3, "Arrow keys move the player in, out, left, or right.  'R' resets player to initial orientation.");
            inspector.setInfo(4, "Stage toggles:  'B' bounding spheres, 'C' || 'X' cameras, 'T' fixed updates");
            // initialize empty info strings
            for (int i = 5; i < 20; i++)
            {
                inspector.setInfo(i, "  ");
            }
            // set blending for bounding sphere drawing
            blending = new BlendState();
            blending.ColorSourceBlend      = Blend.SourceAlpha;
            blending.ColorDestinationBlend = Blend.InverseSourceAlpha;
            blending.ColorBlendFunction    = BlendFunction.Add;
            notBlending = new BlendState();
            notBlending = display.BlendState;
            // Create and add stage components
            // You must have a TopDownCamera, BoundingSphere3D, WayPoint3D, Terrain, and Agents (player, npAgent) in your stage!
            // Place objects at a position, provide rotation axis and rotation radians.
            // All location vectors are specified relative to the center of the stage.
            // Create a top-down "Whole stage" camera view, make it first camera in collection.
            topDownCamera = new Camera(this, Camera.CameraEnum.TopDownCamera);
            camera.Add(topDownCamera);
            boundingSphere3D = Content.Load <Model>("boundingSphereV8");
            wayPoint3D       = Content.Load <Model>("100x50x100Marker"); // model for navigation node display
                                                                         // Create required entities:
            collidable = new List <Object3D>();                          // collection of objects to test for collisions
            terrain    = new Terrain(this, "terrain", "HongyouAdded/heightTexture", "HongyouAdded/colorTexture");
            Components.Add(terrain);
            // Load Agent mesh objects, meshes do not have textures
            player = new Player(this, "Chaser",
                                new Vector3(510 * spacing, terrain.surfaceHeight(510, 507), 507 * spacing),
                                new Vector3(0, 1, 0), 0.78f, "redAvatarV6"); // face looking diagonally across stage
            player.IsCollidable = true;                                      // test collisions for player
            Components.Add(player);
            npAgent = new NPAgent(this, "Evader",
                                  new Vector3(490 * spacing, terrain.surfaceHeight(490, 450), 450 * spacing),
                                  new Vector3(0, 1, 0), 0.0f, "magentaAvatarV6"); // facing +Z
            npAgent.IsCollidable = true;                                          // npAgent does not test for collisions
            Components.Add(npAgent);
            // create file output stream for trace()
            fout  = new StreamWriter("trace.txt", false);
            Trace = string.Format("{0} trace output from AGMGSKv8", DateTime.Today.ToString("MMMM dd, yyyy"));
            //  ------ The wall and pack are required for Comp 565 projects, but not AGMGSK   ---------
            // create walls for navigation algorithms
            Wall wall = new Wall(this, "wall", "100x100x100Brick");

            Components.Add(wall);
            // create a pack for "flocking" algorithms
            // create a Pack of 6 dogs centered at (450, 500) that is leaderless
            Pack pack = new Pack(this, "dog", "dogV6", 6, 450, 430, player.AgentObject);

            Components.Add(pack);

            // ---------------------------------------------------
            // ----------- MY CONTENT HERE -----------------------
            // ---------------------------------------------------
            inspector.setInfo(20, "Lerp is currently not active");
            inspector.setInfo(21, "Treasure Seeking mode is off");

            //Treasures (4 of them)
            Treasure t1 = new Treasure(this, "treasure_box_1", "HongyouAdded/TreasureBox1", 444, 454);

            treasures.Add(t1);
            Components.Add(t1);

            Treasure t2 = new Treasure(this, "treasure_box_2", "HongyouAdded/TreasureBox2", 502, 451);

            treasures.Add(t2);
            Components.Add(t2);

            Treasure t3 = new Treasure(this, "treasure_box_3", "HongyouAdded/TreasureBox3", 398, 110);

            treasures.Add(t3);
            Components.Add(t3);

            Treasure t4 = new Treasure(this, "treasure_box_4", "HongyouAdded/TreasureBox4", 328, 139);

            treasures.Add(t4);
            Components.Add(t4);

            //Shrubs (300 of them)
            Bushes bushes = new Bushes(this, "Bush", "HongyouAdded/Bush", 300);

            Components.Add(bushes);

            //Huts (10 of them)
            Huts huts = new Huts(this, "hut", "HongyouAdded/Hut", 10);

            Components.Add(huts);

            ObstacleHuts obstacles = new ObstacleHuts(this, "hut", "HongyouAdded/Hut");

            Components.Add(obstacles);

            // --------------------------------------------------
            // ----------- MY CONTENT END -----------------------
            // --------------------------------------------------

            // create a temple
            Model3D m3d = new Model3D(this, "temple", "templeV3");

            m3d.IsCollidable = true;                    // must be set before addObject(...) and Model3D doesn't set it
            m3d.addObject(new Vector3(340 * spacing, terrain.surfaceHeight(340, 340), 340 * spacing),
                          new Vector3(0, 1, 0), 0.79f); // , new Vector3(1, 4, 1));
            Components.Add(m3d);
            // create 20 clouds
            Cloud cloud = new Cloud(this, "cloud", "cloudV3", 20);

            // Set initial camera and projection matrix
            setCamera(1);  // select the "whole stage" camera
            Components.Add(cloud);
            // Describe the scene created
            Trace = string.Format("scene created:");
            Trace = string.Format("\t {0,4:d} components", Components.Count);
            Trace = string.Format("\t {0,4:d} collidable objects", Collidable.Count);
            Trace = string.Format("\t {0,4:d} cameras", camera.Count);
        }
예제 #6
0
 internal void TagTreasure(Treasure t, Agent a)
 {
     t.Tag(a);
     Components.Remove(t);
 }