public void Update(float dt) { Position = entity.Position; Rotation = entity.Orientation; //Check out distance from the node at the front of the pathway float NodeDistance = Vector3.Distance(entity.Position, EntityPath[0].NodeLocation); //Once we are close enough to the next node, then we remove it from the list and proceed to the next one if (NodeDistance <= 0.05f) { //If we have reached the final node in the path, then we want to calculate a new path back were we just came from if (EntityPath.Count == 1) { if (PreviousTargetNode == EndNode) { EntityPath = AStarSearch.FindPath(EndNode, StartNode, new Vector2(9, 9)); PreviousTargetNode = StartNode; } else { EntityPath = AStarSearch.FindPath(StartNode, EndNode, new Vector2(9, 9)); PreviousTargetNode = EndNode; } } //Otherwise we remove this node from the list and move to the next one EntityPath.Remove(EntityPath[0]); } //Continue on towards out current target pathTime += Globals.space.TimeStepSettings.TimeStepDuration; mover.TargetPosition = EntityPath[0].NodeLocation; }
public FSMEntity(Vector3 StartPosition, Vector3 EndPosition) { StartNode = NavMeshNodes.GetNearbyMeshNode(StartPosition); EndNode = NavMeshNodes.GetNearbyMeshNode(EndPosition); EntityPath = AStarSearch.FindPath(StartNode, EndNode, new Vector2(9, 9)); PreviousTargetNode = EndNode; Position = StartPosition; entity = new Entity(new Box(StartPosition, 1, 1, 1, 1).CollisionInformation, 1); entity.Position = StartPosition; Globals.space.Add(entity); Globals.game.ModelDrawer.Add(entity); mover = new EntityMover(entity); rotator = new EntityRotator(entity); Globals.space.Add(mover); Globals.space.Add(rotator); }
//public ServerEntity WaypointTest; public WorldSimulator(WorldRenderer game) { Game = game; parallelLooper = new ParallelLooper(); if (Environment.ProcessorCount > 1) { for (int i = 0; i < Environment.ProcessorCount; i++) { parallelLooper.AddThread(); } } Globals.space = new Space(parallelLooper); game.Camera.LockedUp = Vector3.Up; game.Camera.ViewDirection = new Vector3(0, -1.5f, 1); game.Camera.Position = new Vector3(-19.55f, 39.25f, -10.35f); ServerCamera = new FreeCamera(100, game.Camera, game); //Add some force of gravity to the simulation Globals.space.ForceUpdater.Gravity = new Vector3(0, -9.81f, 0); //Load the world terrain mesh data Vector3[] TerrainVertices; int[] TerrainIndices; Model TerrainCollision = Globals.game.Content.Load <Model>("LowDetailTerrain"); ModelDataExtractor.GetVerticesAndIndicesFromModel(TerrainCollision, out TerrainVertices, out TerrainIndices); StaticMesh TerrainMesh = new StaticMesh(TerrainVertices, TerrainIndices, new AffineTransform(new Vector3(0, 0, 0))); Globals.TerrainVerts = TerrainVertices; Globals.TerrainInds = TerrainIndices; Globals.space.Add(TerrainMesh); Globals.game.ModelDrawer.Add(TerrainMesh); //Create a new mesh node object for each unique location in the navigation mesh for (int i = 0; i < Globals.TerrainVerts.Length; i++) { //Dont create mesh nodes at locations already been used if (!NavMeshNodes.IsLocationAvailable(Globals.TerrainVerts[i])) { continue; } //Add a new mesh node object to every other space in the terrain verts that we find to be available NavMeshNodes.AddNode(new NavMeshNode(Globals.TerrainVerts[i])); } //Now sort all of the mesh nodes into a dictionary sorted by their index in the level //Start with the first column of mesh nodes for (int i = 1; i < 10; i++) { Vector2 MeshIndex = new Vector2(i, 1); int MeshNodeIndex = (i - 1) * 2; NavMeshNode MeshNode = NavMeshNodes.MeshNodes[MeshNodeIndex]; NavMeshDictionary.AddNode(MeshNode, MeshIndex); } //Then the second column of mesh nodes int CurrentNodeIndex = 1; for (int i = 1; i < 10; i++) { Vector2 MeshIndex = new Vector2(i, 2); int NodeIndex = CurrentNodeIndex; CurrentNodeIndex += 2; NavMeshNode MeshNode = NavMeshNodes.MeshNodes[NodeIndex]; MeshNode.NodeIndex = MeshIndex; NavMeshDictionary.AddNode(MeshNode, MeshIndex); } //Add the other remaining columns int ListIndex = 18; for (int Column = 3; Column < 10; Column++) { for (int j = 1; j < 10; j++) { Vector2 MeshIndex = new Vector2(j, Column); NavMeshNode MeshNode = NavMeshNodes.MeshNodes[ListIndex]; MeshNode.NodeIndex = MeshIndex; ListIndex++; NavMeshDictionary.AddNode(MeshNode, MeshIndex); } } //Add two game entities into the scene, the first entity will pathfind its way to the 2nd entity PrincessFox = new GameEntity(new Vector3(-17.74f, 2.15f, 10.54f)); PrincessTarget = new GameEntity(new Vector3(-41.17f, 0.89f, 24.15f)); //Figure out which node each of these entities is closest two, these will be the ends of the pathway NavMeshNode StartNode = NavMeshDictionary.MeshDictionary[new Vector2(3, 4)]; NavMeshNode EndNode = NavMeshDictionary.MeshDictionary[new Vector2(7, 8)]; //Find our pathway between the two entities List <NavMeshNode> NodePath = AStarSearch.FindPath(StartNode, EndNode, new Vector2(9, 9)); //Now assign this path to the princess fox entity and have her navigate along to reach her target }