From fa037677e4633ba39f05509dd320a0d5365a6ffe Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Wed, 7 Dec 2022 19:16:41 +0100 Subject: [PATCH] added hotbar --- Mine2d/+ | 61 ------------------ Mine2d/assets/audio/block_hit_alt.wav | Bin 0 -> 35276 bytes Mine2d/assets/hud/hotbar.png | Bin 0 -> 277 bytes Mine2d/game/backend/interactor/ItemPhysics.cs | 10 ++- Mine2d/game/core/InventoryUtils.cs | 25 +++++++ Mine2d/game/core/PlayerEntity.cs | 7 ++ Mine2d/game/core/data/ItemStack.cs | 7 ++ Mine2d/game/frontend/GameAudio.cs | 2 +- Mine2d/game/state/GameState.cs | 2 +- Mine2d/game/state/Player.cs | 1 + Mine2d/game/state/PlayerInventory.cs | 27 ++++++++ 11 files changed, 76 insertions(+), 66 deletions(-) delete mode 100644 Mine2d/+ create mode 100644 Mine2d/assets/audio/block_hit_alt.wav create mode 100644 Mine2d/assets/hud/hotbar.png create mode 100644 Mine2d/game/core/InventoryUtils.cs create mode 100644 Mine2d/game/core/data/ItemStack.cs create mode 100644 Mine2d/game/state/PlayerInventory.cs diff --git a/Mine2d/+ b/Mine2d/+ deleted file mode 100644 index 1408d5e..0000000 --- a/Mine2d/+ +++ /dev/null @@ -1,61 +0,0 @@ -using Mine2d.engine; -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; - } - } - } - } - - [Interaction(InteractorKind.Hybrid, "tick")] - public static void Pickup() - { - 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) - { - foreach (var player in gameState.Players) - { - - var items = chunk.Value.Entities.RemoveAll(e => - { - return e is ItemEntity itemEntity && (player.GetCenter() - itemEntity.Position).LengthSquared() < 8 * 8; - }); - if (items > 0) - { - Context.Get().GameAudio.Play(Sound.ItemPickup); - } - } - } - } - } -} diff --git a/Mine2d/assets/audio/block_hit_alt.wav b/Mine2d/assets/audio/block_hit_alt.wav new file mode 100644 index 0000000000000000000000000000000000000000..0484f04094e9180192d87ae223d7b706a463dbab GIT binary patch literal 35276 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 PhLlb^#2YKJr7+8X^-b7M literal 0 HcmV?d00001 diff --git a/Mine2d/assets/hud/hotbar.png b/Mine2d/assets/hud/hotbar.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc53133059db1b0571b5b74488a5ce136419dcc GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^H-K1zgAGW|IAI(Kq!^2X+?^QKos)S9&5R!c_qKK#Y~ZYbwTy2N}t*}g`oNwhl+&+za)Ly6(u0N!1u14`=mMB zFHd=qy8qSd*XpG+f>`ERsr5gN`fBx&2{7rki>Vvx< zhQEAW?{!~S$;8MYBPHQN#;XIzB);o+$bR`6{@PzU;yL^E>+xIPiwR0eN0Pj!l~-?~qj2dZ$(pL)3$um3*>iZqzkGJ2?e_Uc~0 RGZ*MJ22WQ%mvv4FO#p`wc}oBQ literal 0 HcmV?d00001 diff --git a/Mine2d/game/backend/interactor/ItemPhysics.cs b/Mine2d/game/backend/interactor/ItemPhysics.cs index 060aea5..fe71785 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.core.data; using Mine2d.game.core.data.entities; namespace Mine2d.game.backend.interactor; @@ -44,14 +45,17 @@ public class ItemPhysics foreach (var player in gameState.Players) { - var items = chunk.Value.Entities.RemoveAll(e => + var items = chunk.Value.Entities.Where(e => { - return e is ItemEntity itemEntity && (player.Position + new Vector2(7, 3) - itemEntity.Position).LengthSquared() < 8 * 8; + 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 }); }); - if (items > 0) + if (items.Any()) { Context.Get().GameAudio.Play(Sound.ItemPickup); } + _ = chunk.Value.Entities.RemoveAll(e => items.Contains(e)); } } } diff --git a/Mine2d/game/core/InventoryUtils.cs b/Mine2d/game/core/InventoryUtils.cs new file mode 100644 index 0000000..cfcdec1 --- /dev/null +++ b/Mine2d/game/core/InventoryUtils.cs @@ -0,0 +1,25 @@ +using Mine2d.game.core.data; + +namespace Mine2d.game.core; + +public static class InventoryUtils +{ + public static int GetFirstMatchingSlot(ItemStack[] inventory, ItemId id) + { + for (var i = 0; i < inventory.Length; i++) + { + if (inventory[i] != null && inventory[i].Id == id) + { + return i; + } + } + for (var i = 0; i < inventory.Length; i++) + { + if (inventory[i] == null) + { + return i; + } + } + return -1; + } +} diff --git a/Mine2d/game/core/PlayerEntity.cs b/Mine2d/game/core/PlayerEntity.cs index 7d1a3cb..f96daec 100644 --- a/Mine2d/game/core/PlayerEntity.cs +++ b/Mine2d/game/core/PlayerEntity.cs @@ -22,6 +22,13 @@ public class PlayerEntity { p.Movement += Constants.Gravity; p.Position += p.Movement; + if (p.Movement.Y > 8) + { + p.Movement = p.Movement with + { + Y = 8 + }; + } } public static void Collide(Player p) diff --git a/Mine2d/game/core/data/ItemStack.cs b/Mine2d/game/core/data/ItemStack.cs new file mode 100644 index 0000000..0b22406 --- /dev/null +++ b/Mine2d/game/core/data/ItemStack.cs @@ -0,0 +1,7 @@ +namespace Mine2d.game.core.data; + +public class ItemStack +{ + public ItemId Id { get; set; } + public int Count { get; set; } +} diff --git a/Mine2d/game/frontend/GameAudio.cs b/Mine2d/game/frontend/GameAudio.cs index fd921e2..e8bf752 100644 --- a/Mine2d/game/frontend/GameAudio.cs +++ b/Mine2d/game/frontend/GameAudio.cs @@ -10,7 +10,7 @@ public class GameAudio { this.audioPlayer = new(); this.audioPlayer.Register(Sound.BlockBreak, "assets.audio.block_break.wav"); - this.audioPlayer.Register(Sound.BlockHit, "assets.audio.block_hit.wav"); + this.audioPlayer.Register(Sound.BlockHit, "assets.audio.block_hit_alt.wav"); this.audioPlayer.Register(Sound.ItemPickup, "assets.audio.item_pickup.wav"); } diff --git a/Mine2d/game/state/GameState.cs b/Mine2d/game/state/GameState.cs index c33c2e8..92c6a5e 100644 --- a/Mine2d/game/state/GameState.cs +++ b/Mine2d/game/state/GameState.cs @@ -18,7 +18,7 @@ public class FrontendGameState public class Settings { - public int GameScale { get; set; } = 4; + public int GameScale { get; set; } = 6; public int UiScale { get; set; } = 4; public bool ShowCollision { get; set; } = true; public bool Fullscreen { get; set; } = false; diff --git a/Mine2d/game/state/Player.cs b/Mine2d/game/state/Player.cs index d1f4b18..18c3ac8 100644 --- a/Mine2d/game/state/Player.cs +++ b/Mine2d/game/state/Player.cs @@ -8,6 +8,7 @@ public class Player public Guid Id { get; set; } public Vector2 Mining { get; set; } public int MiningCooldown { get; set; } + public PlayerInventory inventory { get; set; } = new(); public Vector2 GetCenter() { diff --git a/Mine2d/game/state/PlayerInventory.cs b/Mine2d/game/state/PlayerInventory.cs new file mode 100644 index 0000000..1c164a1 --- /dev/null +++ b/Mine2d/game/state/PlayerInventory.cs @@ -0,0 +1,27 @@ +using Mine2d.game.core; +using Mine2d.game.core.data; + +namespace Mine2d.game.state; + +public class PlayerInventory +{ + public ItemStack[] Hotbar { get; set; } = new ItemStack[9]; + + public bool PickupItemStack(ItemStack itemStack) + { + var slot = InventoryUtils.GetFirstMatchingSlot(this.Hotbar, itemStack.Id); + if (slot == -1) + { + return false; + } + if (this.Hotbar[slot] == null) + { + this.Hotbar[slot] = itemStack; + } + else + { + this.Hotbar[slot].Count += itemStack.Count; + } + return true; + } +}