GamePanel.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package view;
  2. import controller.GameController;
  3. import controller.GameMouseListener;
  4. import controller.InteractiveController;
  5. import controller.MouseWheelZoom;
  6. import model.GameSaver;
  7. import model.Inventory;
  8. import view.entity.EntityManager;
  9. import view.popUpMenu.PopupManager;
  10. import view.tile.TileManager;
  11. import util.GAMESTATE;
  12. import javax.swing.*;
  13. import java.awt.*;
  14. import java.util.ArrayList;
  15. import java.util.Arrays;
  16. public class GamePanel extends JPanel{
  17. //Screen Settings
  18. public final int originalTileSize = 16;
  19. public final static int scale = 4;
  20. int fps = 60;
  21. public GameController gameController;
  22. public int tileSize = originalTileSize * scale;
  23. public int maxScreenCol = 16;
  24. public int maxScreenRow = 12;
  25. public int screenWidth = tileSize * maxScreenCol;
  26. public int screenHeight = tileSize * maxScreenRow;
  27. // World Settings
  28. public final static int maxWorldCol = 100;
  29. public final static int maxWorldRow = 100;
  30. //System
  31. public UI ui = new UI(this);
  32. private Graphics2D g2;
  33. // Game State
  34. public GAMESTATE gameState;
  35. public TileManager tileManager;
  36. public EntityManager entityManager;
  37. private PopupManager popupManager;
  38. private InventoryView inventoryView;
  39. public Camera camera;
  40. public GamePanel(GameController controller) {
  41. this.gameController = controller; // get from controller
  42. this.camera = new Camera(this, controller.getKeyHandler());
  43. this.tileManager = new TileManager(this);
  44. this.entityManager = new EntityManager(this);
  45. this.popupManager = new PopupManager(this, new ArrayList<>(Arrays.asList(tileManager, entityManager)));
  46. Inventory inventory = gameController.getModel().getInventory();
  47. this.inventoryView = new InventoryView(inventory);
  48. GameMouseListener mdl = new GameMouseListener(controller, this, camera);
  49. this.addMouseListener(mdl);
  50. this.addMouseMotionListener(mdl);
  51. this.addMouseWheelListener(new MouseWheelZoom(controller));
  52. this.setPreferredSize(new Dimension(screenWidth, screenHeight));
  53. this.setBackground(Color.BLACK);
  54. this.setDoubleBuffered(true);
  55. this.addKeyListener(controller.getKeyHandler()); // now safe
  56. this.setFocusable(true);
  57. gameState = GAMESTATE.PLAY;
  58. }
  59. public void loadMap(String worldPath){
  60. tileManager.loadMap(worldPath);
  61. }
  62. public void zoomInOut(int i) {
  63. if (gameState != GAMESTATE.PLAY) {
  64. return;
  65. }
  66. int oldTileSize = tileSize;
  67. int oldWorldWidth = oldTileSize * maxWorldCol;
  68. int oldWorldHeight = oldTileSize * maxWorldRow;
  69. int minTileSize = originalTileSize * scale / 4;
  70. int maxTileSize = originalTileSize * scale;
  71. // Only adjust tileSize within allowed bounds
  72. int newTileSize = tileSize + i;
  73. if (newTileSize < minTileSize || newTileSize > maxTileSize) {
  74. return;
  75. }
  76. tileSize = newTileSize;
  77. int newWorldWidth = tileSize * maxWorldCol;
  78. int newWorldHeight = tileSize * maxWorldRow;
  79. tileManager.resize(tileSize);
  80. entityManager.resize(tileSize);
  81. // Adjust camera position relative to the new scale
  82. double widthMultiplier = (double) newWorldWidth / oldWorldWidth;
  83. double heightMultiplier = (double) newWorldHeight / oldWorldHeight;
  84. camera.worldX = (int)(camera.worldX * widthMultiplier);
  85. camera.worldY = (int)(camera.worldY * heightMultiplier);
  86. }
  87. public void closeMenus(){
  88. ui.closeMenus();
  89. }
  90. public InventoryView getInventoryView(){
  91. return inventoryView;
  92. }
  93. @Override
  94. public void paintComponent(Graphics g) {
  95. super.paintComponent(g);
  96. g2 = (Graphics2D) g;
  97. tileManager.draw(g2);
  98. entityManager.draw(g2);
  99. popupManager.drawPopups(g2);
  100. if (gameState == GAMESTATE.INVENTORY) {
  101. inventoryView.drawInventoryOverlay(g2);
  102. }
  103. if (gameState == GAMESTATE.QUIT) {
  104. GameSaver.saveGame(gameController);
  105. System.exit(0);
  106. }
  107. ui.draw(g2);
  108. g2.dispose();
  109. }
  110. public void generateNewWorld() {
  111. tileManager.generateNewWorld();
  112. }
  113. public double getZoom() {
  114. return originalTileSize/tileSize;
  115. }
  116. }