diff --git a/CityGame/CityGame.csproj b/CityGame/CityGame.csproj index 7fedb76..b6308b8 100644 --- a/CityGame/CityGame.csproj +++ b/CityGame/CityGame.csproj @@ -18,6 +18,7 @@ + diff --git a/CityGame/Classes/Entities/Car.cs b/CityGame/Classes/Entities/Car.cs index 44c76fc..22769c3 100644 --- a/CityGame/Classes/Entities/Car.cs +++ b/CityGame/Classes/Entities/Car.cs @@ -7,6 +7,10 @@ using System.Diagnostics; using System.Linq; using OrpticonGameHelper; using OrpticonGameHelper.Classes.Elements; +using System.Threading; +using AStar; +using System.Threading.Tasks; +using System.Collections.Concurrent; namespace CityGame.Classes.Entities { @@ -37,10 +41,10 @@ namespace CityGame.Classes.Entities } public float Speed { get; set; } = 128; float currentSpeed = 0; - public static Dictionary OccupiedTilesFill = new Dictionary(); - public static Dictionary OccupiedTiles = new Dictionary(); - public static Dictionary OccupiedTilesFill2 = new Dictionary(); - public static Dictionary OccupiedTiles2 = new Dictionary(); + public static ConcurrentDictionary OccupiedTilesFill = new ConcurrentDictionary(); + public static ConcurrentDictionary OccupiedTiles = new ConcurrentDictionary(); + public static ConcurrentDictionary OccupiedTilesFill2 = new ConcurrentDictionary(); + public static ConcurrentDictionary OccupiedTiles2 = new ConcurrentDictionary(); protected string PNGFile = "NPCCar.png"; protected ColoredRectangle debugRect; protected Tile lastTile; @@ -96,8 +100,15 @@ namespace CityGame.Classes.Entities private int curveMode; private float curveModePixelDuration; private int curveModeStartedAt; - - public override void Tick(long deltaTime) + private bool pathfindingInProgress; + private async Task CalculatePathAsync(Point start, Point target, PathFinder pathfinder) + { + return await Task.Run(() => + { + return pathfinder.FindPath(start.Convert(), target.Convert()).Select(x => x.Convert()).ToArray(); + }); + } + public override async void Tick(long deltaTime) { //deltaTime /= 10; //deltaTime *= 500; @@ -119,15 +130,23 @@ namespace CityGame.Classes.Entities else lights.ForEach(x => x.Visible = true); if (Target is not null) { + if (pathfindingInProgress) return; //if(Object is not null) Object.ToolTip = Target.ToString(); - if (Path is null) + if (Path is null && !pathfindingInProgress) { + pathfindingInProgress = true; var pf = MainWindow.pathfinder; if (grid == 2) pf = MainWindow.pathfinderDesperate; - Path = pf.FindPath(Point.Convert(), new Point((int)(Target.X() / MainWindow.TileSize), (int)(Target.Y() / MainWindow.TileSize)).Convert()).Select(x => x.Convert()).ToArray(); + + Point start = Point; + Point target = new Point((int)(Target.X() / MainWindow.TileSize), (int)(Target.Y() / MainWindow.TileSize)); + + Path = await CalculatePathAsync(start, target, pf); NextTarget = 0; + pathfindingInProgress = false; } if (new Point(Target.X() / 64, Target.Y() / 64) != Point) Move(this); + if (Path is null) return; if (Path.Length == 0) { JourneyImpossible(this); @@ -146,13 +165,13 @@ namespace CityGame.Classes.Entities JourneyFinished(this); if (Math.Round(Rotation) == 0 || Math.Round(Rotation) == 90) { - if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.Add(myTile, this); - if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.Add(myTile, this); + if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.TryAdd(myTile, this); + if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.TryAdd(myTile, this); } if (Math.Round(Rotation) == 180 || Math.Round(Rotation) == 270) { - if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.Add(myTile, this); - if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.Add(myTile, this); + if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.TryAdd(myTile, this); + if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.TryAdd(myTile, this); } return; } @@ -172,8 +191,8 @@ namespace CityGame.Classes.Entities if (Math.Round(Rotation) == 0 || Math.Round(Rotation) == 90) { - if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.Add(myTile, this); - if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.Add(myTile, this); + if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.TryAdd(myTile, this); + if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.TryAdd(myTile, this); if (OccupiedTiles.ContainsKey(targetTile) && OccupiedTiles[targetTile] != this) { SpeedMulti = 0; @@ -182,8 +201,8 @@ namespace CityGame.Classes.Entities } if (Math.Round(Rotation) == 180 || Math.Round(Rotation) == 270) { - if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.Add(myTile, this); - if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.Add(myTile, this); + if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.TryAdd(myTile, this); + if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.TryAdd(myTile, this); if (OccupiedTiles2.ContainsKey(targetTile) && OccupiedTiles2[targetTile] != this) { SpeedMulti = 0; @@ -285,13 +304,13 @@ namespace CityGame.Classes.Entities { if (Math.Round(Rotation) == 0 || Math.Round(Rotation) == 90) { - if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.Add(myTile, this); - if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.Add(myTile, this); + if (!OccupiedTilesFill.ContainsKey(myTile)) OccupiedTilesFill.TryAdd(myTile, this); + if (!OccupiedTilesFill2.ContainsKey(myTile) && fullBlock) OccupiedTilesFill2.TryAdd(myTile, this); } if (Math.Round(Rotation) == 180 || Math.Round(Rotation) == 270) { - if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.Add(myTile, this); - if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.Add(myTile, this); + if (!OccupiedTilesFill2.ContainsKey(myTile)) OccupiedTilesFill2.TryAdd(myTile, this); + if (!OccupiedTilesFill.ContainsKey(myTile) && fullBlock) OccupiedTilesFill.TryAdd(myTile, this); } } } diff --git a/CityGame/Classes/Misc/StaticDataManager.cs b/CityGame/Classes/Misc/StaticDataManager.cs new file mode 100644 index 0000000..f14cd24 --- /dev/null +++ b/CityGame/Classes/Misc/StaticDataManager.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CityGame.Classes.Misc +{ + public class StaticData + { + protected object obj; + static List list = new List(); + public static void Reset() + { + list.ForEach(x => x.obj = null); + } + } + public class StaticData : StaticData + { + public StaticData(T obj) + { + this.obj = obj; + } + public T Value { get => (T)obj; } + public static implicit operator StaticData(T obj) + { + return new StaticData(obj); + } + public static implicit operator T(StaticData d) + { + return d.Value; + } + } +} diff --git a/CityGame/Classes/Rendering/ImageConverter.cs b/CityGame/Classes/Rendering/ImageConverter.cs deleted file mode 100644 index fb01a52..0000000 --- a/CityGame/Classes/Rendering/ImageConverter.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace CityGame.Classes.Rendering -{ - public class ImageConverter - { - public static void ChangeColor(string srcFile, string destFile, Dictionary conversions) - { - destFile = Environment.CurrentDirectory + "\\Resources\\" + destFile + ".png"; - //if (File.Exists(destFile)) return; - srcFile = Environment.CurrentDirectory + "\\Resources\\" + srcFile + ".png"; - if (!File.Exists(srcFile)) return; - - Dictionary Conversions = conversions.Select(x => new KeyValuePair(System.Drawing.ColorTranslator.FromHtml(x.Key), System.Drawing.ColorTranslator.FromHtml(x.Value))).ToDictionary(x => x.Key, x => x.Value); - System.Drawing.Bitmap bmp = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(srcFile); - for (int x = 0; x < bmp.Width; x++) - { - for (int y = 0; y < bmp.Height; y++) - { - var color = bmp.GetPixel(x, y); - if (Conversions.ContainsKey(color)) - { - bmp.SetPixel(x, y, Conversions[color]); - } - } - } - bmp.Save(destFile); - } - } -} \ No newline at end of file diff --git a/CityGame/MainWindow.cs b/CityGame/MainWindow.cs index 70e5ecf..86da893 100644 --- a/CityGame/MainWindow.cs +++ b/CityGame/MainWindow.cs @@ -13,6 +13,7 @@ using System.Linq; using OrpticonGameHelper; using OrpticonGameHelper.Classes.Elements; using static CityGame.Classes.Entities.Car; +using OrpticonGameHelper.Classes.Misc; namespace CityGame { @@ -190,6 +191,8 @@ namespace CityGame int NPCCount = (int)Math.Ceiling(mapHeight * mapWidth / 100f); //NPCCount = 1; //NPCCount = 0; + //NPCCount /= 2; + //NPCCount *= 8; random = new Random(seed); @@ -533,9 +536,9 @@ namespace CityGame Canvas.SetTop(entity.Object, entity.VisualY); } Car.OccupiedTiles = Car.OccupiedTilesFill; - Car.OccupiedTilesFill = new Dictionary(); + Car.OccupiedTilesFill = new System.Collections.Concurrent.ConcurrentDictionary(); Car.OccupiedTiles2 = Car.OccupiedTilesFill2; - Car.OccupiedTilesFill2 = new Dictionary(); + Car.OccupiedTilesFill2 = new System.Collections.Concurrent.ConcurrentDictionary(); } } } \ No newline at end of file diff --git a/CityGame/Program.cs b/CityGame/Program.cs index 89bba1b..6ffe6d7 100644 --- a/CityGame/Program.cs +++ b/CityGame/Program.cs @@ -1,8 +1,10 @@ -namespace CityGame +using CityGame.Classes.Menu; + +namespace CityGame { public class Program { public static void Main() { - var menu = new MainWindow(); + var game = new MainWindow(); } } } \ No newline at end of file