package view; import controller.GameController; import controller.GameMouseListener; import controller.InteractiveController; 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{ //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; public Camera camera; public GamePanel(GameController controller) { this.gameController = controller; // get from controller this.camera = new Camera(this, controller.getKeyHandler()); 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); 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.PLAY; } 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); } public void closeMenus(){ ui.closeMenus(); } public InventoryView getInventoryView(){ return inventoryView; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g2 = (Graphics2D) g; tileManager.draw(g2); entityManager.draw(g2); popupManager.drawPopups(g2); if (gameState == GAMESTATE.INVENTORY) { inventoryView.drawInventoryOverlay(g2); } if (gameState == GAMESTATE.QUIT) { GameSaver.saveGame(gameController); System.exit(0); } ui.draw(g2); g2.dispose(); } public void generateNewWorld() { tileManager.generateNewWorld(); } public double getZoom() { return originalTileSize/tileSize; } }