package view; import controller.GameController; import controller.input.GameMouseListener; import controller.input.MouseWheelZoom; import model.GameSaver; import model.Inventory; import view.entity.EntityManager; import view.popUpMenu.PopupManager; import view.tile.TileManager; import util.GAMESTATE; import view.ui.InventoryView; import view.ui.menu.AbstractMenu; import view.ui.menu.MainMenu; import view.ui.ShopView; import view.ui.UI; import view.ui.menu.PauseMenu; import view.ui.menu.SettingsMenu; import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.Arrays; public class GamePanel extends JPanel{ //Screen Settings public final int originalTileSize = 16; public final static int scale = 4; int fps = 60; public GameController gameController; public int tileSize = originalTileSize * scale; public int maxScreenCol = 16; public int maxScreenRow = 12; public int screenWidth = tileSize * maxScreenCol; public int screenHeight = tileSize * maxScreenRow; // World Settings public final static int maxWorldCol = 100; public final static int maxWorldRow = 100; //System public UI ui = new UI(this); private Graphics2D g2; // Game State public GAMESTATE gameState; public TileManager tileManager; public EntityManager entityManager; private PopupManager popupManager; private InventoryView inventoryView; private ShopView shopView; public Camera camera; private MainMenu mainMenu; private SettingsMenu settingsMenu; private PauseMenu pauseMenu; public GamePanel(GameController controller) { this.gameController = controller; // get from controller this.camera = new Camera(this, controller.getKeyHandler()); this.settingsMenu = new SettingsMenu(this); this.tileManager = new TileManager(this); this.entityManager = new EntityManager(this); this.popupManager = new PopupManager(this, new ArrayList<>(Arrays.asList(tileManager, entityManager))); this.mainMenu = new MainMenu(this); this.pauseMenu = new PauseMenu(this); this.shopView = new ShopView(this); Inventory inventory = gameController.getModel().getInventory(); this.inventoryView = new InventoryView(inventory); GameMouseListener mdl = new GameMouseListener(controller, this, camera); this.addMouseListener(mdl); this.addMouseMotionListener(mdl); this.addMouseWheelListener(new MouseWheelZoom(controller)); this.setPreferredSize(new Dimension(screenWidth, screenHeight)); this.setBackground(Color.BLACK); this.setDoubleBuffered(true); this.addKeyListener(controller.getKeyHandler()); // now safe this.setFocusable(true); gameState = GAMESTATE.MAIN_MENU; } public void loadMap(String worldPath){ tileManager.loadMap(worldPath); } public void zoomInOut(int i) { if (gameState != GAMESTATE.PLAY) { return; } int oldTileSize = tileSize; int oldWorldWidth = oldTileSize * maxWorldCol; int oldWorldHeight = oldTileSize * maxWorldRow; int minTileSize = originalTileSize * scale / 4; int maxTileSize = originalTileSize * scale; // Only adjust tileSize within allowed bounds int newTileSize = tileSize + i; if (newTileSize < minTileSize || newTileSize > maxTileSize) { return; } tileSize = newTileSize; 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; camera.worldX = (int)(camera.worldX * widthMultiplier); camera.worldY = (int)(camera.worldY * heightMultiplier); camera.move(0,0); } public void closeMenus(){ ui.closeMenus(); } public InventoryView getInventoryView(){ return inventoryView; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g2 = (Graphics2D) g; if(gameState == GAMESTATE.NEW_GAME){ gameController.makeNewGame(); gameState = GAMESTATE.PLAY; }else if(gameState == GAMESTATE.LOAD_GAME){ gameController.loadGame(); gameState = GAMESTATE.PLAY; } tileManager.draw(g2); entityManager.draw(g2); popupManager.drawPopups(g2); if(gameState == GAMESTATE.SHOP){ shopView.drawOverlay(g2); } if (gameState == GAMESTATE.INVENTORY) { inventoryView.drawInventoryOverlay(g2); } if (gameState == GAMESTATE.QUIT) { GameSaver.saveGame(gameController); System.exit(0); } if(gameState == GAMESTATE.PAUSED){ pauseMenu.draw(g2); }else if(gameState == GAMESTATE.MAIN_MENU){ drawMenu(mainMenu, g2); }else if(gameState == GAMESTATE.SETTINGS){ drawMenu(settingsMenu, g2); } g2.dispose(); } private void drawMenu(AbstractMenu menu, Graphics2D g2){ menu.draw(g2); } public void generateNewWorld() { tileManager.generateNewWorld(); } public double getZoom() { return originalTileSize/tileSize; } public void toggleShop() { closeMenus(); if(gameState == GAMESTATE.SHOP){ gameState = GAMESTATE.PLAY; }else gameState = GAMESTATE.SHOP; } public ShopView getShopView() { return shopView; } public void handleMenusClicks(int x, int y) { if(gameState == GAMESTATE.MAIN_MENU){ mainMenu.handleClick(x,y); }else if(gameState == GAMESTATE.SETTINGS){ settingsMenu.handleClick(x,y); }else if(gameState == GAMESTATE.PAUSED){ pauseMenu.handleClick(x,y); } } }