added inventory toggle

This commit is contained in:
MasterGordon 2022-12-20 02:52:38 +01:00
parent 06d8c5bacf
commit 37fed3a624
12 changed files with 116 additions and 5 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

View File

@ -102,7 +102,7 @@ public class Renderer
public void DrawText(string text, int x, int y, bool center = false) public void DrawText(string text, int x, int y, bool center = false)
{ {
var (texture, width, height, surfaceMessage) = CreateTextTexture(text); var (texture, width, height, surfaceMessage) = this.CreateTextTexture(text);
var rect = new SDL_Rect var rect = new SDL_Rect
{ {
@ -200,9 +200,14 @@ public void DrawTexture(IntPtr texture, int x, int y, int w, int h, int srcX, in
} }
} }
internal (int srcW, int srcH) GetTextureSize(IntPtr src) public (int srcW, int srcH) GetTextureSize(IntPtr src)
{ {
ProcessStatus(SDL_QueryTexture(src, out _, out _, out var srcW, out var srcH)); ProcessStatus(SDL_QueryTexture(src, out _, out _, out var srcW, out var srcH));
return (srcW, srcH); return (srcW, srcH);
} }
public void SetDrawBlendMode(SDL_BlendMode blendMode)
{
ProcessStatus(SDL_SetRenderDrawBlendMode(this.renderer, blendMode));
}
} }

View File

@ -35,7 +35,7 @@ public class TextureFactory
return target; return target;
} }
private IntPtr LoadTexture(string path) public IntPtr LoadTexture(string path)
{ {
if (this.textureCache.TryGetValue(path, out var value)) if (this.textureCache.TryGetValue(path, out var value))
{ {

View File

@ -3,6 +3,7 @@ using Mine2d.engine.networking;
using Mine2d.game.core.items; using Mine2d.game.core.items;
using Mine2d.game.core.tiles; using Mine2d.game.core.tiles;
using Mine2d.game.frontend; using Mine2d.game.frontend;
using Mine2d.game.frontend.inventory;
using Mine2d.game.state; using Mine2d.game.state;
namespace Mine2d.game; namespace Mine2d.game;
@ -21,6 +22,7 @@ public class Context
public ResourceLoader ResourceLoader { get; set; } public ResourceLoader ResourceLoader { get; set; }
public TextureFactory TextureFactory { get; set; } public TextureFactory TextureFactory { get; set; }
public GameAudio GameAudio { get; set; } public GameAudio GameAudio { get; set; }
public InventoryRegistry InventoryRegistry { get; set; }
public static Context Instance { get; set; } public static Context Instance { get; set; }
public Context( public Context(
@ -45,6 +47,7 @@ public class Context
this.TileRegistry = new TileRegistry(); this.TileRegistry = new TileRegistry();
this.ItemRegistry = new ItemRegistry(); this.ItemRegistry = new ItemRegistry();
this.GameAudio = new GameAudio(); this.GameAudio = new GameAudio();
this.InventoryRegistry = new InventoryRegistry();
Instance = this; Instance = this;
} }

View File

@ -1,12 +1,13 @@
using Mine2d.engine.system; using Mine2d.engine.system;
using Mine2d.engine.system.annotations; using Mine2d.engine.system.annotations;
using Mine2d.game.state;
namespace Mine2d.game.frontend.events; namespace Mine2d.game.frontend.events;
public class InventoryInput public class InventoryInput
{ {
[EventListener(EventType.KeyDown)] [EventListener(EventType.KeyDown)]
public static void OnKeyDown(SDL_Event e) public static void OnKeyDownSwitchHotbar(SDL_Event e)
{ {
var frontendGameState = Context.Get().FrontendGameState; var frontendGameState = Context.Get().FrontendGameState;
frontendGameState.HotbarIndex = e.key.keysym.sym switch frontendGameState.HotbarIndex = e.key.keysym.sym switch
@ -38,4 +39,18 @@ public class InventoryInput
frontendGameState.HotbarIndex = 0; frontendGameState.HotbarIndex = 0;
} }
} }
[EventListener(EventType.KeyDown)]
public static void OnKeyDownOpenInventory(SDL_Event e)
{
var frontendGameState = Context.Get().FrontendGameState;
if(e.key.keysym.sym == SDL_Keycode.SDLK_TAB)
{
if(frontendGameState.OpenInventory != Inventory.Player) {
frontendGameState.OpenInventory = Inventory.Player;
} else {
frontendGameState.OpenInventory = Inventory.None;
}
}
}
} }

View File

@ -0,0 +1,6 @@
namespace Mine2d.game.frontend.inventory;
public static class InventoryConstants
{
public static readonly int ExtraSlotsWidth = 21;
}

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Mine2d.game.state;
namespace Mine2d.game.frontend.inventory;
public class InventoryRegistry
{
private readonly Dictionary<Inventory, IInventoryRenderer> inventoryRenderers = new();
public InventoryRegistry()
{
this.inventoryRenderers.Add(Inventory.Player, new PlayerInventoryRenderer());
}
public IInventoryRenderer GetRenderer(Inventory inventory)
{
return this.inventoryRenderers[inventory];
}
}

View File

@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Mine2d.engine;
namespace Mine2d.game.frontend.inventory;
public interface IInventoryRenderer : IRenderer
{
}

View File

@ -0,0 +1,23 @@
namespace Mine2d.game.frontend.inventory
{
public class PlayerInventoryRenderer : IInventoryRenderer
{
private IntPtr texture = IntPtr.Zero;
public void Render()
{
var ctx = Context.Get();
if(this.texture == IntPtr.Zero) {
this.texture = ctx.TextureFactory.LoadTexture("hud.player-inventory");
}
var (width, height) = ctx.Renderer.GetTextureSize(this.texture);
width *= ctx.FrontendGameState.Settings.UiScale;
height *= ctx.FrontendGameState.Settings.UiScale;
var extraSlotsWidth = InventoryConstants.ExtraSlotsWidth * ctx.FrontendGameState.Settings.UiScale;
var (windowWidth, windowHeight) = (ctx.FrontendGameState.WindowWidth, ctx.FrontendGameState.WindowHeight);
var x = (windowWidth - (width - extraSlotsWidth)) / 2;
var y = (windowHeight - height) / 2;
ctx.Renderer.DrawTexture(this.texture, x, y, width, height);
}
}
}

View File

@ -14,6 +14,7 @@ public class GameRenderer : IRenderer
this.renderers.Add(new ItemRenderer()); this.renderers.Add(new ItemRenderer());
this.renderers.Add(new WorldCursorRenderer()); this.renderers.Add(new WorldCursorRenderer());
this.renderers.Add(new HudRenderer()); this.renderers.Add(new HudRenderer());
this.renderers.Add(new InventoryRenderer());
this.renderers.Add(new TooltipRenderer()); this.renderers.Add(new TooltipRenderer());
} }

