浏览代码

Shop ist funktionsfähig

Jan 5 月之前
父节点
当前提交
badd71dcf6

+ 13 - 2
src/main/java/controller/GameController.java

@@ -61,7 +61,7 @@ public class GameController implements Runnable, Serializable {
      * Creates a new ShopController
      */
     private void initShopController() {
-        shopController = new ShopController();
+        shopController = new ShopController(this);
     }
 
     /**
@@ -150,7 +150,7 @@ public class GameController implements Runnable, Serializable {
      *
      * @param tileController the interactive tile controller to add
      */
-    private void addInteractiveTileController(InteractiveTileController tileController) {
+    public void addInteractiveTileController(InteractiveTileController tileController) {
         interactiveTileControllers.add(tileController);
     }
 
@@ -203,6 +203,17 @@ public class GameController implements Runnable, Serializable {
         getModel().getInventory().select(slot);
     }
 
+    /**
+     * Handles a click on the shop UI.
+     *  @param x screen x-coordinate of click
+     * @param y screen y-coordinate of click
+     * @return
+     */
+    public void handleShopClick(int x, int y) {
+        InteractiveTileController controller = view.getShopView().getClickedOffer(x, y);
+        shopController.setDraggingOffer(controller);
+    }
+
     /**
      * Starts the main game loop and resource manager thread.
      */

+ 5 - 1
src/main/java/controller/input/GameMouseListener.java

@@ -62,7 +62,6 @@ public class GameMouseListener implements MouseListener, MouseMotionListener {
         }else if(gamePanel.gameState == GAMESTATE.MAIN_MENU){
             gamePanel.handleMainMenuClick(e.getX(), e.getY());
         }
-
     }
 
     @Override
@@ -74,6 +73,11 @@ public class GameMouseListener implements MouseListener, MouseMotionListener {
             int worldY = tm.screenToWorldY(e.getY());
             tm.setDraggingTile(tm.getTileAt(worldX, worldY));
         }
+
+        if (gamePanel.gameState == GAMESTATE.SHOP && SwingUtilities.isRightMouseButton(e)) {
+            controller.handleShopClick(e.getX(), e.getY());
+        }
+
         lastY = e.getX();
         lastX = e.getY();
     }

+ 42 - 2
src/main/java/controller/ui/ShopController.java

@@ -1,8 +1,48 @@
 package controller.ui;
 
