From ef9d7ef0d444c2849222a3311ff73bd6e5b62395 Mon Sep 17 00:00:00 2001 From: Regalis11 Date: Sun, 15 Nov 2015 19:14:08 +0200 Subject: [PATCH] WIP pathfinding AI navigator, Level class refactoring --- .vs/Subsurface_Solution/v14/.suo | Bin 735744 -> 706560 bytes Subsurface/Barotrauma.csproj | 2 + .../Source/Characters/AI/AIController.cs | 7 +- .../Characters/AI/Objectives/AIObjective.cs | 2 +- .../Characters/AI/PathSteeringManager.cs | 62 ++++++++++ .../Source/Characters/AI/SteeringManager.cs | 16 +-- .../Source/Characters/AI/SteeringPath.cs | 4 +- Subsurface/Source/Map/Levels/Level.cs | 116 +++++------------- Subsurface/Source/Map/Levels/LevelRenderer.cs | 93 ++++++++++++++ Subsurface/Source/Map/Levels/WrappingWall.cs | 3 +- Subsurface/Source/Map/Map.cs | 1 - 11 files changed, 199 insertions(+), 107 deletions(-) create mode 100644 Subsurface/Source/Characters/AI/PathSteeringManager.cs create mode 100644 Subsurface/Source/Map/Levels/LevelRenderer.cs diff --git a/.vs/Subsurface_Solution/v14/.suo b/.vs/Subsurface_Solution/v14/.suo index 25aff956228d78e6f45b74d8f3ddcd6b80cc2344..da95ab367de4ec2c8cc19e873697dd363e90ec95 100644 GIT binary patch delta 13451 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 ZVCGv3j
    7FGSo9cJys@pwn+{{bxK7Y6_U delta 9501 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 diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index d268371f8..1eed57d21 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -63,6 +63,7 @@ + @@ -101,6 +102,7 @@ + diff --git a/Subsurface/Source/Characters/AI/AIController.cs b/Subsurface/Source/Characters/AI/AIController.cs index 77fff925b..5ecd56a8b 100644 --- a/Subsurface/Source/Characters/AI/AIController.cs +++ b/Subsurface/Source/Characters/AI/AIController.cs @@ -10,7 +10,7 @@ namespace Barotrauma public enum AiState { None, Attack, GoTo, Escape } public enum SteeringState { Wander, Seek, Escape } - public Character Character; + public readonly Character Character; protected AiState state; @@ -45,10 +45,7 @@ namespace Barotrauma steeringManager = new SteeringManager(this); } - public virtual void DebugDraw(SpriteBatch spriteBatch) - { - - } + public virtual void DebugDraw(SpriteBatch spriteBatch) { } public virtual void OnAttacked(IDamageable attacker, float amount) { } diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjective.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjective.cs index f073fb06a..e00457bb8 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjective.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjective.cs @@ -11,7 +11,7 @@ namespace Barotrauma public virtual bool IsCompleted() { - return true; + return false; } public AIObjective() diff --git a/Subsurface/Source/Characters/AI/PathSteeringManager.cs b/Subsurface/Source/Characters/AI/PathSteeringManager.cs new file mode 100644 index 000000000..333fcbc81 --- /dev/null +++ b/Subsurface/Source/Characters/AI/PathSteeringManager.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.Xna.Framework; +using FarseerPhysics; + +namespace Barotrauma +{ + class PathSteeringManager : SteeringManager + { + private PathFinder pathFinder; + private SteeringPath currentPath; + + private Vector2 currentTarget; + + private float findPathTimer; + + public PathSteeringManager(ISteerable host) + : base(host) + {} + + public override void Update(float speed = 1) + { + base.Update(speed); + + findPathTimer -= 1.0f / 60.0f; + } + + + protected override Vector2 DoSteeringSeek(Vector2 target, float speed = 1) + { + //find a new path if one hasn't been found yet or the target is different from the current target + if (currentPath == null || Vector2.DistanceSquared(target, currentTarget)>10.0f) + { + if (findPathTimer > 0.0f) return Vector2.Zero; + + currentTarget = target; + currentPath = pathFinder.FindPath(ConvertUnits.ToDisplayUnits(host.SimPosition), target); + + findPathTimer = 1.0f; + + return DiffToCurrentNode(); + } + + Vector2 diff = DiffToCurrentNode(); + + return (diff == Vector2.Zero) ? Vector2.Zero : Vector2.Normalize(diff)*speed; + } + + private Vector2 DiffToCurrentNode() + { + if (currentPath == null) return Vector2.Zero; + + currentPath.CheckProgress(host.SimPosition, 0.1f); + + if (currentPath.CurrentNode == null) return Vector2.Zero; + + return currentPath.CurrentNode.SimPosition - host.SimPosition; + } + } +} diff --git a/Subsurface/Source/Characters/AI/SteeringManager.cs b/Subsurface/Source/Characters/AI/SteeringManager.cs index 9352195fa..30a447b00 100644 --- a/Subsurface/Source/Characters/AI/SteeringManager.cs +++ b/Subsurface/Source/Characters/AI/SteeringManager.cs @@ -6,12 +6,12 @@ namespace Barotrauma { class SteeringManager { - private const float CircleDistance = 2.5f; - private const float CircleRadius = 0.3f; + protected const float CircleDistance = 2.5f; + protected const float CircleRadius = 0.3f; - private const float RayCastInterval = 0.5f; + protected const float RayCastInterval = 0.5f; - private ISteerable host; + protected ISteerable host; private Vector2 steering; @@ -50,7 +50,7 @@ namespace Barotrauma steering += DoSteeringAvoid(deltaTime, speed); } - public void Update(float speed = 1.0f) + public virtual void Update(float speed = 1.0f) { float steeringSpeed = steering.Length(); if (steeringSpeed>speed) @@ -61,7 +61,7 @@ namespace Barotrauma host.Steering = steering; } - private Vector2 DoSteeringSeek(Vector2 target, float speed = 1.0f) + protected virtual Vector2 DoSteeringSeek(Vector2 target, float speed = 1.0f) { Vector2 targetVel = target - host.SimPosition; @@ -81,7 +81,7 @@ namespace Barotrauma return newSteering; } - private Vector2 DoSteeringWander(float speed = 1.0f) + protected virtual Vector2 DoSteeringWander(float speed = 1.0f) { Vector2 circleCenter = (host.Velocity == Vector2.Zero) ? new Vector2(speed, 0.0f) : host.Velocity; circleCenter = Vector2.Normalize(circleCenter) * CircleDistance; @@ -105,7 +105,7 @@ namespace Barotrauma return newSteering; } - private Vector2 DoSteeringAvoid(float deltaTime, float speed = 1.0f) + protected virtual Vector2 DoSteeringAvoid(float deltaTime, float speed = 1.0f) { if (steering == Vector2.Zero || host.Steering == Vector2.Zero) return Vector2.Zero; diff --git a/Subsurface/Source/Characters/AI/SteeringPath.cs b/Subsurface/Source/Characters/AI/SteeringPath.cs index bfe4b0b35..e52f748a7 100644 --- a/Subsurface/Source/Characters/AI/SteeringPath.cs +++ b/Subsurface/Source/Characters/AI/SteeringPath.cs @@ -48,10 +48,10 @@ namespace Barotrauma currentIndex++; } - public WayPoint CheckProgress(Vector2 pos, float minSimDistance = 0.1f) + public WayPoint CheckProgress(Vector2 simPosition, float minSimDistance = 0.1f) { if (nodes.Count == 0 || currentIndex>nodes.Count-1) return null; - if (Vector2.Distance(pos, nodes[currentIndex].SimPosition) < minSimDistance) currentIndex++; + if (Vector2.Distance(simPosition, nodes[currentIndex].SimPosition) < minSimDistance) currentIndex++; return CurrentNode; } diff --git a/Subsurface/Source/Map/Levels/Level.cs b/Subsurface/Source/Map/Levels/Level.cs index 95f3aa857..98455b9cc 100644 --- a/Subsurface/Source/Map/Levels/Level.cs +++ b/Subsurface/Source/Map/Levels/Level.cs @@ -21,7 +21,7 @@ namespace Barotrauma static Level loaded; - private static Texture2D shaftTexture; + private LevelRenderer renderer; //how close the sub has to be to start/endposition to exit const float ExitDistance = 6000.0f; @@ -40,13 +40,10 @@ namespace Barotrauma //List bodies; private List cells; - private static BasicEffect basicEffect; - private VertexPositionTexture[] vertices; //private VertexBuffer vertexBuffer; - private Vector2 startPosition; - private Vector2 endPosition; + private Vector2 startPosition, endPosition; private Rectangle borders; @@ -94,6 +91,11 @@ namespace Barotrauma get { return positionsOfInterest; } } + public WrappingWall[,] WrappingWalls + { + get { return wrappingWalls; } + } + public string Seed { get { return seed; } @@ -107,18 +109,6 @@ namespace Barotrauma public Level(string seed, float difficulty, int width, int height, int siteInterval) { - if (shaftTexture == null) shaftTexture = TextureLoader.FromFile("Content/Map/shaft.png"); - - if (basicEffect==null) - { - - basicEffect = new BasicEffect(GameMain.CurrGraphicsDevice); - basicEffect.VertexColorEnabled = false; - - basicEffect.TextureEnabled = true; - basicEffect.Texture = TextureLoader.FromFile("Content/Map/iceSurface.png"); - } - this.seed = seed; this.siteInterval = siteInterval; @@ -150,13 +140,12 @@ namespace Barotrauma Stopwatch sw = new Stopwatch(); sw.Start(); - if (loaded != null) - { - loaded.Unload(); - } - + if (loaded != null) loaded.Unload(); + loaded = this; + renderer = new LevelRenderer(this); + Voronoi voronoi = new Voronoi(1.0); List sites = new List(); @@ -391,7 +380,10 @@ namespace Barotrauma endPosition = temp; } + Debug.WriteLine("**********************************************************************************"); Debug.WriteLine("Generated a map with " + sites.Count + " sites in " + sw.ElapsedMilliseconds + " ms"); + Debug.WriteLine("Seed: "+seed); + Debug.WriteLine("**********************************************************************************"); } private List GeneratePath(List points, List cells, Microsoft.Xna.Framework.Rectangle limits, float minWidth, float wanderAmount = 0.3f, bool mirror=false, bool placeWaypoints=false) @@ -821,6 +813,15 @@ namespace Barotrauma } } + public void Draw(SpriteBatch spriteBatch) + { + renderer.Draw(spriteBatch); + } + + public void Render(GraphicsDevice graphicsDevice, Camera cam) + { + renderer.Render(graphicsDevice, cam, vertices); + } public void DebugCheckPos() @@ -841,26 +842,6 @@ namespace Barotrauma System.Diagnostics.Debug.WriteLine("pos: " + Position); } - public void Draw(SpriteBatch spriteBatch) - { - Vector2 pos = endPosition; - pos.Y = -pos.Y - Position.Y; - - if (GameMain.GameScreen.Cam.WorldView.Y < -pos.Y-512) return; - - pos.X = GameMain.GameScreen.Cam.WorldView.X-512.0f; - //pos.X += Position.X % 512; - - int width = (int)(Math.Ceiling(GameMain.GameScreen.Cam.WorldView.Width/512.0f + 2.0f)*512.0f); - - spriteBatch.Draw(shaftTexture, - new Rectangle((int)(MathUtils.Round(pos.X, 512.0f) + Position.X % 512) , (int)pos.Y, width, 512), - new Rectangle(0, 0, width, 256), - Color.White, 0.0f, - Vector2.Zero, - SpriteEffects.None, 0.0f); - } - public List GetCells(Vector2 pos, int searchDepth = 2) { int gridPosX = (int)Math.Floor(pos.X / GridCellWidth); @@ -907,7 +888,6 @@ namespace Barotrauma public List GetCellEdges(Vector2 refPos, int searchDepth = 2, bool onlySolid = true) { - int gridPosX = (int)Math.Floor(refPos.X / GridCellWidth); int gridPosY = (int)Math.Floor(refPos.Y / GridCellWidth); @@ -928,6 +908,7 @@ namespace Barotrauma for (int i = 0; i < cell.edges.Count; i++) { if (onlySolid && !cell.edges[i].isSolid) continue; + Vector2 start = cell.edges[i].point1 + Position; start.Y = -start.Y; @@ -949,13 +930,14 @@ namespace Barotrauma foreach (VoronoiCell cell in wrappingWalls[side, n].Cells) { + Vector2 offset = wrappingWalls[side, n].Offset + Position; for (int i = 0; i < cell.edges.Count; i++) { if (onlySolid && !cell.edges[i].isSolid) continue; - Vector2 start = cell.edges[i].point1 + Position; + Vector2 start = cell.edges[i].point1 + offset; start.Y = -start.Y; - Vector2 end = cell.edges[i].point2 + Position; + Vector2 end = cell.edges[i].point2 + offset; end.Y = -end.Y; edges.Add(new Vector2[] { start, end }); @@ -967,51 +949,9 @@ namespace Barotrauma return edges; } - public void Render(GraphicsDevice graphicsDevice, Camera cam) - { - if (vertices == null) return; - if (vertices.Length <= 0) return; - - basicEffect.World = Matrix.CreateTranslation(new Vector3(Position, 0.0f)) * cam.ShaderTransform - * Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f; - - basicEffect.CurrentTechnique.Passes[0].Apply(); - - graphicsDevice.SamplerStates[0] = SamplerState.LinearWrap; - - graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, (int)Math.Floor(vertices.Length / 3.0f)); - - - for (int side = 0; side < 2; side++) - { - for (int i = 0; i < 2; i++) - { - basicEffect.World = Matrix.CreateTranslation(new Vector3(Position + wrappingWalls[side, i].Offset, 0.0f)) * cam.ShaderTransform - * Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f; - - basicEffect.CurrentTechnique.Passes[0].Apply(); - - graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, - wrappingWalls[side, i].Vertices, 0, (int)Math.Floor(wrappingWalls[side, i].Vertices.Length / 3.0f)); - - } - } - } - private void Unload() { - //position = Vector2.Zero; - - //foreach (VoronoiCell cell in cells) - //{ - // //foreach (Body b in cell.bodies) - // //{ - // Game1.world.RemoveBody(cell.body); - // //} - //} - - - //bodies = null; + renderer = null; vertices = null; diff --git a/Subsurface/Source/Map/Levels/LevelRenderer.cs b/Subsurface/Source/Map/Levels/LevelRenderer.cs new file mode 100644 index 000000000..c51393cae --- /dev/null +++ b/Subsurface/Source/Map/Levels/LevelRenderer.cs @@ -0,0 +1,93 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Barotrauma +{ + class LevelRenderer + { + + private static BasicEffect basicEffect; + + private static Texture2D shaftTexture; + + private Level level; + + public LevelRenderer(Level level) + { + if (shaftTexture == null) shaftTexture = TextureLoader.FromFile("Content/Map/shaft.png"); + + if (basicEffect == null) + { + + basicEffect = new BasicEffect(GameMain.CurrGraphicsDevice); + basicEffect.VertexColorEnabled = false; + + basicEffect.TextureEnabled = true; + basicEffect.Texture = TextureLoader.FromFile("Content/Map/iceSurface.png"); + } + + this.level = level; + } + + public void Draw(SpriteBatch spriteBatch) + { + Vector2 pos = level.EndPosition; + pos.Y = -pos.Y - level.Position.Y; + + if (GameMain.GameScreen.Cam.WorldView.Y < -pos.Y - 512) return; + + pos.X = GameMain.GameScreen.Cam.WorldView.X - 512.0f; + //pos.X += Position.X % 512; + + int width = (int)(Math.Ceiling(GameMain.GameScreen.Cam.WorldView.Width / 512.0f + 2.0f) * 512.0f); + + spriteBatch.Draw(shaftTexture, + new Rectangle((int)(MathUtils.Round(pos.X, 512.0f) + level.Position.X % 512), (int)pos.Y, width, 512), + new Rectangle(0, 0, width, 256), + Color.White, 0.0f, + Vector2.Zero, + SpriteEffects.None, 0.0f); + } + + + public void Render(GraphicsDevice graphicsDevice, Camera cam, VertexPositionTexture[] vertices) + { + if (vertices == null) return; + if (vertices.Length <= 0) return; + + basicEffect.World = Matrix.CreateTranslation(new Vector3(level.Position, 0.0f)) * cam.ShaderTransform + * Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f; + + basicEffect.CurrentTechnique.Passes[0].Apply(); + + graphicsDevice.SamplerStates[0] = SamplerState.LinearWrap; + + graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, (int)Math.Floor(vertices.Length / 3.0f)); + + + for (int side = 0; side < 2; side++) + { + for (int i = 0; i < 2; i++) + { + basicEffect.World = Matrix.CreateTranslation( + new Vector3(level.Position + level.WrappingWalls[side, i].Offset, 0.0f)) * + cam.ShaderTransform * + Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f; + + basicEffect.CurrentTechnique.Passes[0].Apply(); + + graphicsDevice.DrawUserPrimitives( + PrimitiveType.TriangleList, + level.WrappingWalls[side, i].Vertices, 0, + (int)Math.Floor(level.WrappingWalls[side, i].Vertices.Length / 3.0f)); + + } + } + } + + } +} diff --git a/Subsurface/Source/Map/Levels/WrappingWall.cs b/Subsurface/Source/Map/Levels/WrappingWall.cs index 80f0fef83..65314d417 100644 --- a/Subsurface/Source/Map/Levels/WrappingWall.cs +++ b/Subsurface/Source/Map/Levels/WrappingWall.cs @@ -149,8 +149,8 @@ namespace Barotrauma slot += amount; Vector2 moveAmount = Vector2.UnitX * WallWidth * amount; - Vector2 simMoveAmount = ConvertUnits.ToSimUnits(moveAmount); + foreach (VoronoiCell cell in cells) { cell.body.SetTransform(cell.body.Position + simMoveAmount, 0.0f); @@ -158,7 +158,6 @@ namespace Barotrauma midPos += moveAmount; offset += moveAmount; - } } } diff --git a/Subsurface/Source/Map/Map.cs b/Subsurface/Source/Map/Map.cs index 1871beac9..2ec229a53 100644 --- a/Subsurface/Source/Map/Map.cs +++ b/Subsurface/Source/Map/Map.cs @@ -3,7 +3,6 @@ using Microsoft.Xna.Framework.Graphics; using System; using System.Collections.Generic; using System.Linq; -using System.Text; using Voronoi2; namespace Barotrauma