View File

@ -0,0 +1,19 @@
using Mine2d.engine;
using Mine2d.game.state;
namespace Mine2d.game.frontend.renderer
{
public class InventoryRenderer : IRenderer
{
public void Render() {
var ctx = Context.Get();
var inventory = ctx.FrontendGameState.OpenInventory;
if(inventory == Inventory.None) return;
ctx.Renderer.SetColor(0, 0, 0, 200);
ctx.Renderer.SetDrawBlendMode(SDL_BlendMode.SDL_BLENDMODE_BLEND);
ctx.Renderer.DrawRect(0, 0, ctx.FrontendGameState.WindowWidth, ctx.FrontendGameState.WindowHeight);
var inventoryRenderer = ctx.InventoryRegistry.GetRenderer(inventory);
inventoryRenderer.Render();
}
}
}

View File

@ -2,6 +2,11 @@ using Mine2d.game.core;
namespace Mine2d.game.state; namespace Mine2d.game.state;
public enum Inventory {
None,
Player
}
public class FrontendGameState public class FrontendGameState
{ {
public Vector2 MovementInput { get; set; } public Vector2 MovementInput { get; set; }
@ -15,6 +20,7 @@ public class FrontendGameState
public string PlayerName { get; set; } = "Player"; public string PlayerName { get; set; } = "Player";
public int HotbarIndex { get; set; } public int HotbarIndex { get; set; }
public string Tooltip { get; set; } = "Test"; public string Tooltip { get; set; } = "Test";
public Inventory OpenInventory { get; set; } = Inventory.None;
} }
public class Settings public class Settings