Browse Source

Variable Größe der Tiles

Jan 6 months ago
parent
commit
4fef1efee5
25 changed files with 154 additions and 65 deletions
  1. 2 7
      src/main/java/controller/GameController.java
  2. 16 4
      src/main/java/controller/GameMouseListener.java
  3. 2 0
      src/main/java/controller/InteractiveController.java
  4. 5 0
      src/main/java/controller/entity/EntityController.java
  5. 1 1
      src/main/java/controller/entity/VillagerController.java
  6. 16 5
      src/main/java/controller/tiles/interactive/InteractiveTileController.java
  7. 2 0
      src/main/java/controller/tiles/interactive/upgradeable/AnimalEnclosureController.java
  8. 1 2
      src/main/java/controller/tiles/interactive/upgradeable/LighthouseController.java
  9. 1 1
      src/main/java/controller/tiles/interactive/upgradeable/MineController.java
  10. 4 0
      src/main/java/model/entity/EntityModel.java
  11. 2 12
      src/main/java/model/tiles/InteractiveTileModel.java
  12. 10 3
      src/main/java/view/GamePanel.java
  13. 16 4
      src/main/java/view/entity/EntityManager.java
  14. 5 0
      src/main/java/view/entity/EntityView.java
  15. 2 2
      src/main/java/view/popUpMenu/EntityMenu.java
  16. 22 0
      src/main/java/view/popUpMenu/PopupManager.java
  17. 16 6
      src/main/java/view/tile/TileManager.java
  18. 1 1
      src/main/java/view/tile/interactive/AnimalEnclosureView.java
  19. 1 1
      src/main/java/view/tile/interactive/BarracksView.java
  20. 14 10
      src/main/java/view/tile/interactive/InteractiveTileView.java
  21. 1 1
      src/main/java/view/tile/interactive/IronMineView.java
  22. 2 2
      src/main/java/view/tile/interactive/LighthouseView.java
  23. 2 2
      src/main/java/view/tile/interactive/MineView.java
  24. 1 1
      src/main/java/view/tile/interactive/SawmillView.java
  25. 9 0
      src/main/java/view/util/RenderingManager.java

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

