From cfea57e54207031c2f6cd385e8cd4dfa33a3c3fe Mon Sep 17 00:00:00 2001 From: Maurice Date: Sun, 30 Nov 2025 17:06:31 +0100 Subject: [PATCH] added player inventory --- src/de/miaurizius/jgame2d/core/GamePanel.java | 2 +- src/de/miaurizius/jgame2d/core/UI.java | 154 ++++++++++++------ .../jgame2d/core/handlers/KeyHandler.java | 40 ++++- .../jgame2d/core/handlers/Sound.java | 1 + src/de/miaurizius/jgame2d/entity/Entity.java | 1 + src/de/miaurizius/jgame2d/entity/Player.java | 13 ++ .../jgame2d/entity/item/KeyObj.java | 3 +- .../jgame2d/entity/item/ShieldWoodObj.java | 3 +- .../jgame2d/entity/item/SwordNormalObj.java | 3 +- 9 files changed, 166 insertions(+), 54 deletions(-) diff --git a/src/de/miaurizius/jgame2d/core/GamePanel.java b/src/de/miaurizius/jgame2d/core/GamePanel.java index 340a253..fc6f3c2 100644 --- a/src/de/miaurizius/jgame2d/core/GamePanel.java +++ b/src/de/miaurizius/jgame2d/core/GamePanel.java @@ -40,7 +40,7 @@ public class GamePanel extends JPanel implements Runnable { public AssetSetter assetSetter = new AssetSetter(this); public UI ui = new UI(this); public EventHandler eventH = new EventHandler(this); - Sound se = new Sound(); + public Sound se = new Sound(); Sound music = new Sound(); Thread gameThread; diff --git a/src/de/miaurizius/jgame2d/core/UI.java b/src/de/miaurizius/jgame2d/core/UI.java index f0a5d19..1a05442 100644 --- a/src/de/miaurizius/jgame2d/core/UI.java +++ b/src/de/miaurizius/jgame2d/core/UI.java @@ -7,6 +7,7 @@ import de.miaurizius.jgame2d.entity.item.HeartObj; import java.awt.*; import java.awt.image.BufferedImage; import java.util.ArrayList; +import java.util.Arrays; public class UI { @@ -18,6 +19,7 @@ public class UI { ArrayList messageCounter = new ArrayList<>(); public String currentDialogue; public int commandNum; + public int slotCol, slotRow; public UI(GamePanel panel) { this.panel = panel; @@ -103,6 +105,106 @@ public class UI { } } } + public void drawCharStats() { + // DRAW FRAME + final int frameX = panel.tileSize; + final int frameY = panel.tileSize; + final int frameWidth = panel.tileSize*5; + final int frameHeight = panel.tileSize*10; + drawSubWindow(frameX, frameY, frameWidth, frameHeight); + + // TEXT + graphics2d.setColor(Color.white); + graphics2d.setFont(graphics2d.getFont().deriveFont(22F)); + + int textX = frameX + 20; + int textY = frameY + panel.tileSize; + final int lineHeight = 35; + + // NAMES + String[] names = {"Level", "Life", "Strength", "Dexterity", "Attack", "Defense", "Exp", "Next Level", "Coins", "Weapon", "Shield"}; + for(String name : names) { + graphics2d.drawString(name, textX, textY); + textY += lineHeight + (name.equals("Coins") ? 20 : (name.equals("Weapon") ? 15 : 0)); + } + + // VALUES + int tailX = (frameX + frameWidth) - 30; + textY = frameY + panel.tileSize; + String[] values = { + String.valueOf(panel.player.level), + (panel.player.life + "/" + panel.player.maxLife), + String.valueOf(panel.player.strength), + String.valueOf(panel.player.dexterity), + String.valueOf(panel.player.attack), + String.valueOf(panel.player.defense), + String.valueOf(panel.player.exp), + String.valueOf(panel.player.nextLevelExp), + String.valueOf(panel.player.coins) + }; + for(String value : values) { + textX = getAlignedToRightX(value, tailX); + graphics2d.drawString(value, textX, textY); + textY += lineHeight; + } + + graphics2d.drawImage(panel.player.currentWeapon.down1, tailX - panel.tileSize, textY-14, null); + textY += panel.tileSize; + graphics2d.drawImage(panel.player.currentShield.down1, tailX - panel.tileSize, textY-14, null); + } + public void drawInventory() { + // DRAW FRAME + int frameX = panel.tileSize*9; + int frameY = panel.tileSize; + int frameWidth = panel.tileSize*6; + int frameHeight = panel.tileSize*5; + drawSubWindow(frameX, frameY, frameWidth, frameHeight); + + // SLOT + final int slotXStart = frameX + 20; + final int slotYStart = frameY + 20; + int slotX = slotXStart; + int slotY = slotYStart; + int slotSize = panel.tileSize+3; + + // DRAW PLAYER ITEMS + for(int i = 0; i < panel.player.inventory.size(); i++) { + graphics2d.drawImage(panel.player.inventory.get(i).down1, slotX, slotY, null); + slotX += slotSize; + if (i == 4 || i == 9 || i == 14) { + slotX = slotXStart; + slotY += slotSize; + } + } + + // CURSOR + int curserX = slotXStart + (slotSize*slotCol); + int curserY = slotYStart + (slotSize*slotRow); + int curserHeight = panel.tileSize; + int curserWidth = panel.tileSize; + + graphics2d.setColor(Color.white); + graphics2d.setStroke(new BasicStroke(3)); + graphics2d.drawRoundRect(curserX, curserY, curserWidth, curserHeight, 10, 10); + + // DESCRIPTION FRAME + int dFrameX = frameX; + int dFrameY = frameY + frameHeight; + int dFrameWidth = frameWidth; + int dFrameHeight = panel.tileSize*3; + drawSubWindow(dFrameX, dFrameY, dFrameWidth, dFrameHeight); + + // DRAW DESCRIPTION + int textX = dFrameX + 20; + int textY = dFrameY + panel.tileSize; + graphics2d.setFont(graphics2d.getFont().deriveFont(23F)); + int itemIndex = getItemIndex(); + if(itemIndex < panel.player.inventory.size()) + for(String line : panel.player.inventory.get(itemIndex).description.split("\n")) { + graphics2d.drawString(line, textX, textY); + textY += 32; + } + } // GAME STATES public void drawPauseScreen() { @@ -169,51 +271,8 @@ public class UI { if(commandNum == 2) graphics2d.drawString(">", x-panel.tileSize, y); } public void drawCharacterScreen() { - // DRAW FRAME - final int frameX = panel.tileSize; - final int frameY = panel.tileSize; - final int frameWidth = panel.tileSize*5; - final int frameHeight = panel.tileSize*10; - drawSubWindow(frameX, frameY, frameWidth, frameHeight); - - // TEXT - graphics2d.setColor(Color.white); - graphics2d.setFont(graphics2d.getFont().deriveFont(22F)); - - int textX = frameX + 20; - int textY = frameY + panel.tileSize; - final int lineHeight = 35; - - // NAMES - String[] names = {"Level", "Life", "Strength", "Dexterity", "Attack", "Defense", "Exp", "Next Level", "Coins", "Weapon", "Shield"}; - for(String name : names) { - graphics2d.drawString(name, textX, textY); - textY += lineHeight + (name.equals("Coins") ? 20 : (name.equals("Weapon") ? 15 : 0)); - } - - // VALUES - int tailX = (frameX + frameWidth) - 30; - textY = frameY + panel.tileSize; - String[] values = { - String.valueOf(panel.player.level), - (panel.player.life + "/" + panel.player.maxLife), - String.valueOf(panel.player.strength), - String.valueOf(panel.player.dexterity), - String.valueOf(panel.player.attack), - String.valueOf(panel.player.defense), - String.valueOf(panel.player.exp), - String.valueOf(panel.player.nextLevelExp), - String.valueOf(panel.player.coins) - }; - for(String value : values) { - textX = getAlignedToRightX(value, tailX); - graphics2d.drawString(value, textX, textY); - textY += lineHeight; - } - - graphics2d.drawImage(panel.player.currentWeapon.down1, tailX - panel.tileSize, textY-14, null); - textY += panel.tileSize; - graphics2d.drawImage(panel.player.currentShield.down1, tailX - panel.tileSize, textY-14, null); + drawCharStats(); + drawInventory(); } public void drawPlayScreen() { drawPlayerLife(); @@ -232,11 +291,14 @@ public class UI { return panel.screenWidth / 2 - (int) graphics2d.getFontMetrics().getStringBounds(text, graphics2d).getWidth() / 2; } public int getAlignedToRightX(String text, int tailX) { - return tailX - (int) graphics2d.getFontMetrics().getStringBounds(text, graphics2d).getWidth() / 2; + return tailX - (int) graphics2d.getFontMetrics().getStringBounds(text, graphics2d).getWidth(); } public void addMessage(String text) { messages.add(text); messageCounter.add(0); } + public int getItemIndex() { + return slotCol + slotRow*5; + } } diff --git a/src/de/miaurizius/jgame2d/core/handlers/KeyHandler.java b/src/de/miaurizius/jgame2d/core/handlers/KeyHandler.java index a48c8b4..7e80d28 100644 --- a/src/de/miaurizius/jgame2d/core/handlers/KeyHandler.java +++ b/src/de/miaurizius/jgame2d/core/handlers/KeyHandler.java @@ -69,9 +69,37 @@ public class KeyHandler implements KeyListener { panel.gameState = GameState.PLAY; } } - public void handleCharacter(int code) { - // EXIT STATE - if(code == KeyEvent.VK_C) panel.gameState = GameState.PLAY; + public void handleCharacter(int code) throws InterruptedException { + switch (code) { + case KeyEvent.VK_UP: + if(panel.ui.slotRow == 0) break; + if(panel.se.clips[9].isRunning()) break; + panel.ui.slotRow--; + panel.playSE(9); + break; + case KeyEvent.VK_DOWN: + if(panel.ui.slotRow == 3) break; + if(panel.se.clips[9].isRunning()) break; + panel.ui.slotRow++; + panel.playSE(9); + break; + case KeyEvent.VK_LEFT: + if(panel.ui.slotCol == 0) break; + if(panel.se.clips[9].isRunning()) break; + panel.ui.slotCol--; + panel.playSE(9); + break; + case KeyEvent.VK_RIGHT: + if(panel.ui.slotCol == 4) break; + if(panel.se.clips[9].isRunning()) break; + panel.ui.slotCol++; + panel.playSE(9); + break; + // EXIT STATE + case KeyEvent.VK_C: + panel.gameState = GameState.PLAY; + break; + } } // KEY-LISTENER @@ -94,7 +122,11 @@ public class KeyHandler implements KeyListener { handlePause(code); break; case CHARACTER: - handleCharacter(code); + try { + handleCharacter(code); + } catch (InterruptedException ex) { + throw new RuntimeException(ex); + } break; } } diff --git a/src/de/miaurizius/jgame2d/core/handlers/Sound.java b/src/de/miaurizius/jgame2d/core/handlers/Sound.java index 7e37dd6..a41c584 100644 --- a/src/de/miaurizius/jgame2d/core/handlers/Sound.java +++ b/src/de/miaurizius/jgame2d/core/handlers/Sound.java @@ -25,6 +25,7 @@ public class Sound { load(6, "assets/sounds/receivedamage.wav"); load(7, "assets/sounds/blocked.wav"); load(8, "assets/sounds/levelup.wav"); + load(9, "assets/sounds/cursor.wav"); } @Deprecated diff --git a/src/de/miaurizius/jgame2d/entity/Entity.java b/src/de/miaurizius/jgame2d/entity/Entity.java index 10bbf8c..0b08284 100644 --- a/src/de/miaurizius/jgame2d/entity/Entity.java +++ b/src/de/miaurizius/jgame2d/entity/Entity.java @@ -64,6 +64,7 @@ public class Entity { // ITEM ATTRIBUTES public int attackValue; public int defenseValue; + public String description; public Entity(GamePanel panel) { this.panel = panel; diff --git a/src/de/miaurizius/jgame2d/entity/Player.java b/src/de/miaurizius/jgame2d/entity/Player.java index aca87d2..5264e2b 100644 --- a/src/de/miaurizius/jgame2d/entity/Player.java +++ b/src/de/miaurizius/jgame2d/entity/Player.java @@ -5,10 +5,12 @@ import de.miaurizius.jgame2d.core.enums.Direction; import de.miaurizius.jgame2d.core.enums.EntityType; import de.miaurizius.jgame2d.core.enums.GameState; import de.miaurizius.jgame2d.core.handlers.KeyHandler; +import de.miaurizius.jgame2d.entity.item.KeyObj; import de.miaurizius.jgame2d.entity.item.ShieldWoodObj; import de.miaurizius.jgame2d.entity.item.SwordNormalObj; import java.awt.*; +import java.util.ArrayList; public class Player extends Entity { @@ -18,6 +20,7 @@ public class Player extends Entity { // STATE public boolean attackCancel; + public ArrayList inventory = new ArrayList<>(); public Player(GamePanel panel, KeyHandler keyH) { super(panel); @@ -238,6 +241,16 @@ public class Player extends Entity { currentShield = new ShieldWoodObj(panel); attack = getAttack(); defense = getDefense(); + + // INVENTORY + inventory.add(currentWeapon); + inventory.add(currentShield); + inventory.add(new KeyObj(panel)); + inventory.add(new KeyObj(panel)); + inventory.add(new KeyObj(panel)); + inventory.add(new KeyObj(panel)); + inventory.add(new KeyObj(panel)); + inventory.add(new KeyObj(panel)); } public int getAttack() { return attack = strength * currentWeapon.attackValue; diff --git a/src/de/miaurizius/jgame2d/entity/item/KeyObj.java b/src/de/miaurizius/jgame2d/entity/item/KeyObj.java index 91834e9..20f63f5 100644 --- a/src/de/miaurizius/jgame2d/entity/item/KeyObj.java +++ b/src/de/miaurizius/jgame2d/entity/item/KeyObj.java @@ -8,7 +8,8 @@ public class KeyObj extends Entity { public KeyObj(GamePanel panel) { super(panel); - name = "key"; + name = "Normal Key"; + description = "[" + name + "]\nIt opens a door."; type = EntityType.ITEM; down1 = initEntitySprites("objects/key"); } diff --git a/src/de/miaurizius/jgame2d/entity/item/ShieldWoodObj.java b/src/de/miaurizius/jgame2d/entity/item/ShieldWoodObj.java index cec267d..5aef619 100644 --- a/src/de/miaurizius/jgame2d/entity/item/ShieldWoodObj.java +++ b/src/de/miaurizius/jgame2d/entity/item/ShieldWoodObj.java @@ -8,7 +8,8 @@ public class ShieldWoodObj extends Entity { public ShieldWoodObj(GamePanel panel) { super(panel); - name = "shield-wood"; + name = "Wooden Shield"; + description = "[" + name + "]\nAn old shield.\nIt's not that strong but\nit does its job."; type = EntityType.ITEM; down1 = initEntitySprites("objects/shield_wood"); defenseValue = 1; diff --git a/src/de/miaurizius/jgame2d/entity/item/SwordNormalObj.java b/src/de/miaurizius/jgame2d/entity/item/SwordNormalObj.java index 44c7be3..3ee639d 100644 --- a/src/de/miaurizius/jgame2d/entity/item/SwordNormalObj.java +++ b/src/de/miaurizius/jgame2d/entity/item/SwordNormalObj.java @@ -9,7 +9,8 @@ public class SwordNormalObj extends Entity { public SwordNormalObj(GamePanel panel) { super(panel); - name = "sword-normal"; + name = "Normal Sword"; + description = "[" + name + "]\nAn old sword."; type = EntityType.ITEM; down1 = initEntitySprites("objects/sword_normal"); attackValue = 1;