Bläddra i källkod

MVC Prinzip anfang

BuildTools 7 månader sedan
förälder
incheckning
14dc86ffdb

+ 4 - 0
src/main/java/controller/GameController.java

@@ -0,0 +1,4 @@
+package controller;
+
+public class GameController {
+}

+ 4 - 0
src/main/java/controller/InputHandler.java

@@ -0,0 +1,4 @@
+package controller;
+
+public class InputHandler {
+}

+ 16 - 4
src/main/java/util/KeyHandler.java → src/main/java/controller/KeyHandler.java

@@ -1,6 +1,7 @@
-package util;
+package controller;
 
-import ui.GamePanel;
+import util.GAMESTATE;
+import view.GamePanel;
 
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
@@ -17,7 +18,7 @@ public class KeyHandler implements KeyListener {
 
     @Override
     public void keyTyped(KeyEvent e) {
-        // Not used
+
     }
 
     @Override
@@ -41,13 +42,24 @@ public class KeyHandler implements KeyListener {
         if(code == KeyEvent.VK_DOWN){
             gp.zoomInOut(-1);
         }
+
         if(code == KeyEvent.VK_ESCAPE){
-            if(gp.gameState == GAMESTATE.PLAY){
+            if(gp.gameState == GAMESTATE.INVENTORY){
+                gp.gameState = GAMESTATE.PLAY;
+            }else if(gp.gameState == GAMESTATE.PLAY){
                 gp.gameState = GAMESTATE.PAUSED;
             }else if(gp.gameState == GAMESTATE.PAUSED){
                 gp.gameState = GAMESTATE.PLAY;
             }
         }
+
+        if(code == KeyEvent.VK_E){
+            if(gp.gameState == GAMESTATE.INVENTORY){
+                gp.gameState = GAMESTATE.PLAY;
+            }else if(gp.gameState == GAMESTATE.PLAY){
+                gp.gameState = GAMESTATE.INVENTORY;
+            }
+        }
     }
 
     @Override

+ 4 - 0
src/main/java/controller/MenuController.java

@@ -0,0 +1,4 @@
+package controller;
+
+public class MenuController {
+}

+ 24 - 14
src/main/java/ui/MouseDragListener.java → src/main/java/controller/MouseListener.java

@@ -1,34 +1,44 @@
-package ui;
+package controller;
 
-import ui.tile.InteractiveTile;
-import ui.tile.Tile;
-import ui.tile.TileManager;
+import model.Tile;
+import util.GAMESTATE;
+import view.Camera;
+import view.GamePanel;
+import view.InventoryView;
+import view.tile.interactive.InteractiveTile;
+import view.tile.TileManager;
 
 import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionAdapter;
 
-public class MouseDragListener extends MouseMotionAdapter implements MouseListener {
+public class MouseListener extends MouseMotionAdapter implements java.awt.event.MouseListener {
     private int startX;
     private int startY;
 
     Camera camera;
     TileManager tileManager;
     GamePanel gp;
-    public MouseDragListener(GamePanel gp, Camera camera, TileManager tm){
+    InventoryView iView;
+    public MouseListener(GamePanel gp, Camera camera, TileManager tm, InventoryView inventoryView){
         this.camera = camera;
         this.tileManager = tm;
         this.gp = gp;
     }
     @Override
     public void mouseDragged(MouseEvent e) {
-        int diffY = startY - e.getY();
-        int diffX = startX - e.getX();
-
-        camera.move(diffX, diffY);
-
-        startX = e.getX();
-        startY = e.getY();
+        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();
+
+            camera.move(diffX, diffY);
+
+            startX = e.getX();
+            startY = e.getY();
+        }
     }
 
     @Override

+ 3 - 1
src/main/java/ui/MouseWheelZoom.java → src/main/java/controller/MouseWheelZoom.java

@@ -1,4 +1,6 @@
-package ui;
+package controller;
+
+import view.GamePanel;
 
 import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;

+ 18 - 2
src/main/java/main/Main.java

@@ -1,9 +1,25 @@
 package main;
 
-import ui.Entry;
+import view.GamePanel;
+
+import javax.swing.*;
 
 public class Main {
     public static void main(String[] args) {
-        Entry.entry();
+        JFrame window = new JFrame();
+        window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+        window.setResizable(false);
+        window.setTitle("Tiny Settlement");
+
+        GamePanel gamePanel = new GamePanel();
+        window.setPreferredSize(gamePanel.getPreferredSize());
+        window.add(gamePanel);
+
+        window.pack();
+
+        window.setLocationRelativeTo(null);
+        window.setVisible(true);
+
+        gamePanel.startGameThread();
     }
 }

+ 62 - 0
src/main/java/model/Entity.java

@@ -0,0 +1,62 @@
+package model;
+
+import controller.KeyHandler;
+import view.GamePanel;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.io.IOException;
+
+public abstract class Entity {
+    private GamePanel gp;
+    private KeyHandler keyH;
+
+    private Image optionalPlayerImage;
+
+    private int worldX, worldY;
+    private int speed;
+
+    public final int screenX, screenY;
+
+    public Entity(GamePanel gamePanel, KeyHandler keyHandler){
+        gp = gamePanel;
+        keyH = keyHandler;
+        screenX = gp.screenWidth/2 - gamePanel.tileSize/2;
+        screenY = gp.screenHeight/2 - gamePanel.tileSize/2;
+
+        setDefaultValues();
+    }
+    private void getEntityImage(String filePath){
+        try{
+            optionalPlayerImage = ImageIO.read(getClass().getResourceAsStream(filePath));
+        }catch (IOException e){
+            e.printStackTrace();
+        }
+    }
+    public abstract void setDefaultValues();
+
+    public void move(int x, int y){
+        worldY += y;
+        worldX += x;
+    }
+
+    public void update(){
+        if(keyH.upPressed){
+            worldY -= speed;
+        }
+        if(keyH.downPressed){
+            worldY += speed;
+        }
+        if(keyH.leftPressed){
+            worldX -= speed;
+        }
+        if(keyH.rightPressed){
+            worldX += speed;
+        }
+    }
+    public void draw(Graphics2D g2){
+        g2.setColor(Color.WHITE);
+
+        g2.drawImage(optionalPlayerImage, screenX, screenY, gp.tileSize, gp.tileSize, null);
+    }
+}

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

@@ -0,0 +1,15 @@
+package model;
+
+import java.util.ArrayList;
+
+public class Inventory {
+    private int uniqueItemsCount;
+    private ArrayList<Item> itemArrayList;
+    public Inventory() {
+        uniqueItemsCount = 5;
+    }
+
+    public int getUniqueItemsCount() {
+        return uniqueItemsCount;
+    }
+}

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

@@ -0,0 +1,4 @@
+package model;
+
+public class Item {
+}

+ 1 - 1
src/main/java/ui/tile/Tile.java → src/main/java/model/Tile.java

@@ -1,4 +1,4 @@
-package ui.tile;
+package model;
 
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;

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

@@ -0,0 +1,4 @@
+package model;
+
+public class World {
+}

+ 7 - 0
src/main/java/model/tiles/BackgroundTile.java

@@ -0,0 +1,7 @@
+package model.tiles;
+
+import model.Tile;
+
+public class BackgroundTile extends Tile {
+
+}

+ 4 - 0
src/main/java/model/tiles/InteractiveTile.java

@@ -0,0 +1,4 @@
+package model.tiles;
+
+public abstract class InteractiveTile {
+}

+ 4 - 0
src/main/java/model/tiles/MineTile.java

@@ -0,0 +1,4 @@
+package model.tiles;
+
+public class MineTile {
+}

+ 0 - 24
src/main/java/ui/Entry.java

@@ -1,24 +0,0 @@
-package ui;
-
-import javax.swing.*;
-
-public class Entry {
-    public static void entry(){
-        JFrame window = new JFrame();
-        window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
-        window.setResizable(false);
-        window.setTitle("Tiny Settlement");
-
-        GamePanel gamePanel = new GamePanel();
-        window.setPreferredSize(gamePanel.getPreferredSize());
-        window.add(gamePanel);
-
-        window.pack();
-
-
-        window.setLocationRelativeTo(null);
-        window.setVisible(true);
-
-        gamePanel.startGameThread();
-    }
-}

+ 0 - 52
src/main/java/ui/UI.java

@@ -1,52 +0,0 @@
-package ui;
-
-import util.GAMESTATE;
-
-import java.awt.*;
-
-public class UI {
-    private GamePanel gp;
-    private Graphics2D g2;
-    private Font arial_40;
-    private String message = "";
-    private boolean messageOn;
-
-    public UI(GamePanel gp){
-        this.gp = gp;
-        arial_40 = new Font("Arial", Font.PLAIN, 80);
-    }
-
-    public void showMessage(String text){
-        message = text;
-        messageOn = true;
-    }
-
-    public void draw(Graphics2D g2){
-        this.g2 = g2;
-        g2.setFont(arial_40);
-        g2.setColor(Color.white);
-
-        if(gp.gameState == GAMESTATE.PLAY){
-
-        }else if(gp.gameState == GAMESTATE.PAUSED){
-            drawPauseScreen();
-        }
-    }
-
-    private void drawPauseScreen(){
-        String text = "PAUSED";
-        int x = getXForCenteredText(text);
-        int y = gp.screenHeight / 2;
-        gp.clearAll(g2);
-
-        g2.setColor(new Color(25,31,52, 80));
-        g2.fillRect(0, 0, gp.screenWidth, gp.screenHeight);
-
-        g2.setColor(Color.WHITE);
-        g2.drawString(text, x, y);
-    }
-    public int getXForCenteredText(String text){
-        int length = (int)g2.getFontMetrics().getStringBounds(text, g2).getWidth();
-        return gp.screenWidth/2 - length/2;
-    }
-}

+ 0 - 4
src/main/java/ui/tile/BackgroundTile.java

@@ -1,4 +0,0 @@
-package ui.tile;
-
-public class BackgroundTile extends Tile{
-}

+ 0 - 16
src/main/java/ui/tile/InteractiveTile.java

@@ -1,16 +0,0 @@
-package ui.tile;
-
-import java.util.function.Consumer;
-
-public class InteractiveTile extends Tile{
-    private Consumer<Tile> onClick;
-    public InteractiveTile(){
-        interactive = true;
-    }
-    public void addOnClick(Consumer<Tile> c){
-        onClick = c;
-    }
-    public void onClick(){
-        onClick.accept(this);
-    }
-}

+ 2 - 1
src/main/java/util/GAMESTATE.java

@@ -2,5 +2,6 @@ package util;
 
 public enum GAMESTATE {
     PLAY,
-    PAUSED
+    PAUSED,
+    INVENTORY,
 }

+ 4 - 4
src/main/java/ui/Camera.java → src/main/java/view/Camera.java

@@ -1,7 +1,7 @@
-package ui;
+package view;
 
-import ui.entity.Entity;
-import util.KeyHandler;
+import view.entity.Entity;
+import controller.KeyHandler;
 
 import javax.imageio.ImageIO;
 import java.awt.*;
@@ -59,6 +59,6 @@ public class Camera extends Entity {
     public void draw(Graphics2D g2){
         g2.setColor(Color.WHITE);
 
-        g2.drawImage(optionalPlayerImage,screenX, screenY, gp.tileSize, gp.tileSize, null);
+        g2.drawImage(optionalPlayerImage, screenX, screenY, gp.tileSize, gp.tileSize, null);
     }
 }

+ 26 - 7
src/main/java/ui/GamePanel.java → src/main/java/view/GamePanel.java

@@ -1,8 +1,11 @@
-package ui;
+package view;
 
-import ui.tile.TileManager;
+import controller.MouseListener;
+import controller.MouseWheelZoom;
+import model.Inventory;
+import view.tile.TileManager;
 import util.GAMESTATE;
-import util.KeyHandler;
+import controller.KeyHandler;
 
 import javax.swing.*;
 import java.awt.*;
@@ -15,6 +18,8 @@ public class GamePanel extends JPanel implements Runnable{
 
     int fps = 60;
 
+    public Inventory inventory;
+
     public int tileSize = originalTileSize * scale;
     public int maxScreenCol = 16;
     public int maxScreenRow = 12;
@@ -29,6 +34,7 @@ public class GamePanel extends JPanel implements Runnable{
 
     //System
     public UI ui = new UI(this);
+
     // Game State
     public GAMESTATE gameState;
 
@@ -37,10 +43,14 @@ 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 Camera camera = new Camera(this, keyH);
 
+
     public GamePanel(){
-        MouseDragListener mdl = new MouseDragListener(this, camera, tileManager);
+        inventory = new Inventory();
+
+        MouseListener mdl = new MouseListener(this, camera, tileManager, inventoryView);
         this.addMouseListener(mdl);
         this.addMouseMotionListener(mdl);
         this.addMouseWheelListener(new MouseWheelZoom(this));
@@ -63,8 +73,6 @@ public class GamePanel extends JPanel implements Runnable{
             tileSize += i;
         }
 
-
-
         int newWorldWidth = tileSize * maxWorldCol;
 
         double multiplier = (double)newWorldWidth/oldWorldWidth;
@@ -91,15 +99,20 @@ public class GamePanel extends JPanel implements Runnable{
 
         tileManager.draw(g2);
         camera.draw(g2);
+
+        if(gameState == GAMESTATE.INVENTORY){
+            inventoryView.drawInventoryOverlay(g2);
+        }
         // UI
         ui.draw(g2);
         g2.dispose();
     }
     public void update(){
-        if(gameState == GAMESTATE.PLAY){
+        if(gameState == GAMESTATE.PLAY || gameState == GAMESTATE.INVENTORY){
             camera.update();
         }
     }
+
     @Override
     public void run() {
         double drawInterval = 1000000000/fps;
@@ -127,4 +140,10 @@ public class GamePanel extends JPanel implements Runnable{
             }
         }
     }
+    public void screenCoordinatesToWorld(int screenX, int screenY){
+        // Todo
+    }
+    public void highlightTile(int screenX, int screenY) {
+        System.out.println("X: " + screenX/tileSize+" Y: "+screenY/tileSize);
+    }
 }

+ 60 - 0
src/main/java/view/InventoryView.java

@@ -0,0 +1,60 @@
+package view;
+
+import model.Inventory;
+
+import java.awt.*;
+
+public class InventoryView {
+    private GamePanel gp;
+    private int inventoryHeight, inventoryWidth, inventoryY, inventoryX;
+
+
+    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
+
+        int overlayWidth = slotSize + 2* slotSpacing;
+        int overlayHeight = (slotSize + slotSpacing) * slotCount + slotSpacing;
+
+        // Background panel
+        g2.setColor(new Color(0, 0, 0, 160)); // semi-transparent black
+        g2.fillRoundRect(overlayX, overlayY, overlayWidth, overlayHeight, 15, 15);
+
+        // Draw slots
+        g2.setColor(Color.LIGHT_GRAY);
+        for (int i = 0; i < slotCount; i++) {
+
+            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);
+
+            g2.setColor(Color.LIGHT_GRAY); // reset color for next slot
+        }
+    }
+    public int getInventoryHeight() {
+        return inventoryHeight;
+    }
+
+    public int getInventoryWidth() {
+        return inventoryWidth;
+    }
+
+    public int getInventoryY() {
+        return inventoryY;
+    }
+
+    public int getInventoryX() {
+        return inventoryX;
+    }
+}

+ 82 - 0
src/main/java/view/UI.java

@@ -0,0 +1,82 @@
+package view;
+
+import util.GAMESTATE;
+
+import java.awt.*;
+
+public class UI {
+    private GamePanel gp;
+    private Graphics2D g2;
+    private Font arial_40;
+    private String message = "";
+    private boolean messageOn;
+
+    public UI(GamePanel gp){
+        this.gp = gp;
+        arial_40 = new Font("Arial", Font.PLAIN, 80);
+    }
+
+    public void showMessage(String text){
+        message = text;
+        messageOn = true;
+    }
+
+    public void draw(Graphics2D g2){
+        this.g2 = g2;
+        g2.setFont(arial_40);
+        g2.setColor(Color.white);
+
+        if(gp.gameState == GAMESTATE.PAUSED){
+            drawBlackScreenWithMessage(g2, "Spiel Pausiert");
+        }
+    }
+
+    private void drawBlackScreenWithMessage(Graphics2D g2, String message) {
+        // Background overlay
+        g2.setColor(new Color(0, 0, 0, 150));
+        g2.fillRect(0, 0, gp.screenWidth, gp.screenHeight);
+
+        // Dialog box
+        int boxWidth = gp.screenWidth / 2;
+        int boxHeight = gp.screenHeight / 3;
+        int boxX = gp.screenWidth / 2 - boxWidth / 2;
+        int boxY = gp.screenHeight / 3;
+
+        g2.setColor(Color.WHITE);
+        g2.fillRoundRect(boxX, boxY, boxWidth, boxHeight, 25, 25);
+
+        // Message text
+        g2.setColor(Color.BLACK);
+        g2.setFont(new Font("Arial", Font.BOLD, 28));
+        FontMetrics fm = g2.getFontMetrics();
+        int msgWidth = fm.stringWidth(message);
+        g2.drawString(message, gp.screenWidth / 2 - msgWidth / 2, boxY + 50);
+
+        // Buttons
+        int buttonWidth = 160;
+        int buttonHeight = 40;
+        int spacing = 20;
+
+        int buttonX = gp.screenWidth / 2 - buttonWidth / 2;
+        int resumeY = boxY + 100;
+        int exitY = resumeY + buttonHeight + spacing;
+
+        // Resume button
+        g2.setColor(new Color(200, 200, 200));
+        g2.fillRoundRect(buttonX, resumeY, buttonWidth, buttonHeight, 15, 15);
+        g2.setColor(Color.BLACK);
+        g2.drawString("Fortsetzen", buttonX + 11, resumeY + 30);
+
+        // Exit button
+        g2.setColor(new Color(200, 200, 200));
+        g2.fillRoundRect(buttonX, exitY, buttonWidth, buttonHeight, 15, 15);
+        g2.setColor(Color.BLACK);
+        g2.drawString("Beenden", buttonX + 22, exitY + 30);
+    }
+
+
+    public int getXForCenteredText(String text){
+        int length = (int)g2.getFontMetrics().getStringBounds(text, g2).getWidth();
+        return gp.screenWidth/2 - length/2;
+    }
+}

+ 1 - 1
src/main/java/ui/entity/Entity.java → src/main/java/view/entity/Entity.java

@@ -1,4 +1,4 @@
-package ui.entity;
+package view.entity;
 
 public class Entity {
 

+ 13 - 24
src/main/java/ui/tile/TileManager.java → src/main/java/view/tile/TileManager.java

@@ -1,22 +1,22 @@
-package ui.tile;
+package view.tile;
 
-import ui.GamePanel;
+import model.Tile;
+import model.tiles.BackgroundTile;
+import view.GamePanel;
 
-import javax.imageio.ImageIO;
 import java.awt.*;
-import java.awt.image.BufferedImage;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.nio.Buffer;
-import java.util.function.Consumer;
 
 public class TileManager {
 
     GamePanel gamePanel;
     public Tile[] tile;
+    private int MaxTileNumber;
     public int[][] mapTileNum;
+    public Tile[][] mapTiles;
     public int mapTileOverflow = 1;
     public TileManager(GamePanel gp){
         this.gamePanel = gp;
@@ -69,7 +69,6 @@ public class TileManager {
             double screenX = worldX - gamePanel.camera.worldX + gamePanel.camera.screenX;
             double screenY = worldY - gamePanel.camera.worldY + gamePanel.camera.screenY;
 
-
             if(worldX + gamePanel.tileSize*mapTileOverflow > gamePanel.camera.worldX - gamePanel.camera.screenX &&
                worldX - gamePanel.tileSize*mapTileOverflow < gamePanel.camera.worldX + gamePanel.camera.screenX &&
                worldY + gamePanel.tileSize*mapTileOverflow > gamePanel.camera.worldY - gamePanel.camera.screenY &&
@@ -90,14 +89,14 @@ public class TileManager {
 
     public void getTileImage(){
         try{
-            setupTile(0, "/tiles/grass.png");
-            setupTile(1, "/tiles/wall.png");
-            setupTile(2, "/tiles/water.png");
-            setupTile(3, "/tiles/earth.png");
+            setupTile(0, "grass");
+            setupTile(1, "wall");
+            setupTile(2, "water");
+            setupTile(3, "earth");
 
-            setupTile(4, "/tiles/tree.png", true, (tile) -> System.out.println("Clicked! x:"+ tile.worldX + ", y:" + tile.worldY));
+            setupTile(4, "tree");
 
-            setupTile(5, "/tiles/sand.png");
+            setupTile(5, "sand");
 
         }catch (IOException e){
             e.printStackTrace();
@@ -105,16 +104,6 @@ public class TileManager {
     }
     private void setupTile(int index, String path) throws IOException {
         tile[index] = new BackgroundTile();
-        tile[index].setImage(path);
-    }
-    private void setupTile(int index, String path, boolean interactive, Consumer<Tile> consumer) throws IOException {
-        if(!interactive){
-            tile[index] = new BackgroundTile();
-        }else{
-            InteractiveTile t = new InteractiveTile();
-            t.addOnClick(consumer);
-            tile[index] = t;
-        }
-        tile[index].setImage(path);
+        tile[index].setImage("/tiles/" + path + ".png");
     }
 }

+ 17 - 0
src/main/java/view/tile/interactive/InteractiveTile.java

@@ -0,0 +1,17 @@
+package view.tile.interactive;
+
+import model.Tile;
+
+import java.awt.*;
+import java.util.function.Consumer;
+
+public abstract class InteractiveTile extends Tile {
+    private Consumer<Point> onClick;
+    public InteractiveTile(){
+        interactive = true;
+    }
+    public void setOnClick(Consumer<Point> pointConsumer){
+        onClick = pointConsumer;
+    }
+    public abstract void onClick();
+}