From 6d3e12597ac99845a874276ed48828e2fc9f12f0 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Tue, 6 Dec 2022 13:51:34 +0100 Subject: [PATCH] added items --- Mine2d/engine/TextureFactory.cs | 6 +-- Mine2d/engine/networking/Backend.cs | 1 + Mine2d/engine/networking/Frontend.cs | 1 + Mine2d/game/Context.cs | 7 +++- Mine2d/game/backend/interactor/Breaking.cs | 1 + Mine2d/game/backend/interactor/ItemPhysics.cs | 34 +++++++++++++++++ Mine2d/game/core/data/Chunk.cs | 6 +++ Mine2d/game/core/data/Enitity.cs | 6 +++ Mine2d/game/core/data/ItemId.cs | 7 ++++ Mine2d/game/core/data/entities/ItemEntity.cs | 8 ++++ Mine2d/game/core/items/Item.cs | 28 ++++++++++++++ Mine2d/game/core/items/ItemRegistry.cs | 23 ++++++++++++ Mine2d/game/core/tiles/OreTile.cs | 2 +- Mine2d/game/core/tiles/Tile.cs | 5 --- Mine2d/game/frontend/events/DebugInput.cs | 27 ++++++++++++++ Mine2d/game/frontend/renderer/GameRenderer.cs | 1 + Mine2d/game/frontend/renderer/ItemRenderer.cs | 37 +++++++++++++++++++ Mine2d/game/state/GameState.cs | 1 + 18 files changed, 191 insertions(+), 10 deletions(-) create mode 100644 Mine2d/game/backend/interactor/ItemPhysics.cs create mode 100644 Mine2d/game/core/data/Enitity.cs create mode 100644 Mine2d/game/core/data/ItemId.cs create mode 100644 Mine2d/game/core/data/entities/ItemEntity.cs create mode 100644 Mine2d/game/core/items/Item.cs create mode 100644 Mine2d/game/core/items/ItemRegistry.cs create mode 100644 Mine2d/game/frontend/events/DebugInput.cs create mode 100644 Mine2d/game/frontend/renderer/ItemRenderer.cs diff --git a/Mine2d/engine/TextureFactory.cs b/Mine2d/engine/TextureFactory.cs index d9aae71..befb031 100644 --- a/Mine2d/engine/TextureFactory.cs +++ b/Mine2d/engine/TextureFactory.cs @@ -8,10 +8,10 @@ public class TextureFactory private readonly Renderer renderer; private readonly Dictionary textureCache = new(); - public TextureFactory() + public TextureFactory(ResourceLoader resourceLoader, Renderer renderer) { - this.resourceLoader = Context.Get().ResourceLoader; - this.renderer = Context.Get().Renderer; + this.resourceLoader = resourceLoader; + this.renderer = renderer; } public IntPtr CreateTexture(string[] path) diff --git a/Mine2d/engine/networking/Backend.cs b/Mine2d/engine/networking/Backend.cs index 35ed60d..8b1c87e 100644 --- a/Mine2d/engine/networking/Backend.cs +++ b/Mine2d/engine/networking/Backend.cs @@ -18,6 +18,7 @@ public class Backend : IBackend public void Process(double dt) { this.ProcessPacket(new TickPacket(this.tick++)); + Context.Get().GameState.Tick = this.tick; while (this.pendingPackets.Count > 0) { var packet = this.pendingPackets.Dequeue(); diff --git a/Mine2d/engine/networking/Frontend.cs b/Mine2d/engine/networking/Frontend.cs index b257087..dfc33a1 100644 --- a/Mine2d/engine/networking/Frontend.cs +++ b/Mine2d/engine/networking/Frontend.cs @@ -17,6 +17,7 @@ public class Frontend : IFrontend var connectPacket = new ConnectPacket(ctx.FrontendGameState.PlayerName, guid); ctx.Backend.ProcessPacket(connectPacket); ctx.TileRegistry.RegisterTile(); + ctx.ItemRegistry.RegisterItems(); var (width, height) = ctx.Window.GetSize(); ctx.FrontendGameState.WindowWidth = width; ctx.FrontendGameState.WindowHeight = height; diff --git a/Mine2d/game/Context.cs b/Mine2d/game/Context.cs index 2b0ce7f..c158266 100644 --- a/Mine2d/game/Context.cs +++ b/Mine2d/game/Context.cs @@ -1,5 +1,6 @@ using Mine2d.engine; using Mine2d.engine.networking; +using Mine2d.game.core.items; using Mine2d.game.core.tiles; using Mine2d.game.state; @@ -15,7 +16,9 @@ public class Context public Window Window { get; set; } public Renderer Renderer { get; set; } public TileRegistry TileRegistry { get; set; } + public ItemRegistry ItemRegistry { get; set; } public ResourceLoader ResourceLoader { get; set; } + public TextureFactory TextureFactory { get; set; } public static Context Instance { get; set; } public Context( @@ -35,8 +38,10 @@ public class Context this.FrontendGameState = frontendGameState; this.Renderer = renderer; this.Window = window; - this.TileRegistry = new TileRegistry(); this.ResourceLoader = new ResourceLoader(); + this.TextureFactory = new TextureFactory(this.ResourceLoader, this.Renderer); + this.TileRegistry = new TileRegistry(); + this.ItemRegistry = new ItemRegistry(); Instance = this; } diff --git a/Mine2d/game/backend/interactor/Breaking.cs b/Mine2d/game/backend/interactor/Breaking.cs index a2b8639..d261be5 100644 --- a/Mine2d/game/backend/interactor/Breaking.cs +++ b/Mine2d/game/backend/interactor/Breaking.cs @@ -43,6 +43,7 @@ public class Breaking chunk.SetTileAt(player.Mining, tile with { Hits = tile.Hits + 1 }); if (tile.Hits >= hardness) { + ctx.Backend.ProcessPacket(new BlockBrokenPacket(player.Id, player.Mining, tile)); chunk.SetTileAt(player.Mining, STile.From(0)); } } diff --git a/Mine2d/game/backend/interactor/ItemPhysics.cs b/Mine2d/game/backend/interactor/ItemPhysics.cs new file mode 100644 index 0000000..aa9349f --- /dev/null +++ b/Mine2d/game/backend/interactor/ItemPhysics.cs @@ -0,0 +1,34 @@ +using Mine2d.engine.system.annotations; +using Mine2d.game.core.data.entities; + +namespace Mine2d.game.backend.interactor; + +[Interactor] +public class ItemPhysics +{ + + [Interaction(InteractorKind.Hybrid, "tick")] + public static void TickHybrid() + { + var gameState = Context.Get().GameState; + var world = gameState.World; + foreach (var chunk in world.Chunks) + { + var entities = chunk.Value.Entities; + foreach (var entity in entities) + { + if (entity is ItemEntity itemEntity) + { + itemEntity.Velocity += new Vector2(0, 0.1f); + var nextPos = itemEntity.Position + itemEntity.Velocity; + if (world.HasChunkAt(nextPos) && world.GetChunkAt(nextPos).HasTileAt(nextPos)) + { + itemEntity.Velocity = new Vector2(0, 0); + continue; + } + itemEntity.Position = nextPos; + } + } + } + } +} diff --git a/Mine2d/game/core/data/Chunk.cs b/Mine2d/game/core/data/Chunk.cs index d3ad1d9..4467d29 100644 --- a/Mine2d/game/core/data/Chunk.cs +++ b/Mine2d/game/core/data/Chunk.cs @@ -5,6 +5,7 @@ public class Chunk public STile[,] Tiles { get; set; } = new STile[Constants.ChunkSize, Constants.ChunkSize]; public int X { get; set; } public int Y { get; set; } + public List Entities { get; set; } = new(); public Chunk(int x, int y) { @@ -76,4 +77,9 @@ public class Chunk return pos - new Vector2(this.X * Constants.ChunkSize * Constants.TileSize, this.Y * Constants.ChunkSize * Constants.TileSize); } + + public void AddEntity(Entity entity) + { + this.Entities.Add(entity); + } } diff --git a/Mine2d/game/core/data/Enitity.cs b/Mine2d/game/core/data/Enitity.cs new file mode 100644 index 0000000..b94ae0b --- /dev/null +++ b/Mine2d/game/core/data/Enitity.cs @@ -0,0 +1,6 @@ +namespace Mine2d.game.core.data; + +public class Entity +{ + public Guid Id { get; set; } = Guid.NewGuid(); +} diff --git a/Mine2d/game/core/data/ItemId.cs b/Mine2d/game/core/data/ItemId.cs new file mode 100644 index 0000000..23ed545 --- /dev/null +++ b/Mine2d/game/core/data/ItemId.cs @@ -0,0 +1,7 @@ +namespace Mine2d.game.core.data; + +public enum ItemId +{ + Air = 0, + Stone = 1, +} diff --git a/Mine2d/game/core/data/entities/ItemEntity.cs b/Mine2d/game/core/data/entities/ItemEntity.cs new file mode 100644 index 0000000..1c7f4d6 --- /dev/null +++ b/Mine2d/game/core/data/entities/ItemEntity.cs @@ -0,0 +1,8 @@ +namespace Mine2d.game.core.data.entities; + +public class ItemEntity : Entity +{ + public Vector2 Position { get; set; } + public Vector2 Velocity { get; set; } + public ItemId ItemId { get; set; } +} diff --git a/Mine2d/game/core/items/Item.cs b/Mine2d/game/core/items/Item.cs new file mode 100644 index 0000000..89da0d4 --- /dev/null +++ b/Mine2d/game/core/items/Item.cs @@ -0,0 +1,28 @@ +using Mine2d.game.core.data; + +namespace Mine2d.game.core.items; + +public class Item +{ + public ItemId Id { get; set; } + public string Name { get; set; } + private readonly IntPtr texture; + + public Item(ItemId id, string name, string[] textureName) + { + this.Id = id; + this.Name = name; + var texture = Context.Get().TextureFactory.CreateTexture(textureName); + this.texture = texture; + } + + public void Render(Vector2 position) + { + var ctx = Context.Get(); + var renderer = ctx.Renderer; + var scale = ctx.FrontendGameState.Settings.GameScale; + var targetPos = (position - ctx.FrontendGameState.Camera.Position) * scale - + new Vector2(6 * scale); + renderer.DrawTexture(this.texture, (int)targetPos.X, (int)targetPos.Y, 8 * scale, 8 * scale); + } +} diff --git a/Mine2d/game/core/items/ItemRegistry.cs b/Mine2d/game/core/items/ItemRegistry.cs new file mode 100644 index 0000000..a245407 --- /dev/null +++ b/Mine2d/game/core/items/ItemRegistry.cs @@ -0,0 +1,23 @@ +using Mine2d.game.core.data; + +namespace Mine2d.game.core.items; + +public class ItemRegistry +{ + private readonly Dictionary items = new(); + + public void RegisterItems() + { + this.Register(ItemId.Stone, new Item(ItemId.Stone, "Stone", new[] { "stone" })); + } + + public void Register(ItemId id, Item item) + { + this.items.Add(id, item); + } + + public Item GetItem(ItemId id) + { + return this.items[id]; + } +} diff --git a/Mine2d/game/core/tiles/OreTile.cs b/Mine2d/game/core/tiles/OreTile.cs index 7c776cb..6e5a52c 100644 --- a/Mine2d/game/core/tiles/OreTile.cs +++ b/Mine2d/game/core/tiles/OreTile.cs @@ -4,7 +4,7 @@ namespace Mine2d.game.core.tiles; public class OreTile : Tile { - public OreTile(string name, string[] texturePath, int hardness) : base(name, new TextureFactory().CreateTexture(texturePath), hardness) + public OreTile(string name, string[] texturePath, int hardness) : base(name, Context.Get().TextureFactory.CreateTexture(texturePath), hardness) { } } diff --git a/Mine2d/game/core/tiles/Tile.cs b/Mine2d/game/core/tiles/Tile.cs index 258fe2d..59ea204 100644 --- a/Mine2d/game/core/tiles/Tile.cs +++ b/Mine2d/game/core/tiles/Tile.cs @@ -34,11 +34,6 @@ public class Tile this.texture = texture; } - ~Tile() - { - SDL_DestroyTexture(this.texture); - } - public void Render(int x, int y, STile tile) { var renderer = Context.Get().Renderer; diff --git a/Mine2d/game/frontend/events/DebugInput.cs b/Mine2d/game/frontend/events/DebugInput.cs new file mode 100644 index 0000000..bcba761 --- /dev/null +++ b/Mine2d/game/frontend/events/DebugInput.cs @@ -0,0 +1,27 @@ +using Mine2d.engine.system; +using Mine2d.engine.system.annotations; +using Mine2d.game.core; +using Mine2d.game.core.data; +using Mine2d.game.core.data.entities; + +namespace Mine2d.game.frontend.events; + +public class DebugInput +{ + [EventListener(EventType.KeyDown)] + public static void OnKeyDown(SDL_Event e) + { + if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_K) + { + var gameState = Context.Get().GameState; + var player = PlayerEntity.GetSelf(); + var chunk = gameState.World.GetChunkAt(player.Position); + var item = new ItemEntity + { + Position = player.Position, + ItemId = ItemId.Stone + }; + chunk.AddEntity(item); + } + } +} diff --git a/Mine2d/game/frontend/renderer/GameRenderer.cs b/Mine2d/game/frontend/renderer/GameRenderer.cs index 11903e0..5adef3c 100644 --- a/Mine2d/game/frontend/renderer/GameRenderer.cs +++ b/Mine2d/game/frontend/renderer/GameRenderer.cs @@ -12,6 +12,7 @@ public class GameRenderer : IRenderer this.renderers.Add(new WorldRenderer()); this.renderers.Add(new PlayerRenderer()); this.renderers.Add(new WorldCursorRenderer()); + this.renderers.Add(new ItemRenderer()); } public void Render() diff --git a/Mine2d/game/frontend/renderer/ItemRenderer.cs b/Mine2d/game/frontend/renderer/ItemRenderer.cs new file mode 100644 index 0000000..0d91e7c --- /dev/null +++ b/Mine2d/game/frontend/renderer/ItemRenderer.cs @@ -0,0 +1,37 @@ +using Mine2d.engine; +using Mine2d.game.core.data; +using Mine2d.game.core.data.entities; + +namespace Mine2d.game.frontend.renderer; + +public class ItemRenderer : IRenderer +{ + public void Render() + { + var gameState = Context.Get().GameState; + var world = gameState.World; + foreach (var chunk in world.Chunks) + { + renderChunk(chunk.Value); + } + } + + private static void renderChunk(Chunk chunk) + { + var entities = chunk.Entities; + foreach (var entity in entities) + { + if (entity is ItemEntity itemEntity) + { + renderItem(itemEntity); + } + } + } + + private static void renderItem(ItemEntity itemEntity) + { + var item = itemEntity.ItemId; + var position = itemEntity.Position; + Context.Get().ItemRegistry.GetItem(item).Render(position); + } +} diff --git a/Mine2d/game/state/GameState.cs b/Mine2d/game/state/GameState.cs index befc7bc..c33c2e8 100644 --- a/Mine2d/game/state/GameState.cs +++ b/Mine2d/game/state/GameState.cs @@ -28,4 +28,5 @@ public class GameState { public List Players { get; set; } = new List(); public World World { get; set; } + public uint Tick { get; set; } }