From 2fd35f061e2232e1553e10f59c7b4c28a682d4d7 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Wed, 16 Nov 2022 14:45:03 +0100 Subject: [PATCH] added world gen + renderers --- Mine2d/assets/background.png | Bin 0 -> 298 bytes Mine2d/backend/data/Packet.cs | 30 ++++++++++++ Mine2d/backend/interactor/Connect.cs | 2 +- Mine2d/backend/interactor/Move.cs | 12 +++++ Mine2d/backend/interactor/WorldGeneration.cs | 38 ++++++++++++++++ Mine2d/core/Bootstrapper.cs | 2 +- Mine2d/core/world/ChunkGenerator.cs | 24 ++++++++++ Mine2d/engine/utils/Neighbor.cs | 43 ++++++++++++++++++ Mine2d/frontend/Frontend.cs | 40 ++-------------- Mine2d/frontend/renderer/GameRenderer.cs | 23 ++++++++++ Mine2d/frontend/renderer/PlayerRenderer.cs | 32 +++++++++++++ .../frontend/renderer/WorldCursorRenderer.cs | 28 ++++++++++++ 12 files changed, 237 insertions(+), 37 deletions(-) create mode 100644 Mine2d/assets/background.png create mode 100644 Mine2d/backend/interactor/WorldGeneration.cs create mode 100644 Mine2d/engine/utils/Neighbor.cs create mode 100644 Mine2d/frontend/renderer/GameRenderer.cs create mode 100644 Mine2d/frontend/renderer/PlayerRenderer.cs create mode 100644 Mine2d/frontend/renderer/WorldCursorRenderer.cs diff --git a/Mine2d/assets/background.png b/Mine2d/assets/background.png new file mode 100644 index 0000000000000000000000000000000000000000..50b6d27af838c0941a3f9f32096e89121f8adcd2 GIT binary patch literal 298 zcmV+_0oDGAP)Px#Z1=Wy@qE{fI1UhZC&i8PO%uyliLWKLW}?WD=BbBmL}6Ji4qlNH791 zBl?)*fzZh!-LY*Z>g33ZRfqRHKEUjlm7dZlv$&U>39nXj^&M}~@`2YX_07*qoM6N<$f*Ij|lmGw# literal 0 HcmV?d00001 diff --git a/Mine2d/backend/data/Packet.cs b/Mine2d/backend/data/Packet.cs index d4487d3..5b20a0d 100644 --- a/Mine2d/backend/data/Packet.cs +++ b/Mine2d/backend/data/Packet.cs @@ -1,3 +1,5 @@ +using mine2d.core.data; + namespace mine2d.backend.data; public interface IPacket @@ -66,3 +68,31 @@ public readonly struct BreakPacket : IPacket this.Target = target; } } + +public readonly struct PlayerMovedPacket : IPacket +{ + public readonly string Type => "playerMoved"; + public readonly Guid PlayerId { get; } + public readonly Vector2 Target { get; } + + public PlayerMovedPacket(Guid playerId, Vector2 target) + { + this.PlayerId = playerId; + this.Target = target; + } +} + +public readonly struct BlockBrokenPacket : IPacket +{ + public readonly string Type => "blockBroken"; + public readonly Guid PlayerId { get; } + public readonly Vector2 Target { get; } + public readonly STile Tile { get; } + + public BlockBrokenPacket(Guid playerId, Vector2 target, STile tile) + { + this.PlayerId = playerId; + this.Target = target; + this.Tile = tile; + } +} diff --git a/Mine2d/backend/interactor/Connect.cs b/Mine2d/backend/interactor/Connect.cs index 8830313..63538b7 100644 --- a/Mine2d/backend/interactor/Connect.cs +++ b/Mine2d/backend/interactor/Connect.cs @@ -19,7 +19,7 @@ public class Connect { Name = packet.PlayerName, Id = packet.PlayerGuid, - Position = new Vector2(20, 16 * 16), + Position = new Vector2(32 * 16 * 1000 + 16 * 14.5f, 32 * 16 * 10 + 16 * 14.5f), Movement = new Vector2(0, 0) } ); diff --git a/Mine2d/backend/interactor/Move.cs b/Mine2d/backend/interactor/Move.cs index c554ed4..076e9df 100644 --- a/Mine2d/backend/interactor/Move.cs +++ b/Mine2d/backend/interactor/Move.cs @@ -22,8 +22,20 @@ public class Move public static void TickHybrid() { var ctx = Context.Get(); + var fromPositions = new Dictionary(); + foreach (var player in ctx.GameState.Players) + { + fromPositions.Add(player.Id, player.Position); + } ctx.GameState.Players.ForEach(PlayerEntity.Move); ctx.GameState.Players.ForEach(PlayerEntity.Collide); + foreach (var player in ctx.GameState.Players) + { + if (player.Position != fromPositions[player.Id]) + { + ctx.Backend.ProcessPacket(new PlayerMovedPacket(player.Id, player.Position)); + } + } } [Interaction(InteractorKind.Client, "tick")] diff --git a/Mine2d/backend/interactor/WorldGeneration.cs b/Mine2d/backend/interactor/WorldGeneration.cs new file mode 100644 index 0000000..dd757ed --- /dev/null +++ b/Mine2d/backend/interactor/WorldGeneration.cs @@ -0,0 +1,38 @@ +using mine2d; +using mine2d.backend.data; +using mine2d.core.data; +using mine2d.core.tiles; +using mine2d.core.world; +using mine2d.engine.system.annotations; + +namespace Mine2d.backend.interactor; + +[Interactor] +public class WorldGeneration +{ + private static Vector2[] directions = new Vector2[] + { + new Vector2(0, 1), + new Vector2(1, 0), + new Vector2(0, -1), + new Vector2(-1, 0) + }; + + [Interaction(InteractorKind.Server, "playerMoved")] + public static void PlayerMovedServer(PlayerMovedPacket packet) + { + var ctx = Context.Get(); + var world = ctx.GameState.World; + foreach (var direction in directions) + { + var generationTarget = packet.Target + direction * 16 * 32; + var hasChunkGenerated = world.HasChunkAt(generationTarget); + + if (!hasChunkGenerated) + { + var chunkPos = World.ToChunkPos(generationTarget); + world.AddChunk(ChunkGenerator.CreateFilledChunk((int)chunkPos.X, (int)chunkPos.Y, STile.From(Tiles.Stone))); + } + } + } +} diff --git a/Mine2d/core/Bootstrapper.cs b/Mine2d/core/Bootstrapper.cs index 9564888..3260aa5 100644 --- a/Mine2d/core/Bootstrapper.cs +++ b/Mine2d/core/Bootstrapper.cs @@ -11,7 +11,7 @@ public class Bootstrapper var ctx = Context.Get(); ctx.GameState.World = new World(); ctx.GameState.World.AddChunk(ChunkGenerator.CreateFilledChunk(0, 1, STile.From(Tiles.Stone))); - ctx.GameState.World.AddChunk(ChunkGenerator.CreateFilledChunk(1, 1, STile.From(Tiles.Stone))); + ctx.GameState.World.AddChunk(ChunkGenerator.CreateSpawnChunk(1000, 10)); ctx.GameState.World.AddChunk(ChunkGenerator.CreateFilledChunk(1, 0, STile.From(Tiles.Stone))); } } diff --git a/Mine2d/core/world/ChunkGenerator.cs b/Mine2d/core/world/ChunkGenerator.cs index ef78bd4..2ce3bd8 100644 --- a/Mine2d/core/world/ChunkGenerator.cs +++ b/Mine2d/core/world/ChunkGenerator.cs @@ -1,4 +1,5 @@ using mine2d.core.data; +using mine2d.core.tiles; namespace mine2d.core.world; @@ -16,4 +17,27 @@ public class ChunkGenerator } return chunk; } + + public static Chunk CreateSpawnChunk(int x, int y) + { + var chunk = new Chunk(x, y); + for (var i = 0; i < Constants.ChunkSize; i++) + { + for (var j = 0; j < Constants.ChunkSize; j++) + { + chunk.SetTile(i, j, STile.From(Tiles.Stone)); + } + } + chunk.SetTile(16, 16, STile.From(0)); + chunk.SetTile(15, 16, STile.From(0)); + chunk.SetTile(16, 15, STile.From(0)); + chunk.SetTile(15, 15, STile.From(0)); + chunk.SetTile(17, 15, STile.From(0)); + chunk.SetTile(14, 15, STile.From(0)); + chunk.SetTile(17, 16, STile.From(0)); + chunk.SetTile(14, 16, STile.From(0)); + chunk.SetTile(16, 14, STile.From(0)); + chunk.SetTile(15, 14, STile.From(0)); + return chunk; + } } diff --git a/Mine2d/engine/utils/Neighbor.cs b/Mine2d/engine/utils/Neighbor.cs new file mode 100644 index 0000000..daa15ce --- /dev/null +++ b/Mine2d/engine/utils/Neighbor.cs @@ -0,0 +1,43 @@ +public static class Neighbor +{ + public static IEnumerable Get4Neighbors(this Vector2 pos) + { + return new[] + { + new Vector2(pos.X - 1, pos.Y), + new Vector2(pos.X + 1, pos.Y), + new Vector2(pos.X, pos.Y - 1), + new Vector2(pos.X, pos.Y + 1) + }; + } + + public static IEnumerable Get8Neighbors(this Vector2 pos) + { + return new[] + { + new Vector2(pos.X - 1, pos.Y - 1), + new Vector2(pos.X + 1, pos.Y - 1), + new Vector2(pos.X - 1, pos.Y + 1), + new Vector2(pos.X + 1, pos.Y + 1) + }; + } + + public static IEnumerable Get20Neighbors(this Vector2 pos) + { + return new[] + { + new Vector2(pos.X - 2, pos.Y), + new Vector2(pos.X + 2, pos.Y), + new Vector2(pos.X, pos.Y - 2), + new Vector2(pos.X, pos.Y + 2), + new Vector2(pos.X - 2, pos.Y +1), + new Vector2(pos.X + 2, pos.Y +1), + new Vector2(pos.X - 2, pos.Y -1), + new Vector2(pos.X + 2, pos.Y -1), + new Vector2(pos.X - 1, pos.Y +2), + new Vector2(pos.X + 1, pos.Y +2), + new Vector2(pos.X - 1, pos.Y -2), + new Vector2(pos.X + 1, pos.Y -2), + }; + } +} diff --git a/Mine2d/frontend/Frontend.cs b/Mine2d/frontend/Frontend.cs index ecedb47..a80d015 100644 --- a/Mine2d/frontend/Frontend.cs +++ b/Mine2d/frontend/Frontend.cs @@ -1,12 +1,14 @@ using mine2d.backend.data; -using mine2d.core; using mine2d.frontend.renderer; using Mine2d.frontend; +using Mine2d.frontend.renderer; namespace mine2d.frontend; public class Frontend : IFrontend { + private IRenderer gameRenderer; + public void Init() { var ctx = Context.Get(); @@ -19,6 +21,7 @@ public class Frontend : IFrontend var (width, height) = ctx.Window.GetSize(); ctx.FrontendGameState.WindowWidth = width; ctx.FrontendGameState.WindowHeight = height; + this.gameRenderer = new GameRenderer(); } public void Process() @@ -27,40 +30,7 @@ public class Frontend : IFrontend EventService.PollEvents(); ctx.Renderer.Clear(); - var scale = ctx.FrontendGameState.Settings.GameScale; - var camera = Context.Get().FrontendGameState.Camera; - new WorldRenderer().Render(); - ctx.GameState.Players.ForEach(player => - { - if (player.Name == ctx.FrontendGameState.PlayerName) - { - ctx.Renderer.SetColor(0, 0, 255); - } - else - { - ctx.Renderer.SetColor(255, 0, 0); - } - - ctx.Renderer.DrawRect( - (player.Position.X - (int)camera.Position.X) * scale, - (player.Position.Y - (int)camera.Position.Y) * scale - 32 * scale, - 16 * scale, - 32 * scale - ); - }); - var absoluteMousePos = ctx.FrontendGameState.MousePosition / ctx.FrontendGameState.Settings.GameScale + camera.Position; - if (ctx.GameState.World.HasTileAt((int)absoluteMousePos.X, (int)absoluteMousePos.Y)) - { - var a = Constants.TileSize; - var tilePos = new Vector2(absoluteMousePos.X - absoluteMousePos.X % a, absoluteMousePos.Y - absoluteMousePos.Y % a); - ctx.Renderer.SetColor(255, 255, 255); - ctx.Renderer.DrawOutline( - (int)tilePos.X * scale - (int)camera.Position.X * scale, - (int)tilePos.Y * scale - (int)camera.Position.Y * scale, - 16 * scale, - 16 * scale - ); - } + this.gameRenderer.Render(); ctx.Renderer.Present(); } diff --git a/Mine2d/frontend/renderer/GameRenderer.cs b/Mine2d/frontend/renderer/GameRenderer.cs new file mode 100644 index 0000000..5452308 --- /dev/null +++ b/Mine2d/frontend/renderer/GameRenderer.cs @@ -0,0 +1,23 @@ +using mine2d.frontend.renderer; + +namespace Mine2d.frontend.renderer; + +public class GameRenderer : IRenderer +{ + private readonly List renderers = new(); + + public GameRenderer() + { + this.renderers.Add(new WorldRenderer()); + this.renderers.Add(new PlayerRenderer()); + this.renderers.Add(new WorldCursorRenderer()); + } + + public void Render() + { + foreach (var renderer in this.renderers) + { + renderer.Render(); + } + } +} diff --git a/Mine2d/frontend/renderer/PlayerRenderer.cs b/Mine2d/frontend/renderer/PlayerRenderer.cs new file mode 100644 index 0000000..9a2994c --- /dev/null +++ b/Mine2d/frontend/renderer/PlayerRenderer.cs @@ -0,0 +1,32 @@ +using mine2d; +using mine2d.frontend.renderer; + +namespace Mine2d.frontend.renderer; + +public class PlayerRenderer : IRenderer +{ + public void Render() + { + var ctx = Context.Get(); + var camera = ctx.FrontendGameState.Camera; + var scale = ctx.FrontendGameState.Settings.GameScale; + foreach (var player in ctx.GameState.Players) + { + if (player.Name == ctx.FrontendGameState.PlayerName) + { + ctx.Renderer.SetColor(0, 0, 255); + } + else + { + ctx.Renderer.SetColor(255, 0, 0); + } + + ctx.Renderer.DrawRect( + (player.Position.X - (int)camera.Position.X) * scale, + (player.Position.Y - (int)camera.Position.Y) * scale - 32 * scale, + 16 * scale, + 32 * scale + ); + } + } +} diff --git a/Mine2d/frontend/renderer/WorldCursorRenderer.cs b/Mine2d/frontend/renderer/WorldCursorRenderer.cs new file mode 100644 index 0000000..a52c6ff --- /dev/null +++ b/Mine2d/frontend/renderer/WorldCursorRenderer.cs @@ -0,0 +1,28 @@ +using mine2d; +using mine2d.core; +using mine2d.frontend.renderer; + +namespace Mine2d.frontend.renderer; + +public class WorldCursorRenderer : IRenderer +{ + public void Render() + { + var ctx = Context.Get(); + var scale = ctx.FrontendGameState.Settings.GameScale; + var camera = ctx.FrontendGameState.Camera; + var absoluteMousePos = ctx.FrontendGameState.MousePosition / ctx.FrontendGameState.Settings.GameScale + camera.Position; + if (ctx.GameState.World.HasTileAt((int)absoluteMousePos.X, (int)absoluteMousePos.Y)) + { + var ts = Constants.TileSize; + var tilePos = new Vector2(absoluteMousePos.X - absoluteMousePos.X % ts, absoluteMousePos.Y - absoluteMousePos.Y % ts); + ctx.Renderer.SetColor(255, 255, 255); + ctx.Renderer.DrawOutline( + (int)tilePos.X * scale - (int)camera.Position.X * scale, + (int)tilePos.Y * scale - (int)camera.Position.Y * scale, + 16 * scale, + 16 * scale + ); + } + } +}