diff --git a/Mine2d/assets/hud/hotbar-active.png b/Mine2d/assets/hud/hotbar-active.png new file mode 100644 index 0000000..b94b41f Binary files /dev/null and b/Mine2d/assets/hud/hotbar-active.png differ diff --git a/Mine2d/engine/EventService.cs b/Mine2d/engine/EventService.cs index 8a77635..b9e226c 100644 --- a/Mine2d/engine/EventService.cs +++ b/Mine2d/engine/EventService.cs @@ -38,6 +38,10 @@ public class EventService { EventPublisher.Publish(EventType.KeyUp, e); } + if (e.type == SDL_EventType.SDL_MOUSEWHEEL) + { + EventPublisher.Publish(EventType.MouseWheel, e); + } } } } diff --git a/Mine2d/engine/system/EventType.cs b/Mine2d/engine/system/EventType.cs index 95546f7..9cc0d4d 100644 --- a/Mine2d/engine/system/EventType.cs +++ b/Mine2d/engine/system/EventType.cs @@ -9,4 +9,5 @@ public enum EventType KeyDown, KeyUp, WindowResize, + MouseWheel, } diff --git a/Mine2d/game/frontend/events/InventoryInput.cs b/Mine2d/game/frontend/events/InventoryInput.cs new file mode 100644 index 0000000..4a7bcb0 --- /dev/null +++ b/Mine2d/game/frontend/events/InventoryInput.cs @@ -0,0 +1,41 @@ +using Mine2d.engine.system; +using Mine2d.engine.system.annotations; + +namespace Mine2d.game.frontend.events; + +public class InventoryInput +{ + [EventListener(EventType.KeyDown)] + public static void OnKeyDown(SDL_Event e) + { + var frontendGameState = Context.Get().FrontendGameState; + frontendGameState.HotbarIndex = e.key.keysym.sym switch + { + SDL_Keycode.SDLK_1 => 0, + SDL_Keycode.SDLK_2 => 1, + SDL_Keycode.SDLK_3 => 2, + SDL_Keycode.SDLK_4 => 3, + SDL_Keycode.SDLK_5 => 4, + SDL_Keycode.SDLK_6 => 5, + SDL_Keycode.SDLK_7 => 6, + SDL_Keycode.SDLK_8 => 7, + SDL_Keycode.SDLK_9 => 8, + _ => frontendGameState.HotbarIndex + }; + } + + [EventListener(EventType.MouseWheel)] + public static void OnMouseWheel(SDL_Event e) + { + var frontendGameState = Context.Get().FrontendGameState; + frontendGameState.HotbarIndex -= e.wheel.y; + if (frontendGameState.HotbarIndex < 0) + { + frontendGameState.HotbarIndex = 8; + } + if (frontendGameState.HotbarIndex > 8) + { + frontendGameState.HotbarIndex = 0; + } + } +} diff --git a/Mine2d/game/frontend/renderer/HudRenderer.cs b/Mine2d/game/frontend/renderer/HudRenderer.cs index 20bc58b..42436b2 100644 --- a/Mine2d/game/frontend/renderer/HudRenderer.cs +++ b/Mine2d/game/frontend/renderer/HudRenderer.cs @@ -7,6 +7,7 @@ namespace Mine2d.game.frontend.renderer; public class HudRenderer : IRenderer { private readonly IntPtr hotbarTexture; + private readonly IntPtr hotbarActiveTexture; public HudRenderer() { @@ -19,17 +20,24 @@ public class HudRenderer : IRenderer var surface = IMG_Load_RW(sdlBuffer, 1); this.hotbarTexture = Context.Get().Renderer.CreateTextureFromSurface(surface); SDL_FreeSurface(surface); + (ptr, size) = rl.LoadToIntPtr("assets.hud.hotbar-active.png"); + sdlBuffer = SDL_RWFromMem(ptr, size); + surface = IMG_Load_RW(sdlBuffer, 1); + this.hotbarActiveTexture = Context.Get().Renderer.CreateTextureFromSurface(surface); + SDL_FreeSurface(surface); } public void Render() { var renderer = Context.Get().Renderer; var uiScale = Context.Get().FrontendGameState.Settings.UiScale; + var activeSlot = Context.Get().FrontendGameState.HotbarIndex; // 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); + renderer.DrawTexture(this.hotbarActiveTexture, activeSlot * 24 * uiScale, 0, 24 * uiScale, 24 * uiScale); for (var i = 0; i < player?.Inventory.Hotbar.Length; i++) { var stack = player.Inventory.Hotbar[i]; @@ -40,7 +48,7 @@ public class HudRenderer : IRenderer 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); + renderer.DrawText("" + stack.Count, (4 + i * 20) * uiScale, 20 * uiScale); } } } diff --git a/Mine2d/game/state/GameState.cs b/Mine2d/game/state/GameState.cs index 92c6a5e..7a0918a 100644 --- a/Mine2d/game/state/GameState.cs +++ b/Mine2d/game/state/GameState.cs @@ -14,6 +14,7 @@ public class FrontendGameState public Vector2 MousePosition { get; set; } public Settings Settings { get; set; } = new Settings(); public string PlayerName { get; set; } = "Player"; + public int HotbarIndex { get; set; } } public class Settings