ソースを参照

Besseres Menu, Speichern und laden von Games

Jan 7 ヶ月 前
コミット
7344aff865

+ 16 - 6
src/main/java/controller/GameController.java

@@ -1,6 +1,7 @@
 package controller;
 
 import model.GameModel;
+import model.GameSaver;
 import model.Item;
 import model.items.ITEM_NAME;
 import util.GAMESTATE;
@@ -9,11 +10,11 @@ import view.GamePanel;
 import java.io.Serializable;
 
 public class GameController implements Runnable, Serializable {
-    private KeyHandler keyHandler;
+    private transient KeyHandler keyHandler;
     private GameModel gameModel;
 
     private transient Thread gameThread; // transient to avoid serialization
-    private GamePanel view;
+    private transient GamePanel view;
     private boolean running = true;
     private int fps = 60;
 
@@ -51,6 +52,10 @@ public class GameController implements Runnable, Serializable {
         if (view.gameState == GAMESTATE.PLAY || view.gameState == GAMESTATE.INVENTORY) {
             view.camera.update();
         }
+        if(view.gameState == GAMESTATE.SAVE){
+            GameSaver.saveGame(this);
+            view.gameState = GAMESTATE.PLAY;
+        }
     }
 
     @Override
@@ -81,9 +86,7 @@ public class GameController implements Runnable, Serializable {
             }
         }
     }
-    public GamePanel getView(){
-        return view;
-    }
+
     public void zoomIn() {
         view.zoomInOut(1);
     }
@@ -110,12 +113,19 @@ public class GameController implements Runnable, Serializable {
             view.gameState = GAMESTATE.INVENTORY;
         }
     }
-
+    public GamePanel getView(){
+        if(view == null){
+            setView(new GamePanel(this));
+        }
+        return view;
+    }
     public GameModel getModel() {
+        if(gameModel == null) gameModel = new GameModel();
         return gameModel;
     }
 
     public KeyHandler getKeyHandler() {
+        if(keyHandler == null) keyHandler = new KeyHandler(this);
         return keyHandler;
     }
 }

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

@@ -1,7 +1,5 @@
 package controller;
 
