diff --git a/Mine2d/Mine2d.csproj b/Mine2d/Mine2d.csproj index 8a9dc95..62630ea 100644 --- a/Mine2d/Mine2d.csproj +++ b/Mine2d/Mine2d.csproj @@ -18,8 +18,7 @@ - - + diff --git a/Mine2d/game/backend/interactor/ItemPhysics.cs b/Mine2d/game/backend/interactor/ItemPhysics.cs index fe71785..2316d3e 100644 --- a/Mine2d/game/backend/interactor/ItemPhysics.cs +++ b/Mine2d/game/backend/interactor/ItemPhysics.cs @@ -1,5 +1,6 @@ using Mine2d.engine; using Mine2d.engine.system.annotations; +using Mine2d.game.backend.data; using Mine2d.game.core.data; using Mine2d.game.core.data.entities; @@ -36,7 +37,7 @@ public class ItemPhysics } [Interaction(InteractorKind.Hybrid, "tick")] - public static void Pickup() + public static void Pickup(TickPacket tickPacket) { var gameState = Context.Get().GameState; var world = gameState.World; @@ -47,6 +48,7 @@ public class ItemPhysics var items = chunk.Value.Entities.Where(e => { + Console.WriteLine("Where"); return e is ItemEntity itemEntity && (player.Position + new Vector2(7, 3) - itemEntity.Position).LengthSquared() < 8 * 8 && player.inventory.PickupItemStack(new ItemStack { Id = itemEntity.ItemId, Count = 1 }); @@ -54,6 +56,7 @@ public class ItemPhysics if (items.Any()) { Context.Get().GameAudio.Play(Sound.ItemPickup); + Console.WriteLine(tickPacket.Tick + " " + items.Count()); } _ = chunk.Value.Entities.RemoveAll(e => items.Contains(e)); } diff --git a/Mine2d/game/core/data/ItemStack.cs b/Mine2d/game/core/data/ItemStack.cs index 0b22406..7c0e2c8 100644 --- a/Mine2d/game/core/data/ItemStack.cs +++ b/Mine2d/game/core/data/ItemStack.cs @@ -4,4 +4,14 @@ public class ItemStack { public ItemId Id { get; set; } public int Count { get; set; } + + public IntPtr GetTexture() + { + return Context.Get().ItemRegistry.GetItem(this.Id).GetTexture(); + } + + public string GetName() + { + return Context.Get().ItemRegistry.GetItem(this.Id).Name; + } } diff --git a/Mine2d/game/core/items/Item.cs b/Mine2d/game/core/items/Item.cs index 0312faa..c83c995 100644 --- a/Mine2d/game/core/items/Item.cs +++ b/Mine2d/game/core/items/Item.cs @@ -25,4 +25,9 @@ public class Item new Vector2(4 * scale, 6 * scale); renderer.DrawTexture(this.texture, (int)targetPos.X, (int)targetPos.Y, 8 * scale, 8 * scale); } + + public IntPtr GetTexture() + { + return this.texture; + } } diff --git a/Mine2d/game/frontend/renderer/GameRenderer.cs b/Mine2d/game/frontend/renderer/GameRenderer.cs index 5adef3c..108adbb 100644 --- a/Mine2d/game/frontend/renderer/GameRenderer.cs +++ b/Mine2d/game/frontend/renderer/GameRenderer.cs @@ -11,8 +11,9 @@ public class GameRenderer : IRenderer this.renderers.Add(new BackgroundRenderer()); this.renderers.Add(new WorldRenderer()); this.renderers.Add(new PlayerRenderer()); - this.renderers.Add(new WorldCursorRenderer()); this.renderers.Add(new ItemRenderer()); + this.renderers.Add(new WorldCursorRenderer()); + this.renderers.Add(new HudRenderer()); } public void Render() diff --git a/Mine2d/game/frontend/renderer/HudRenderer.cs b/Mine2d/game/frontend/renderer/HudRenderer.cs new file mode 100644 index 0000000..7ce683e --- /dev/null +++ b/Mine2d/game/frontend/renderer/HudRenderer.cs @@ -0,0 +1,46 @@ +using Mine2d.engine; +using Mine2d.engine.utils; +using Mine2d.game.core; + +namespace Mine2d.game.frontend.renderer; + +public class HudRenderer : IRenderer +{ + private readonly IntPtr hotbarTexture; + + public HudRenderer() + { + var fontManager = new FontManager(Context.Get().ResourceLoader); + fontManager.RegisterFont("font", "assets.font.ttf", 12); + Context.Get().Renderer.SetFont(fontManager.GetFont("font"), new Color(255, 255, 255)); + var rl = Context.Get().ResourceLoader; + var (ptr, size) = rl.LoadToIntPtr("assets.hud.hotbar.png"); + var sdlBuffer = SDL_RWFromMem(ptr, size); + var surface = IMG_Load_RW(sdlBuffer, 1); + this.hotbarTexture = Context.Get().Renderer.CreateTextureFromSurface(surface); + SDL_FreeSurface(surface); + } + + public void Render() + { + var renderer = Context.Get().Renderer; + var uiScale = Context.Get().FrontendGameState.Settings.UiScale; + // var window = Context.Get().Window; + // var (width, height) = window.GetSize(); + var (hotbarWidth, hotbarHeight) = renderer.GetTextureSize(this.hotbarTexture); + var player = PlayerEntity.GetSelf(); + renderer.DrawTexture(this.hotbarTexture, 0, 0, hotbarWidth * uiScale, hotbarHeight * uiScale); + for (var i = 0; i < player?.inventory.Hotbar.Length; i++) + { + var stack = player.inventory.Hotbar[i]; + if (stack == null) + { + continue; + } + + var texture = stack.GetTexture(); + renderer.DrawTexture(texture, (4 + i * 20) * uiScale, 4 * uiScale, 16 * uiScale, 16 * uiScale); + renderer.DrawText(stack.Count.ToString(), (4 + i * 20) * uiScale, 20 * uiScale); + } + } +} diff --git a/Mine2d/game/state/PlayerInventory.cs b/Mine2d/game/state/PlayerInventory.cs index 1c164a1..42dff4d 100644 --- a/Mine2d/game/state/PlayerInventory.cs +++ b/Mine2d/game/state/PlayerInventory.cs @@ -9,6 +9,7 @@ public class PlayerInventory public bool PickupItemStack(ItemStack itemStack) { + Console.WriteLine("Picking up" + itemStack.Id + " " + itemStack.Count); var slot = InventoryUtils.GetFirstMatchingSlot(this.Hotbar, itemStack.Id); if (slot == -1) {