From 2574981d43e70fc88dfb4e0ac0f9edf8f987e400 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Wed, 2 Nov 2022 14:21:14 +0100 Subject: [PATCH] added gravity --- multiplayer-game/src/Import.cs | 1 + multiplayer-game/src/backend/Backend.cs | 2 +- multiplayer-game/src/backend/Publisher.cs | 2 +- .../src/backend/interactor/Connect.cs | 10 ++-- .../src/backend/interactor/Move.cs | 42 ++++++----------- multiplayer-game/src/core/Constants.cs | 2 + multiplayer-game/src/core/PlayerEntity.cs | 38 +++++++++++++++ multiplayer-game/src/core/data/Chunk.cs | 47 ++++++++++++++++--- multiplayer-game/src/core/data/World.cs | 29 ++++++++++++ multiplayer-game/src/core/tiles/Tile.cs | 5 ++ .../engine/system/annotations/Interactor.cs | 1 + multiplayer-game/src/frontend/Frontend.cs | 10 ++-- .../src/frontend/renderer/WorldRenderer.cs | 2 +- multiplayer-game/src/state/GameState.cs | 10 ---- multiplayer-game/src/state/Player.cs | 9 ++++ 15 files changed, 154 insertions(+), 56 deletions(-) create mode 100644 multiplayer-game/src/Import.cs create mode 100644 multiplayer-game/src/core/PlayerEntity.cs create mode 100644 multiplayer-game/src/state/Player.cs diff --git a/multiplayer-game/src/Import.cs b/multiplayer-game/src/Import.cs new file mode 100644 index 0000000..6ab8c31 --- /dev/null +++ b/multiplayer-game/src/Import.cs @@ -0,0 +1 @@ +global using System.Numerics; diff --git a/multiplayer-game/src/backend/Backend.cs b/multiplayer-game/src/backend/Backend.cs index 611159e..e2809d2 100644 --- a/multiplayer-game/src/backend/Backend.cs +++ b/multiplayer-game/src/backend/Backend.cs @@ -29,7 +29,7 @@ class Backend : IBackend public void Init() { Task.Run(Run); - this.publisher = new Publisher(InteractorKind.Server); + this.publisher = new Publisher(InteractorKind.Hybrid); } public void Run() diff --git a/multiplayer-game/src/backend/Publisher.cs b/multiplayer-game/src/backend/Publisher.cs index d878adb..4d936df 100644 --- a/multiplayer-game/src/backend/Publisher.cs +++ b/multiplayer-game/src/backend/Publisher.cs @@ -30,7 +30,7 @@ class Publisher continue; } var attr = (Interaction)attrs2[0]; - if (attr.Kind == InteractorKind.Server && this.kind == InteractorKind.Client) + if (attr.Kind != this.kind && this.kind != InteractorKind.Hybrid) { continue; } diff --git a/multiplayer-game/src/backend/interactor/Connect.cs b/multiplayer-game/src/backend/interactor/Connect.cs index 4565e33..2a39d04 100644 --- a/multiplayer-game/src/backend/interactor/Connect.cs +++ b/multiplayer-game/src/backend/interactor/Connect.cs @@ -7,16 +7,16 @@ class Connect public static void ConnectServer(ConnectPacket packet) { var ctx = Context.Get(); - var player = ctx.GameState.Players.Find(p => p.name == packet.playerName); + var player = ctx.GameState.Players.Find(p => p.Name == packet.playerName); if (player == null) { ctx.GameState.Players.Add( new Player { - name = packet.playerName, - guid = packet.playerGuid, - position = new Vector2(0, 0), - movement = new Vector2(0, 0) + Name = packet.playerName, + Guid = packet.playerGuid, + Position = new Vector2(20, 0), + Movement = new Vector2(0, 0) } ); } diff --git a/multiplayer-game/src/backend/interactor/Move.cs b/multiplayer-game/src/backend/interactor/Move.cs index 05b78d7..9327b0a 100644 --- a/multiplayer-game/src/backend/interactor/Move.cs +++ b/multiplayer-game/src/backend/interactor/Move.cs @@ -1,41 +1,29 @@ -using System.Numerics; - [Interactor] class Move { - [Interaction(InteractorKind.Client, "move")] - public static void MoveClient(MovePacket packet) + [Interaction(InteractorKind.Hybrid, "move")] + public static void MoveHybrid(MovePacket packet) { var ctx = Context.Get(); - var player = ctx.GameState.Players.Find(p => p.name == packet.playerName); + var player = ctx.GameState.Players.Find(p => p.Name == packet.playerName); if (player != null) { - player.movement = packet.movement * 4; + player.Movement = packet.movement * 4; } } + [Interaction(InteractorKind.Hybrid, "tick")] + public static void TickHybrid(TickPacket packet) + { + var ctx = Context.Get(); + ctx.GameState.Players.ForEach(PlayerEntity.Move); + ctx.GameState.Players.ForEach(PlayerEntity.Collide); + } + [Interaction(InteractorKind.Client, "tick")] - public static void TickClient(TickPacket packet) + public static void SelfMovedClient(TickPacket packet) { - var ctx = Context.Get(); - foreach (var player in ctx.GameState.Players) - { - if (player.movement == Vector2.Zero) - { - continue; - } - player.position += player.movement; - if (player.guid == ctx.FrontendGameState.PlayerGuid) - { - ctx.Backend.ProcessPacket(new SelfMovedPacket(player.position)); - } - } - } - - [Interaction(InteractorKind.Client, "selfMoved")] - public static void SelfMovedClient(SelfMovedPacket packet) - { - var ctx = Context.Get(); - ctx.FrontendGameState.Camera.CenterOn(packet.target); + var camera = Context.Get().FrontendGameState.Camera; + camera.CenterOn(PlayerEntity.GetSelf().Position); } } diff --git a/multiplayer-game/src/core/Constants.cs b/multiplayer-game/src/core/Constants.cs index 0eeda54..df5de5e 100644 --- a/multiplayer-game/src/core/Constants.cs +++ b/multiplayer-game/src/core/Constants.cs @@ -1,4 +1,6 @@ class Constants { public const int ChunkSize = 32; + public const int TileSize = 16; + public static Vector2 gravity = new Vector2(0, 0.1f); } diff --git a/multiplayer-game/src/core/PlayerEntity.cs b/multiplayer-game/src/core/PlayerEntity.cs new file mode 100644 index 0000000..b610018 --- /dev/null +++ b/multiplayer-game/src/core/PlayerEntity.cs @@ -0,0 +1,38 @@ +class PlayerEntity +{ + public static bool isSelf(Player p) + { + return p.Guid == GetSelf().Guid; + } + + public static Player GetSelf() + { + var ctx = Context.Get(); + var player = ctx.GameState.Players.FirstOrDefault( + p => p.Guid == ctx.FrontendGameState.PlayerGuid + ); + return player; + } + + public static void Move(Player p) + { + var ctx = Context.Get(); + p.Movement = p.Movement + Constants.gravity; + p.Position += p.Movement; + } + + public static void Collide(Player p) + { + var world = Context.Get().GameState.World; + if (!world.HasChunkAt(p.Position)) + { + return; + } + var chunk = world.GetChunkAt(p.Position); + while (chunk.hasTileAt(p.Position)) + { + p.Movement = p.Movement with { Y = 0 }; + p.Position += new Vector2(0, -0.1f); + } + } +} diff --git a/multiplayer-game/src/core/data/Chunk.cs b/multiplayer-game/src/core/data/Chunk.cs index 157ba87..edc0121 100644 --- a/multiplayer-game/src/core/data/Chunk.cs +++ b/multiplayer-game/src/core/data/Chunk.cs @@ -1,6 +1,6 @@ class Chunk { - public int[][] Tiles { get; set; } = new int[Constants.ChunkSize][]; + public int[,] Tiles { get; set; } = new int[Constants.ChunkSize, Constants.ChunkSize]; public int X { get; set; } public int Y { get; set; } @@ -8,14 +8,49 @@ class Chunk { X = x; Y = y; - for (int i = 0; i < Constants.ChunkSize; i++) - { - Tiles[i] = new int[Constants.ChunkSize]; - } } public void SetTile(int x, int y, int tile) { - Tiles[x][y] = tile; + Tiles[x, y] = tile; + } + + public int GetTile(int x, int y) + { + return Tiles[x, y]; + } + + public bool hasTileAt(Vector2 pos) + { + return hasTileAt((int)pos.X, (int)pos.Y); + } + + public bool hasTileAt(int x, int y) + { + var tileX = x / Constants.TileSize; + var tileY = y / Constants.TileSize; + return hasTile(tileX, tileY); + } + + public int GetTileAt(Vector2 pos) + { + return GetTileAt((int)pos.X, (int)pos.Y); + } + + public int GetTileAt(int x, int y) + { + var tileX = x / Constants.TileSize; + var tileY = y / Constants.TileSize; + return GetTile(tileX, tileY); + } + + public bool hasTile(int x, int y) + { + return x >= 0 && x < Tiles.Length && y >= 0 && y < Tiles.Length; + } + + public bool hasTile(Vector2 pos) + { + return hasTile((int)pos.X, (int)pos.Y); } } diff --git a/multiplayer-game/src/core/data/World.cs b/multiplayer-game/src/core/data/World.cs index 526cc0d..cedd8fa 100644 --- a/multiplayer-game/src/core/data/World.cs +++ b/multiplayer-game/src/core/data/World.cs @@ -7,11 +7,40 @@ class World Chunks.Add(chunk.X + "," + chunk.Y, chunk); } + public Chunk GetChunk(Vector2 pos) + { + return GetChunk((int)pos.X, (int)pos.Y); + } + public Chunk GetChunk(int x, int y) { return Chunks[x + "," + y]; } + public Chunk GetChunkAt(Vector2 pos) + { + return GetChunkAt((int)pos.X, (int)pos.Y); + } + + public Chunk GetChunkAt(int x, int y) + { + var chunkX = x / Constants.ChunkSize; + var chunkY = y / Constants.ChunkSize; + return Chunks[chunkX + "," + chunkY]; + } + + public bool HasChunkAt(Vector2 pos) + { + return HasChunkAt((int)pos.X, (int)pos.Y); + } + + public bool HasChunkAt(int x, int y) + { + var chunkX = x / Constants.ChunkSize; + var chunkY = y / Constants.ChunkSize; + return Chunks.ContainsKey(chunkX + "," + chunkY); + } + public bool ChunkExists(int x, int y) { return Chunks.ContainsKey(x + "," + y); diff --git a/multiplayer-game/src/core/tiles/Tile.cs b/multiplayer-game/src/core/tiles/Tile.cs index 1b1fec1..bbe59af 100644 --- a/multiplayer-game/src/core/tiles/Tile.cs +++ b/multiplayer-game/src/core/tiles/Tile.cs @@ -37,4 +37,9 @@ class Tile 16 * scale ); } + + public bool IsSolid() + { + return true; + } } diff --git a/multiplayer-game/src/engine/system/annotations/Interactor.cs b/multiplayer-game/src/engine/system/annotations/Interactor.cs index 74a64f4..0aec9f7 100644 --- a/multiplayer-game/src/engine/system/annotations/Interactor.cs +++ b/multiplayer-game/src/engine/system/annotations/Interactor.cs @@ -2,6 +2,7 @@ enum InteractorKind { Client, Server, + Hybrid } [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] diff --git a/multiplayer-game/src/frontend/Frontend.cs b/multiplayer-game/src/frontend/Frontend.cs index 1d99fc9..b01bda0 100644 --- a/multiplayer-game/src/frontend/Frontend.cs +++ b/multiplayer-game/src/frontend/Frontend.cs @@ -37,9 +37,9 @@ class Frontend : IFrontend ctx.FrontendGameState.WindowHeight = e.window.data2; Console.WriteLine($"Window resized to {e.window.data1}x{e.window.data2}"); var player = ctx.GameState.Players.Find( - p => p.guid == ctx.FrontendGameState.PlayerGuid + p => p.Guid == ctx.FrontendGameState.PlayerGuid ); - ctx.FrontendGameState.Camera.CenterOn(player.position); + ctx.FrontendGameState.Camera.CenterOn(player.Position); } } if (e.type == SDL_EventType.SDL_KEYDOWN && e.key.repeat == 0) @@ -128,13 +128,13 @@ class Frontend : IFrontend new WorldRenderer().Render(); ctx.GameState.Players.ForEach(player => { - if (player.name == playerName) + if (player.Name == playerName) ctx.Renderer.SetColor(0, 0, 255, 255); else ctx.Renderer.SetColor(255, 0, 0, 255); ctx.Renderer.DrawRect( - (player.position.X - (int)camera.position.X) * scale, - (player.position.Y - (int)camera.position.Y) * scale, + (player.Position.X - (int)camera.position.X) * scale, + (player.Position.Y - (int)camera.position.Y) * scale - 10, 10, 10 ); diff --git a/multiplayer-game/src/frontend/renderer/WorldRenderer.cs b/multiplayer-game/src/frontend/renderer/WorldRenderer.cs index 3c9a5c8..9ed48d8 100644 --- a/multiplayer-game/src/frontend/renderer/WorldRenderer.cs +++ b/multiplayer-game/src/frontend/renderer/WorldRenderer.cs @@ -12,7 +12,7 @@ class WorldRenderer : IRenderer { for (int x = 0; x < 16; x++) { - var tileId = chunk.Tiles[x][y]; + var tileId = chunk.GetTile(x, y); var tile = tileRegistry.GetTile(tileId); tile.Render(x * 16, y * 16); } diff --git a/multiplayer-game/src/state/GameState.cs b/multiplayer-game/src/state/GameState.cs index f7eadfe..fcf1270 100644 --- a/multiplayer-game/src/state/GameState.cs +++ b/multiplayer-game/src/state/GameState.cs @@ -1,13 +1,3 @@ -using System.Numerics; - -class Player -{ - public string name; - public Vector2 position; - public Vector2 movement; - public Guid guid; -} - class FrontendGameState { public Vector2 MovementInput; diff --git a/multiplayer-game/src/state/Player.cs b/multiplayer-game/src/state/Player.cs new file mode 100644 index 0000000..cf5b88b --- /dev/null +++ b/multiplayer-game/src/state/Player.cs @@ -0,0 +1,9 @@ +using System.Numerics; + +class Player +{ + public string Name; + public Vector2 Position; + public Vector2 Movement; + public Guid Guid; +}