package view; import controller.GameController; import controller.MouseListener; import controller.MouseWheelZoom; import model.GameSaver; import model.Inventory; import view.tile.TileManager; import util.GAMESTATE; import controller.KeyHandler; import view.util.screenCoordinatesToWorld; import javax.swing.*; import java.awt.*; public class GamePanel extends JPanel implements screenCoordinatesToWorld { //Screen Settings final static int originalTileSize = 16; final static int scale = 4; int fps = 60; public GameController gameController; public static int static_TileSize = originalTileSize * scale; 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 int maxWorldCol = 50; public final int maxWorldRow = 50; public final int worldWidth = tileSize * maxWorldCol; public final int worldHeight = tileSize * maxWorldRow; //System public UI ui = new UI(this); // Game State public GAMESTATE gameState; public TileManager tileManager; 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); Inventory inventory = gameController.getModel().getInventory(); this.inventoryView = new InventoryView(inventory); MouseListener mdl = new MouseListener(controller, this, camera, tileManager); this.addMouseListener(mdl); this.addMouseMotionListener(mdl); this.addMouseWheelListener(new MouseWheelZoom(this)); 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 zoomInOut(int i){ if(gameState != GAMESTATE.PLAY){ return; } int oldWorldWidth = tileSize * maxWorldCol; if((tileSize >= originalTileSize*scale/4 && i < 0) || (tileSize < (originalTileSize * scale) && i > 0)){ tileSize += i; } int newWorldWidth = tileSize * maxWorldCol; double multiplier = (double)newWorldWidth/oldWorldWidth; double newCameraWorldX = camera.worldX * multiplier; double newCameraWorldY = camera.worldY * multiplier; camera.worldX = (int) newCameraWorldX; camera.worldY = (int) newCameraWorldY; } public InventoryView getInventoryView(){ return inventoryView; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; tileManager.draw(g2); camera.draw(g2); if (gameState == GAMESTATE.INVENTORY) { inventoryView.drawInventoryOverlay(g2); } if (gameState == GAMESTATE.QUIT) { GameSaver.saveGame(gameController); System.exit(0); } if(gameState == GAMESTATE.PLAY){ ui.drawHut(g2); } ui.draw(g2); g2.dispose(); } public void update(){ if(gameState == GAMESTATE.PLAY || gameState == GAMESTATE.INVENTORY){ camera.update(); } } public int getWorldX(int screenX){ return (int) (camera.worldX + screenX / (double) tileSize); } public int getWorldY(int screenY){ return (int) (camera.worldY + screenY / (double) tileSize); } public GameController getGameController() { if(gameController == null){ gameController = new GameController(); } return gameController; } }