-import util.GAMESTATE;
-import view.GamePanel;
 
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
@@ -22,7 +20,6 @@ public class KeyHandler implements KeyListener {
     @Override
     public void keyPressed(KeyEvent e) {
         int code = e.getKeyCode();
-
         switch (code) {
             case KeyEvent.VK_W -> upPressed = true;
             case KeyEvent.VK_A -> leftPressed = true;
@@ -38,7 +35,6 @@ public class KeyHandler implements KeyListener {
     @Override
     public void keyReleased(KeyEvent e) {
         int code = e.getKeyCode();
-
         switch (code) {
             case KeyEvent.VK_W -> upPressed = false;
             case KeyEvent.VK_A -> leftPressed = false;

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

@@ -2,13 +2,14 @@ package main;
 
 import controller.GameController;
 import model.GameModel;
+import model.GameSaver;
 import view.GamePanel;
 
 import javax.swing.*;
 
 public class Main {
     public static void main(String[] args) {
-        GameController gameController = new GameController();
+        GameController gameController = GameSaver.loadGame();
         GamePanel gamePanel = gameController.getView();
 
         System.out.println("Starte Spiel...");

+ 3 - 1
src/main/java/model/GameModel.java

@@ -1,6 +1,8 @@
 package model;
 
-public class GameModel {
+import java.io.Serializable;
+
+public class GameModel implements Serializable {
     private Inventory inventory;
 
     public GameModel() {

+ 2 - 3
src/main/java/model/GameSaver.java

@@ -23,9 +23,8 @@ public class GameSaver {
         File file = new File(SAVE_FILE);
 
         if (!file.exists()) {
-            // File doesn't exist → return a new GameController
             System.out.println("Save file not found. Starting a new game...");
-            return new GameController(); // Assumes a default constructor exists
+            return new GameController();
         }
 
         try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
@@ -33,7 +32,7 @@ public class GameSaver {
         } catch (Exception e) {
             System.out.println("Failed to load save file. Starting a new game...");
             e.printStackTrace();
-            return new GameController(); // Fallback if file is corrupt or incompatible
+            return new GameController();
         }
     }
 }

+ 2 - 1
src/main/java/model/Inventory.java

@@ -4,11 +4,12 @@ import model.items.ITEM_NAME;
 import view.GamePanel;
 import view.InventoryView;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
-public class Inventory {
+public class Inventory implements Serializable {
     private int uniqueItemsCount;
     private HashMap<ITEM_NAME, Item> itemHashMap;
     public Inventory() {

+ 3 - 1
src/main/java/model/Item.java

@@ -2,7 +2,9 @@ package model;
 
 import model.items.ITEM_NAME;
 
-public class Item {
+import java.io.Serializable;
+
+public class Item implements Serializable {
     private ITEM_NAME itemName;
     private int count;
     private boolean isSelected;

+ 3 - 1
src/main/java/model/items/ITEM_NAME.java

@@ -1,6 +1,8 @@
 package model.items;
 
-public enum ITEM_NAME {
+import java.io.Serializable;
+
+public enum ITEM_NAME implements Serializable {
     WOOD,
     STONE,
     WATER,

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

@@ -3,5 +3,7 @@ package util;
 public enum GAMESTATE {
     PLAY,
     PAUSED,
-    INVENTORY, QUIT,
+    INVENTORY,
+    QUIT,
+    SAVE
 }

+ 1 - 0
src/main/java/view/Camera.java

@@ -23,6 +23,7 @@ public class Camera extends Entity {
         //getPlayerImage();
         setDefaultValues();
     }
+
     private void getPlayerImage(){
         try{
             optionalPlayerImage = ImageIO.read(getClass().getResourceAsStream("/sprites/bigrock.png"));

+ 21 - 15
src/main/java/view/UI.java

@@ -23,7 +23,7 @@ public class UI {
         g2.setColor(Color.white);
 
         if(gp.gameState == GAMESTATE.PAUSED){
-            drawPauseScreen(g2, "Spiel Pausiert");
+            drawPauseScreen(g2, "Game Paused");
         }
     }
 
@@ -44,9 +44,9 @@ public class UI {
 
         // Dialog box
         int boxWidth = gp.screenWidth / 2;
-        int boxHeight = gp.screenHeight / 3;
+        int boxHeight = gp.screenHeight / 2;
         int boxX = gp.screenWidth / 2 - boxWidth / 2;
-        int boxY = gp.screenHeight / 3;
+        int boxY = gp.screenHeight / 4;
 
         g2.setColor(Color.WHITE);
         g2.fillRoundRect(boxX, boxY, boxWidth, boxHeight, 25, 25);
@@ -59,29 +59,35 @@ public class UI {
         g2.drawString(message, gp.screenWidth / 2 - msgWidth / 2, boxY + 50);
 
         // Buttons
-        int buttonWidth = 160;
+        int buttonWidth = 260;
         int buttonHeight = 40;
         int spacing = 20;
 
         int buttonX = gp.screenWidth / 2 - buttonWidth / 2;
         int resumeY = boxY + 100;
-        int exitY = resumeY + buttonHeight + spacing;
-        Button resumeButton = new Button(buttonHeight, buttonWidth, "Fortsetzen", () -> {
+        int saveY = resumeY + buttonHeight + spacing;
+        int exitY = resumeY + buttonHeight + buttonHeight + spacing + spacing;
+        Button resumeButton = new Button(buttonHeight, buttonWidth, "Continue", () -> {
             gp.gameState = GAMESTATE.PLAY;
         });
-        resumeButton.setScreenCoordinates(buttonX, resumeY);
-        resumeButton.draw(g2);
-        activeButtons.add(resumeButton);
+        drawAndRegisterButton(resumeButton, buttonX, resumeY);
 
-        Button exitButton = new Button(buttonHeight, buttonWidth, "Beenden", () -> {
-            gp.gameState = GAMESTATE.QUIT; // or custom exit logic
+        Button exitButton = new Button(buttonHeight, buttonWidth, "Quit", () -> {
+            gp.gameState = GAMESTATE.QUIT;
         });
-        exitButton.setScreenCoordinates(buttonX, exitY);
-        exitButton.draw(g2);
-        activeButtons.add(exitButton);
-    }
+        drawAndRegisterButton(exitButton, buttonX, exitY);
 
+        Button saveButton = new Button(buttonHeight, buttonWidth, "Save", () -> {
+            gp.gameState = GAMESTATE.SAVE;
+        });
+        drawAndRegisterButton(saveButton, buttonX, saveY);
+    }
 
+    private void drawAndRegisterButton(Button button, int buttonX, int buttonY){
+        button.setScreenCoordinates(buttonX, buttonY);
+        button.draw(g2);
+        activeButtons.add(button);
+    }
     public int getXForCenteredText(String text){
         int length = (int)g2.getFontMetrics().getStringBounds(text, g2).getWidth();
         return gp.screenWidth/2 - length/2;

+ 9 - 2
src/main/java/view/components/Button.java

@@ -3,7 +3,7 @@ package view.components;
 import java.awt.*;
 
 public class Button {
-    int screenX, screenY;
+    private int screenX, screenY;
     private int height;
     private int width;
     private String text;
@@ -15,6 +15,7 @@ public class Button {
         this.text = text;
         runnable = c;
     }
+
     public Button(int height, int width, int screenX, int screenY, String text, Runnable c){
         this.height = height;
         this.width = width;
@@ -23,20 +24,26 @@ public class Button {
         this.screenX = screenX;
         runnable = c;
     }
+
     public void click(){
         runnable.run();
     }
+
     public boolean wasClicked(int clickX, int clickY){
         if(clickX >= screenX && clickX <= screenX + width && clickY >= screenY && clickY <= screenY + height){
             return true;
         }else return false;
     }
+
     public void draw(Graphics2D g2){
         g2.setColor(new Color(200, 200, 200));
         g2.fillRoundRect(screenX, screenY, width, height, 15, 15);
         g2.setColor(Color.BLACK);
-        g2.drawString(text, screenX + 11, screenY + 30);
+        FontMetrics fm = g2.getFontMetrics();
+        int msgWidth = fm.stringWidth(text);
+        g2.drawString(text, screenX+ ((width - msgWidth) /2) + 1, screenY + 30);
     }
+
     public void setDimensions(int height, int width){
         this.height = height;
         this.width = width;