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)
{
var (texture, width, height, surfaceMessage) = CreateTextTexture(text);
var (texture, width, height, surfaceMessage) = this.CreateTextTexture(text);
var rect = new SDL_Rect
{
@ -144,7 +144,7 @@ public class Renderer
};
ProcessStatus(SDL_RenderCopy(this.renderer, texture, IntPtr.Zero, ref rect));
}
public void DrawTexture(IntPtr texture, int x, int y, int w, int h, int srcX, int srcY, int srcWidth, int srcHeight)
public void DrawTexture(IntPtr texture, int x, int y, int w, int h, int srcX, int srcY, int srcWidth, int srcHeight)
{
SDL_Rect rect = new()
{
@ -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));
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;
}
private IntPtr LoadTexture(string path)
public IntPtr LoadTexture(string path)
{
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.tiles;
using Mine2d.game.frontend;
using Mine2d.game.frontend.inventory;
using Mine2d.game.state;
namespace Mine2d.game;
@ -21,6 +22,7 @@ public class Context
public ResourceLoader ResourceLoader { get; set; }
public TextureFactory TextureFactory { get; set; }
public GameAudio GameAudio { get; set; }
public InventoryRegistry InventoryRegistry { get; set; }
public static Context Instance { get; set; }
public Context(
@ -45,6 +47,7 @@ public class Context
this.TileRegistry = new TileRegistry();
this.ItemRegistry = new ItemRegistry();
this.GameAudio = new GameAudio();
this.InventoryRegistry = new InventoryRegistry();
Instance = this;
}

View File

@ -1,12 +1,13 @@
using Mine2d.engine.system;
using Mine2d.engine.system.annotations;
using Mine2d.game.state;
namespace Mine2d.game.frontend.events;
public class InventoryInput
{
[EventListener(EventType.KeyDown)]
public static void OnKeyDown(SDL_Event e)
public static void OnKeyDownSwitchHotbar(SDL_Event e)
{
var frontendGameState = Context.Get().FrontendGameState;
frontendGameState.HotbarIndex = e.key.keysym.sym switch
@ -38,4 +39,18 @@ public class InventoryInput
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 WorldCursorRenderer());
this.renderers.Add(new HudRenderer());
this.renderers.Add(new InventoryRenderer());
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;
public enum Inventory {
None,
Player
}
public class FrontendGameState
{
public Vector2 MovementInput { get; set; }
@ -15,6 +20,7 @@ public class FrontendGameState
public string PlayerName { get; set; } = "Player";
public int HotbarIndex { get; set; }
public string Tooltip { get; set; } = "Test";
public Inventory OpenInventory { get; set; } = Inventory.None;
}
public class Settings