@@ -42,7 +42,7 @@ public class GameController implements Runnable, Serializable {
     }
 
     private void setupInteractiveTiles() {
-        LighthouseController lighthouse = new LighthouseController(this, setupInteractiveTileModel(20, 20, getView().tileSize*2, getView().tileSize*2));
+        LighthouseController lighthouse = new LighthouseController(this, setupInteractiveTileModel(20, 20));
         addInteractiveTile(lighthouse);
 
         MineController mineController = new MineController(this, setupInteractiveTileModel(25,20));
@@ -80,13 +80,8 @@ public class GameController implements Runnable, Serializable {
         return model;
     }
 
-    public InteractiveTileModel setupInteractiveTileModel(int worldGridX, int worldGridY, int width, int height){
-        InteractiveTileModel model = new InteractiveTileModel(worldGridX, worldGridY, width, height);
-        gameModel.addInteractiveTileModel(model);
-        return model;
-    }
     public InteractiveTileModel setupInteractiveTileModel(int worldGridX, int worldGridY){
-        InteractiveTileModel model = new InteractiveTileModel(worldGridX, worldGridY, getView().getWidth(), getView().getHeight());
+        InteractiveTileModel model = new InteractiveTileModel(worldGridX, worldGridY);
         gameModel.addInteractiveTileModel(model);
         return model;
     }

+ 16 - 4
src/main/java/controller/MouseListener.java → src/main/java/controller/GameMouseListener.java

@@ -3,12 +3,18 @@ package controller;
 import util.GAMESTATE;
 import view.Camera;
 import view.GamePanel;
-import view.tile.TileManager;
 
+import javax.imageio.ImageIO;
+import javax.tools.Tool;
+import java.awt.*;
 import java.awt.event.MouseEvent;
-import java.awt.event.MouseMotionAdapter;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
 
-public class MouseListener extends MouseMotionAdapter implements java.awt.event.MouseListener {
+public class GameMouseListener implements MouseListener, MouseMotionListener {
     private int startX;
     private int startY;
 
@@ -16,7 +22,7 @@ public class MouseListener extends MouseMotionAdapter implements java.awt.event.
     GamePanel gamePanel;
     GameController controller;
 
-    public MouseListener(GameController controller, GamePanel gamePanel, Camera camera) {
+    public GameMouseListener(GameController controller, GamePanel gamePanel, Camera camera) {
         this.controller = controller;
         this.gamePanel = gamePanel;
         this.camera = camera;
@@ -27,6 +33,7 @@ public class MouseListener extends MouseMotionAdapter implements java.awt.event.
         if(gamePanel.gameState == GAMESTATE.INVENTORY){
 
         }else{
+
             int diffY = startY - e.getY();
             int diffX = startX - e.getX();
 
@@ -38,6 +45,11 @@ public class MouseListener extends MouseMotionAdapter implements java.awt.event.
         }
     }
 
+    @Override
+    public void mouseMoved(MouseEvent e) {
+
+    }
+
     @Override
     public void mouseClicked(MouseEvent e) {
         if(gamePanel.gameState == GAMESTATE.PLAY){

+ 2 - 0
src/main/java/controller/InteractiveController.java

@@ -17,4 +17,6 @@ public interface InteractiveController {
     boolean isClicked(int screenX, int screenY, Camera camera);
 
     void click(int screenX, int screenY);
+
+    void resize(int newTileSize);
 }

+ 5 - 0
src/main/java/controller/entity/EntityController.java

@@ -112,6 +112,11 @@ public abstract class EntityController implements InteractiveController {
      * scales down the default frames per second the view is painted down to 1 sec to avoid too fast movement logic
      *
      */
+    @Override
+    public void resize(int newTileSize){
+        model.updateWidthAndHeight(newTileSize);
+        view.resize(newTileSize);
+    }
     public void convertRepaintSpeedToMovementLogic() {
         if(updateCount >= gameController.fps){
             findPath();

+ 1 - 1
src/main/java/controller/entity/VillagerController.java

@@ -12,7 +12,7 @@ public class VillagerController extends EntityController{
     public VillagerController(GameController controller, EntityModel model){
         super(model, null, controller);
         setView(new VillagerView(controller, this));
-        PopupMenu popup = new EntityMenu(100, 100, Translator.translate("popup.villager"), this);
+        PopupMenu popup = new EntityMenu(100, 80, Translator.translate("popup.villager"), this);
         setPopupOnClick(popup);
     }
     @Override

+ 16 - 5
src/main/java/controller/tiles/interactive/InteractiveTileController.java

@@ -34,10 +34,14 @@ public abstract class InteractiveTileController implements InteractiveController
     }
 
     public boolean isClicked(int mouseScreenX, int mouseScreenY, Camera camera) {
-        double mouseWorldGridX = (camera.worldX + mouseScreenX - camera.screenX) / view.getWidth();
-        double mouseWorldGridY = (camera.worldY + mouseScreenY - camera.screenY) / view.getHeight();
-        boolean clicked = mouseWorldGridX == model.getWorldGridX() &&  mouseWorldGridY == model.getWorldGridY();
-        return clicked;
+        double mouseWorldGridX = (camera.worldX + mouseScreenX - camera.screenX) / gameController.getView().tileSize;
+        double mouseWorldGridY = (camera.worldY + mouseScreenY - camera.screenY) / gameController.getView().tileSize;
+        boolean isClicked = (mouseWorldGridX >= model.getWorldGridX()
+                && mouseWorldGridX < model.getWorldGridX() + view.getScaleX()
+                && mouseWorldGridY >= model.getWorldGridY()
+                && mouseWorldGridY < model.getWorldGridY() + view.getScaleY())
+                || (mouseWorldGridX == model.getWorldGridX() && mouseWorldGridY == model.getWorldGridY());
+        return isClicked;
     }
 
     public void updateCoordinates(int screenX, int screenY){
@@ -81,7 +85,9 @@ public abstract class InteractiveTileController implements InteractiveController
 
         }
     }
-
+    public int getTileSize(){
+        return gameController.getView().tileSize;
+    }
     public boolean getClicked(){
         return clicked;
     }
@@ -97,4 +103,9 @@ public abstract class InteractiveTileController implements InteractiveController
     public int getLevel() {
         return model.getLevel();
     }
+
+    @Override
+    public void resize(int newTileSize) {
+        view.resize(newTileSize);
+    }
 }

+ 2 - 0
src/main/java/controller/tiles/interactive/upgradeable/AnimalEnclosureController.java

@@ -26,4 +26,6 @@ public class AnimalEnclosureController extends InteractiveTileController {
     public void collect() {
 
     }
+
+
 }

+ 1 - 2
src/main/java/controller/tiles/interactive/upgradeable/LighthouseController.java

@@ -12,9 +12,8 @@ public class LighthouseController extends InteractiveTileController {
 
     public LighthouseController(GameController gc, InteractiveTileModel model) {
         super(model, null, gc);
-        setView(new LighthouseView(gc, this));
+        setView(new LighthouseView(2, 2, gc, this));
         PopupMenu popup = new UpgradeMenu(100, 110, Translator.translate("popup.title.lighthouse"), this);
-
         setPopupOnClick(popup);
     }
 

+ 1 - 1
src/main/java/controller/tiles/interactive/upgradeable/MineController.java

@@ -12,7 +12,7 @@ public class MineController extends InteractiveTileController {
 
     public MineController(GameController gc, InteractiveTileModel model) {
         super(model, null, gc);
-        setView(new MineView(gc, this));
+        setView(new MineView(1, 2,gc, this));
         PopupMenu popup = new UpgradeMenu(100, 100, Translator.translate("popup.title.mine"), this);
         setPopupOnClick(popup);
     }

+ 4 - 0
src/main/java/model/entity/EntityModel.java

@@ -59,4 +59,8 @@ public class EntityModel {
     public int getWorldY() {
         return worldY;
     }
+
+    public void updateWidthAndHeight(int newTileSize) {
+        height = newTileSize;
+    }
 }

+ 2 - 12
src/main/java/model/tiles/InteractiveTileModel.java

@@ -6,16 +6,13 @@ import java.io.Serializable;
 
 public class InteractiveTileModel implements Serializable {
     protected int worldGridX, worldGridY;
-    protected int width, height;
     private boolean clicked;
     private int level;
     private Item items;
 
-    public InteractiveTileModel(int worldGridX, int worldGridY, int width, int height) {
+    public InteractiveTileModel(int worldGridX, int worldGridY) {
         this.worldGridX = worldGridX;
         this.worldGridY = worldGridY;
-        this.width = width;
-        this.height = height;
         this.clicked = false;
         this.level = 1;
     }
@@ -35,14 +32,6 @@ public class InteractiveTileModel implements Serializable {
         return worldGridY;
     }
 
-    public int getWidth() {
-        return width;
-    }
-
-    public int getHeight() {
-        return height;
-    }
-
     public boolean isClicked() {
         return clicked;
     }
@@ -58,4 +47,5 @@ public class InteractiveTileModel implements Serializable {
     public Item collect() {
         return items.takeItems(items.getCount());
     }
+
 }

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

@@ -1,16 +1,19 @@
 package view;
 
 import controller.GameController;
-import controller.MouseListener;
+import controller.GameMouseListener;
 import controller.MouseWheelZoom;
 import model.GameSaver;
 import model.Inventory;
 import view.entity.EntityManager;
+import view.popUpMenu.PopupManager;
 import view.tile.TileManager;
 import util.GAMESTATE;
 
 import javax.swing.*;
 import java.awt.*;
+import java.util.ArrayList;
+import java.util.Arrays;
 
 public class GamePanel extends JPanel{
 
@@ -45,7 +48,7 @@ public class GamePanel extends JPanel{
 
     public TileManager tileManager;
     public EntityManager entityManager;
-
+    private PopupManager popupManager;
     private InventoryView inventoryView;
     public Camera camera;
 
@@ -58,11 +61,12 @@ public class GamePanel extends JPanel{
 
         this.tileManager = new TileManager(this);
         this.entityManager = new EntityManager(this);
+        this.popupManager = new PopupManager(this, new ArrayList<>(Arrays.asList(tileManager, entityManager)));
 
         Inventory inventory = gameController.getModel().getInventory();
         this.inventoryView = new InventoryView(inventory);
 
-        MouseListener mdl = new MouseListener(controller, this, camera);
+        GameMouseListener mdl = new GameMouseListener(controller, this, camera);
         this.addMouseListener(mdl);
         this.addMouseMotionListener(mdl);
         this.addMouseWheelListener(new MouseWheelZoom(controller));
@@ -102,6 +106,8 @@ public class GamePanel extends JPanel{
         int newWorldWidth = tileSize * maxWorldCol;
         int newWorldHeight = tileSize * maxWorldRow;
 
+        tileManager.resize(tileSize);
+        entityManager.resize(tileSize);
         // Adjust camera position relative to the new scale
         double widthMultiplier = (double) newWorldWidth / oldWorldWidth;
         double heightMultiplier = (double) newWorldHeight / oldWorldHeight;
@@ -123,6 +129,7 @@ public class GamePanel extends JPanel{
 
         tileManager.draw(g2);
         entityManager.draw(g2);
+        popupManager.drawPopups(g2);
 
         if (gameState == GAMESTATE.INVENTORY) {
             inventoryView.drawInventoryOverlay(g2);

+ 16 - 4
src/main/java/view/entity/EntityManager.java

@@ -3,12 +3,13 @@ package view.entity;
 import controller.entity.EntityController;
 import model.entity.EntityModel;
 import view.GamePanel;
+import view.util.RenderingManager;
 
 import java.awt.*;
 import java.io.*;
 import java.util.ArrayList;
 
-public class EntityManager {
+public class EntityManager implements RenderingManager {
     GamePanel gamePanel;
     private ArrayList<EntityController> entities = new ArrayList<>();
 
@@ -23,9 +24,6 @@ public class EntityManager {
             entity.updateCoordinates(worldColToScreenX(model.getWorldX()), worldRowToScreenY(model.getWorldY()));
             entity.drawSprite(g2);
         }
-        for (EntityController entity : gamePanel.gameController.entityControllers) {
-            entity.drawPopup(g2);
-        }
     }
     public int getTileSize(){
         return gamePanel.tileSize;
@@ -50,4 +48,18 @@ public class EntityManager {
     private void setupEntity(EntityView entity) throws IOException {
 
     }
+
+    @Override
+    public void drawPopup(Graphics2D g2) {
+        for (EntityController entity : gamePanel.gameController.entityControllers) {
+            entity.drawPopup(g2);
+        }
+    }
+
+    @Override
+    public void resize(int newTileSize) {
+        for (EntityController entity : gamePanel.gameController.entityControllers) {
+            entity.resize(newTileSize);
+        }
+    }
 }

+ 5 - 0
src/main/java/view/entity/EntityView.java

@@ -72,4 +72,9 @@ public abstract class EntityView {
     public void drawSprite(Graphics2D g2){
         g2.drawImage(image, screenX, screenY, gameController.getView().tileSize, gameController.getView().tileSize, null);
     }
+
+    public void resize(int newTileSize) {
+        width = newTileSize;
+        height = newTileSize;
+    }
 }

+ 2 - 2
src/main/java/view/popUpMenu/EntityMenu.java

@@ -12,7 +12,7 @@ public class EntityMenu extends PopupMenu{
     public EntityMenu(int width, int height, String title, EntityController controller) {
         super(width, height, title);
         this.controller = controller;
-        addButton( new Button(80, 25, Translator.translate("popup.villager.lumberjack"), this::nothing), 10, 40 );
+        addButton( new Button(80, 25, Translator.translate("popup.villager.job"), this::nothing), 10, 40 );
     }
 
     @Override
@@ -30,7 +30,7 @@ public class EntityMenu extends PopupMenu{
 
         g2.drawString(title, x + ((overlayWidth - msgWidth )/2), y+ 20);
 
-        String levelStr = "Level: ";
+        String levelStr = "";
         int lvlStrWidth = fm.stringWidth(levelStr);
         g2.drawString(levelStr, x + ((overlayWidth - lvlStrWidth )/2), y+ 35);
         for (Button button : buttonArrayList){

+ 22 - 0
src/main/java/view/popUpMenu/PopupManager.java

@@ -0,0 +1,22 @@
+package view.popUpMenu;
+
+import view.GamePanel;
+import view.util.RenderingManager;
+
+import java.awt.*;
+import java.util.ArrayList;
+
+public class PopupManager {
+    private GamePanel view;
+    private ArrayList<RenderingManager> renderingManagers;
+    public PopupManager(GamePanel view, ArrayList<RenderingManager> renderingManagers){
+        this.view = view;
+        this.renderingManagers = renderingManagers;
+    }
+
+    public void drawPopups(Graphics2D g2){
+        for(RenderingManager renderingManager : renderingManagers){
+            renderingManager.drawPopup(g2);
+        }
+    }
+}

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

@@ -8,11 +8,12 @@ import model.tiles.BackgroundTile;
 import model.tiles.InteractiveTileModel;
 import util.WorldGenerator;
 import view.GamePanel;
+import view.util.RenderingManager;
 
 import java.awt.*;
 import java.io.*;
 
-public class TileManager {
+public class TileManager implements RenderingManager {
 
     GamePanel gamePanel;
     public Tile[] tile;
@@ -84,7 +85,6 @@ public class TileManager {
                worldY + gamePanel.tileSize*mapTileOverflow > gamePanel.camera.worldY - gamePanel.camera.screenY &&
                worldY - gamePanel.tileSize*mapTileOverflow < gamePanel.camera.worldY + gamePanel.camera.screenY   ) {
 
-
                 g2.drawImage(tile[tileNum].image, (int) screenX, (int) screenY, gamePanel.tileSize, gamePanel.tileSize, null);
 
             }
@@ -102,10 +102,6 @@ public class TileManager {
             tile.updateCoordinates(worldColToScreenX(model.getWorldGridX()), worldRowToScreenY(model.getWorldGridY()));
             tile.drawTile(g2);
         }
-        for (InteractiveTileController tile : gamePanel.gameController.interactiveTileControllers) {
-            tile.drawPopup(g2);
-        }
-
     }
     public int worldColToScreenX(int worldCol) {
         double worldX = worldCol * gamePanel.tileSize; // Reactively use tileSize
@@ -145,5 +141,19 @@ public class TileManager {
         String filePath = WorldGenerator.generateNewWorld(GamePanel.maxWorldCol, GamePanel.maxWorldRow, (int) Math.floor(Math.random()*100000));
         loadMap(filePath);
     }
+
+    @Override
+    public void drawPopup(Graphics2D g2) {
+        for (InteractiveTileController tile : gamePanel.gameController.interactiveTileControllers) {
+            tile.drawPopup(g2);
+        }
+    }
+
+    @Override
+    public void resize(int newTileSize) {
+        for (InteractiveTileController tile : gamePanel.gameController.interactiveTileControllers) {
+            tile.resize(newTileSize);
+        }
+    }
 }
 

+ 1 - 1
src/main/java/view/tile/interactive/AnimalEnclosureView.java

@@ -6,7 +6,7 @@ import controller.tiles.interactive.InteractiveTileController;
 public class AnimalEnclosureView extends InteractiveTileView {
 
     public AnimalEnclosureView(GameController gc, InteractiveTileController controller) {
-        super( gc.getView().tileSize, gc.getView().tileSize, controller, gc.getView().tileManager);
+        super( 1, 1, controller, gc.getView().tileManager);
         setImage("/tiles/animalEnclosure/animalEnclosureTest.png");
     }
 }

+ 1 - 1
src/main/java/view/tile/interactive/BarracksView.java

@@ -6,7 +6,7 @@ import controller.tiles.interactive.InteractiveTileController;
 public class BarracksView extends InteractiveTileView {
 
     public BarracksView(GameController gc, InteractiveTileController controller) {
-        super( gc.getView().tileSize, gc.getView().tileSize, controller, gc.getView().tileManager);
+        super( 1,1, controller, gc.getView().tileManager);
         setImage("/tiles/barracks/barracksTest.png");
     }
 }

+ 14 - 10
src/main/java/view/tile/interactive/InteractiveTileView.java

@@ -20,15 +20,15 @@ public abstract class InteractiveTileView extends Tile implements Serializable {
     private PopupMenu popup;
     protected Runnable onClick;
     public TileManager tileManager;
+    private int scaleX, scaleY;
     // -------------------
 
-    public InteractiveTileView(int width, int height, InteractiveTileController controller, TileManager tileManager) {
-        // so it doesn't show up on screen
-        this.screenX = -100;
-        this.screenY = -100;
+    public InteractiveTileView(int scaleX, int scaleY, InteractiveTileController controller, TileManager tileManager) {
         this.tileManager = tileManager;
-        this.width = width;
-        this.height = height;
+        this.width = controller.getTileSize() * scaleX;
+        this.height = controller.getTileSize() * scaleY;
+        this.scaleX = scaleX;
+        this.scaleY = scaleY;
         this.controller = controller;
     }
 
@@ -64,11 +64,15 @@ public abstract class InteractiveTileView extends Tile implements Serializable {
         popup.draw(screenXClick, screenYClick, g2);
     }
 
-    public int getWidth() {
-        return width;
+    public void resize(int newTileSize) {
+        height = newTileSize * scaleY;
+        width = newTileSize * scaleX;
     }
 
-    public int getHeight() {
-        return height;
+    public int getScaleX() {
+        return scaleX;
+    }
+    public int getScaleY(){
+        return scaleY;
     }
 }

+ 1 - 1
src/main/java/view/tile/interactive/IronMineView.java

@@ -6,7 +6,7 @@ import controller.tiles.interactive.InteractiveTileController;
 public class IronMineView extends InteractiveTileView {
 
     public IronMineView(GameController gc, InteractiveTileController controller) {
-        super( gc.getView().tileSize, gc.getView().tileSize, controller, gc.getView().tileManager);
+        super( 1,1, controller, gc.getView().tileManager);
         setImage("/tiles/mineIron/mineIronTest.png");
     }
 }

+ 2 - 2
src/main/java/view/tile/interactive/LighthouseView.java

@@ -5,8 +5,8 @@ import controller.tiles.interactive.InteractiveTileController;
 
 public class LighthouseView extends InteractiveTileView {
 
-    public LighthouseView(GameController gc, InteractiveTileController controller) {
-        super( gc.getView().tileSize*2, gc.getView().tileSize*2, controller, gc.getView().tileManager);
+    public LighthouseView(int scaleX, int scaleY, GameController gc, InteractiveTileController controller) {
+        super( scaleX, scaleY, controller, gc.getView().tileManager);
         setImage("/tiles/lighthouse/lighthouse_5.png");
     }
 

+ 2 - 2
src/main/java/view/tile/interactive/MineView.java

@@ -5,8 +5,8 @@ import controller.tiles.interactive.InteractiveTileController;
 
 public class MineView extends InteractiveTileView {
 
-    public MineView(GameController gc, InteractiveTileController controller) {
-        super( gc.getView().tileSize, gc.getView().tileSize, controller, gc.getView().tileManager);
+    public MineView(int scaleX, int scaleY,GameController gc, InteractiveTileController controller) {
+        super( scaleX, scaleY, controller, gc.getView().tileManager );
         setImage("/tiles/mine/mineTest.png");
     }
 

+ 1 - 1
src/main/java/view/tile/interactive/SawmillView.java

@@ -6,7 +6,7 @@ import controller.tiles.interactive.InteractiveTileController;
 public class SawmillView extends InteractiveTileView {
 
     public SawmillView(GameController gc, InteractiveTileController controller) {
-        super( gc.getView().tileSize, gc.getView().tileSize, controller, gc.getView().tileManager);
+        super( 1,1, controller, gc.getView().tileManager);
         setImage("/tiles/sawmill/sawmillTest.png");
     }
 

+ 9 - 0
src/main/java/view/util/RenderingManager.java

@@ -0,0 +1,9 @@
+package view.util;
+
+import java.awt.Graphics2D;
+
+public interface RenderingManager {
+    void drawPopup(Graphics2D g2);
+
+    void resize(int newTileSize);
+}