-public class ShopController {
-    public ShopController(){
+import controller.GameController;
+import controller.factories.InteractiveTileFactory;
+import controller.tiles.interactive.InteractiveTileController;
+import model.Inventory;
+import model.items.ITEM_NAME;
+import model.tiles.InteractiveTileModel;
+import model.tiles.InteractiveTileType;
+import util.Translator;
+import util.economy.EconomyData;
+import util.economy.EconomyInfo;
+import view.tile.TileManager;
+
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
+public class ShopController {
+    private GameController gameController;
+    public ShopController(GameController gameController){
+        this.gameController = gameController;
     }
 
+    public void setDraggingOffer(InteractiveTileController controller) {
+        EconomyData data = EconomyInfo.infoOf(controller.getModel().getTileType());
+        List<Map.Entry<ITEM_NAME, Integer>> entries = new ArrayList<>(data.getCosts().get(1).entrySet());
+
+        for(Map.Entry<ITEM_NAME, Integer> entry : entries){
+            Inventory inventory = gameController.getModel().getInventory();
+
+            if(!inventory.hasEnough(entry.getKey(), entry.getValue())){
+                return;
+            }else{
+                inventory.spend(entry.getKey(), entry.getValue());
+            }
+        }
+        if(controller != null){
+
+            gameController.addInteractiveTileController(controller);
+            gameController.getView().tileManager.setDraggingTile(controller);
+            gameController.getView().toggleShop();
+            //gameController.createInteractiveTileModel(1,1, InteractiveTileType.SAWMILL);
+            System.out.println(controller.getModel().getWorldGridX());
+        }
+    }
 }

+ 4 - 0
src/main/java/model/Inventory.java

@@ -60,4 +60,8 @@ public class Inventory implements Serializable {
     public boolean hasEnough(ITEM_NAME key, int comparedTo) {
         return itemHashMap.get(key).getCount() >= comparedTo;
     }
+
+    public void spend(ITEM_NAME key, int value) {
+        itemHashMap.get(key).takeItems(value);
+    }
 }

+ 5 - 0
src/main/java/view/GamePanel.java

@@ -173,9 +173,14 @@ public class GamePanel extends JPanel{
     }
 
     public void toggleShop() {
+        closeMenus();
         if(gameState == GAMESTATE.SHOP){
             gameState = GAMESTATE.PLAY;
         }else gameState = GAMESTATE.SHOP;
 
     }
+
+    public ShopView getShopView() {
+        return shopView;
+    }
 }

+ 6 - 6
src/main/java/view/tile/TileManager.java

@@ -1,9 +1,7 @@
 package view.tile;
 
-import controller.entity.EntityController;
 import controller.tiles.interactive.InteractiveTileController;
 import model.Tile;
-import model.entity.EntityModel;
 import model.tiles.BackgroundTile;
 import model.tiles.InteractiveTileModel;
 import util.WorldGenerator;
@@ -16,10 +14,10 @@ import java.io.*;
 
 public class TileManager implements RenderingManager {
 
-    GamePanel gamePanel;
-    public Tile[] tile;
-    public int[][] mapTileNum;
-    public int mapTileOverflow = 1;
+    private GamePanel gamePanel;
+    private Tile[] tile;
+    private int[][] mapTileNum;
+    private int mapTileOverflow = 1;
     private InteractiveTileController draggingTile;
     private int originalGridX, originalGridY;
 
@@ -303,9 +301,11 @@ public class TileManager implements RenderingManager {
     public boolean isTileDragged(InteractiveTileController controller){
         return draggingTile == controller;
     }
+
     public InteractiveTileController getDraggedTile() {
         return draggingTile;
     }
+
     public void setDraggingTile(InteractiveTileController tile) {
         draggingTile = tile;
         if (draggingTile != null) {

+ 30 - 2
src/main/java/view/ui/ShopView.java

@@ -1,12 +1,16 @@
 package view.ui;
 
+import controller.factories.InteractiveTileFactory;
+import controller.tiles.interactive.InteractiveTileController;
 import model.Inventory;
 import model.items.ITEM_NAME;
+import model.tiles.InteractiveTileModel;
 import model.tiles.InteractiveTileType;
 import util.Translator;
 import util.economy.EconomyData;
 import util.economy.EconomyInfo;
 import view.GamePanel;
+import view.tile.TileManager;
 
 import javax.imageio.ImageIO;
 import java.awt.*;
@@ -15,7 +19,6 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
 
 public class ShopView {
     private GamePanel gamePanel;
@@ -60,7 +63,31 @@ public class ShopView {
         for(InteractiveTileType type : offers){
             drawOffer(g2, type);
         }
+    }
+
+    public InteractiveTileController getClickedOffer(int x, int y) {
+        int offerCount = offers.size();
+
+        int overlayWidth = (slotSize + spacing) * offerCount + spacing;
+
+        int baseOffsetX = gamePanel.getWidth() / 2 - overlayWidth / 2;
+        int baseOffsetY = overlayY + spacing;
+
+        int offerX = baseOffsetX + spacing;
+        int offerY = baseOffsetY + spacing;
 
+        for (int i = 0; i < offerCount; i++) {
+            int currentX = offerX + i * (slotSize + spacing);
+            int currentY = offerY;
+
+            if (x >= currentX && x <= currentX + slotSize &&
+                    y >= currentY && y <= currentY + slotSize) {
+                TileManager tm = gamePanel.tileManager;
+
+                return InteractiveTileFactory.createTile(gamePanel.gameController, new InteractiveTileModel(tm.screenToWorldX(x), tm.screenToWorldY(y), offers.get(i)));
+            }
+        }
+        return null; // No offer clicked
     }
 
     private void drawOffer(Graphics2D g2, InteractiveTileType offer){
@@ -79,6 +106,7 @@ public class ShopView {
 
         for(Map.Entry<ITEM_NAME, Integer> entry : entries){
             String needed = Translator.translate("item."+entry.getKey()) + ": " + entry.getValue();
+
             int strWidth = g2.getFontMetrics().stringWidth(needed);
             Inventory inventory = gamePanel.gameController.getModel().getInventory();
 
@@ -114,7 +142,7 @@ public class ShopView {
         g2.setFont(defaultF);
     }
 
-    public BufferedImage getImage(String imagePath){
+    private BufferedImage getImage(String imagePath){
         try {
             return ImageIO.read(getClass().getResourceAsStream(imagePath));
         } catch (IOException e) {

+ 3 - 0
src/main/java/view/ui/UI.java

@@ -133,5 +133,8 @@ public class UI {
         for (InteractiveTileController tile : gp.gameController.interactiveTileControllers) {
             tile.unClick();
         }
+        for(EntityController e : gp.gameController.entityControllers){
+            e.unClick();
+        }
     }
 }