Browse Source

Inventory implementierung

BuildTools 7 months ago
parent
commit
05ba927d85

+ 4 - 3
src/main/java/controller/MouseListener.java

@@ -28,8 +28,7 @@ public class MouseListener extends MouseMotionAdapter implements java.awt.event.
     public void mouseDragged(MouseEvent e) {
         if(gp.gameState == GAMESTATE.PAUSED) return;
         if(gp.gameState == GAMESTATE.INVENTORY){
-            System.out.println(e.getX()/gp.tileSize);
-            gp.highlightTile(e.getX(), e.getY());
+
         }else{
             int diffY = startY - e.getY();
             int diffX = startX - e.getX();
@@ -43,7 +42,9 @@ public class MouseListener extends MouseMotionAdapter implements java.awt.event.
 
     @Override
     public void mouseClicked(MouseEvent e) {
-
+        if(gp.gameState == GAMESTATE.INVENTORY && e.getButton() == 1){
+            gp.inventory.select(e.getX(), e.getY());
+        }
     }
 
     @Override

+ 49 - 3
src/main/java/model/Inventory.java

@@ -1,15 +1,61 @@
 package model;
 
+import model.items.ITEM_NAME;
+import view.GamePanel;
+import view.InventoryView;
+
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
 
 public class Inventory {
     private int uniqueItemsCount;
-    private ArrayList<Item> itemArrayList;
-    public Inventory() {
-        uniqueItemsCount = 5;
+    private HashMap<ITEM_NAME, Item> itemHashMap;
+    private GamePanel gp;
+    public Inventory(GamePanel gamePanel) {
+        gp = gamePanel;
+        uniqueItemsCount = 0;
+        itemHashMap = new HashMap<>();
+
+        //test
+        addToInventory(new Item(ITEM_NAME.STONE));
+        addToInventory(new Item(ITEM_NAME.WOOD));
+        addToInventory(new Item(ITEM_NAME.WOOD));
+    }
+
+    public Item addToInventory(Item item){
+        if(itemHashMap.containsKey(item.getItemName())){
+            itemHashMap.get(item.getItemName()).addItemToStack(item);
+        }else{
+            if(itemHashMap.size() <= uniqueItemsCount){
+                itemHashMap.put(item.getItemName(), item);
+                uniqueItemsCount += 1;
+            }else{
+                return item;
+            }
+        }
+        return item;
+    }
+
+    public List<Item> getItemList(){
+        List<Item> list = new ArrayList<>();
+        itemHashMap.forEach((itemKey, itemValue) -> {
+            list.add(itemValue);
+        });
+        return list;
     }
 
     public int getUniqueItemsCount() {
         return uniqueItemsCount;
     }
+
+    public void select(int x, int y) {
+        int clickedSlot = gp.inventoryView.getClickedInventorySlot(x, y);
+        if(clickedSlot != -1){
+            getItemList().forEach((item) -> {
+                item.setSelected(false);
+            });
+            getItemList().get(clickedSlot).setSelected();
+        }
+    }
 }

+ 48 - 0
src/main/java/model/Item.java

@@ -1,4 +1,52 @@
 package model;
 
+import model.items.ITEM_NAME;
+
 public class Item {
+    private ITEM_NAME itemName;
+    private int count;
+    private boolean isSelected;
+    public Item(ITEM_NAME itemName){
+        this.itemName = itemName;
+        count = 1;
+        isSelected = false;
+    }
+    public void addItemToStack(Item item){
+        if(item.getItemName() == itemName){
+            this.count += item.count;
+            item.count = 0;
+        }
+    }
+
+
+    public Item takeItems(int count){
+        Item item = new Item(this.getItemName());
+        if(this.count >= count){
+            item.addCount(count);
+            this.count -= count;
+        }
+        return item;
+    }
+
+    public ITEM_NAME getItemName(){
+        return itemName;
+    }
+    public String getItemNamePlusCount(){
+        return itemName + ": " + count;
+    }
+    public void addCount(int count){
+        this.count += count;
+    }
+    public int getCount(){
+        return count;
+    }
+    public void setSelected() {
+        isSelected = true;
+    }
+    public void setSelected(boolean selected) {
+        isSelected = selected;
+    }
+    public boolean isSelected() {
+        return isSelected;
+    }
 }

+ 7 - 0
src/main/java/model/items/ITEM_NAME.java

@@ -0,0 +1,7 @@
+package model.items;
+
+public enum ITEM_NAME {
+    WOOD,
+    STONE,
+    WATER,
+}

+ 33 - 0
src/main/java/util/TextUtil.java

@@ -0,0 +1,33 @@
+package util;
+
+import java.awt.*;
+import java.awt.image.BufferedImage;
+
+public class TextUtil {
+
+    // Method to calculate the width of a given text using a specific font
+    public static int getTextWidth(String text, Font font) {
+        BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
+        Graphics g = img.getGraphics();
+        g.setFont(font);
+        FontMetrics metrics = g.getFontMetrics();
+        return metrics.stringWidth(text);
+    }
+
+    // Method to calculate the appropriate font size so that text fits within maxWidth
+    public static int getFittingFontSize(String text, Font baseFont, int maxWidth) {
+        int fontSize = baseFont.getSize();
+        Font currentFont = baseFont;
+
+        // Reduce font size until it fits within maxWidth
+        while (getTextWidth(text, currentFont) > maxWidth && fontSize > 1) {
+            fontSize--;
+            currentFont = baseFont.deriveFont((float) fontSize);
+        }
+
+        return fontSize;
+    }
+    public static void setFontAppropriateToSize(String text, int maxWidth, Graphics2D g2){
+        g2.setFont(new Font("Arial", Font.PLAIN, TextUtil.getFittingFontSize(text, g2.getFont(), maxWidth)));
+    }
+}

+ 3 - 3
src/main/java/view/GamePanel.java

@@ -43,12 +43,12 @@ public class GamePanel extends JPanel implements Runnable{
     TileManager tileManager = new TileManager(this);
     KeyHandler keyH = new KeyHandler(this);
     Thread gameThread;
-    InventoryView inventoryView = new InventoryView(this);
+    public InventoryView inventoryView = new InventoryView(this);
     public Camera camera = new Camera(this, keyH);
 
 
     public GamePanel(){
-        inventory = new Inventory();
+        inventory = new Inventory(this);
 
         MouseListener mdl = new MouseListener(this, camera, tileManager, inventoryView);
         this.addMouseListener(mdl);
@@ -144,6 +144,6 @@ public class GamePanel extends JPanel implements Runnable{
         // Todo
     }
     public void highlightTile(int screenX, int screenY) {
-        System.out.println("X: " + screenX/tileSize+" Y: "+screenY/tileSize);
+        System.out.println("Highlight X: " + screenX/tileSize+" Y: "+screenY/tileSize);
     }
 }

+ 32 - 12
src/main/java/view/InventoryView.java

@@ -1,23 +1,23 @@
 package view;
 
 import model.Inventory;
+import util.TextUtil;
 
 import java.awt.*;
 
 public class InventoryView {
     private GamePanel gp;
     private int inventoryHeight, inventoryWidth, inventoryY, inventoryX;
-
-
+    int overlayX = 20;
+    int overlayY = 20;
+    int slotSize = 48;
+    int slotSpacing = 8;
+    int slotCount = 0;
     public InventoryView(GamePanel gamePanel){
         this.gp = gamePanel;
     }
     public void drawInventoryOverlay(Graphics2D g2) {
-        int overlayX = 20;
-        int overlayY = 20;
-        int slotSize = 48;
-        int slotSpacing = 8;
-        int slotCount = gp.inventory.getUniqueItemsCount(); // Change as needed
+        slotCount = gp.inventory.getUniqueItemsCount();
 
         int overlayWidth = slotSize + 2* slotSpacing;
         int overlayHeight = (slotSize + slotSpacing) * slotCount + slotSpacing;
@@ -27,21 +27,41 @@ public class InventoryView {
         g2.fillRoundRect(overlayX, overlayY, overlayWidth, overlayHeight, 15, 15);
 
         // Draw slots
-        g2.setColor(Color.LIGHT_GRAY);
         for (int i = 0; i < slotCount; i++) {
-
+            if(gp.inventory.getItemList().get(i).isSelected()){
+                g2.setColor(Color.CYAN);
+            }else{
+                g2.setColor(Color.LIGHT_GRAY);
+            }
             int x = overlayX + slotSpacing;
             int y = overlayY + slotSpacing + i * (slotSize + slotSpacing);
             g2.fillRoundRect(x, y, slotSize, slotSize, 10, 10);
 
-            // Optional: draw slot index or placeholder icon
             g2.setColor(Color.DARK_GRAY);
-            g2.setFont(new Font("Arial", Font.PLAIN, 14));
-            g2.drawString("Slot " + (i + 1), x + 5, y + slotSize / 2 + 5);
+
+            String itemName = gp.inventory.getItemList().get(i).getItemName().toString();
+
+            TextUtil.setFontAppropriateToSize(itemName, slotSize - slotSpacing/2, g2);
+
+            g2.drawString(itemName, x + slotSpacing/4, y + slotSize / 2 + 5);
+            g2.drawString( "" + gp.inventory.getItemList().get(i).getCount() , x + slotSize - slotSize/5, y + slotSize -2);
 
             g2.setColor(Color.LIGHT_GRAY); // reset color for next slot
         }
     }
+    public int getClickedInventorySlot(int mouseX, int mouseY) {
+        for (int i = 0; i < slotCount; i++) {
+            int x = overlayX + slotSpacing;
+            int y = overlayY + slotSpacing + i * (slotSize + slotSpacing);
+            int width = slotSize;
+            int height = slotSize;
+
+            if (mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height) {
+                return i; // Slot i was clicked
+            }
+        }
+        return -1; // No slot was clicked
+    }
     public int getInventoryHeight() {
         return inventoryHeight;
     }