GamePanel.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package view;
  2. import controller.GameController;
  3. import controller.input.GameMouseListener;
  4. import controller.input.MouseWheelZoom;
  5. import model.GameSaver;
  6. import model.Inventory;
  7. import view.entity.EntityManager;
  8. import view.popUpMenu.PopupManager;
  9. import view.tile.TileManager;
  10. import util.GAMESTATE;
  11. import view.ui.InventoryView;
  12. import view.ui.menu.AbstractMenu;
  13. import view.ui.menu.MainMenu;
  14. import view.ui.ShopView;
  15. import view.ui.UI;
  16. import view.ui.menu.PauseMenu;
  17. import view.ui.menu.SettingsMenu;
  18. import javax.swing.*;
  19. import java.awt.*;
  20. import java.util.ArrayList;
  21. import java.util.Arrays;
  22. public class GamePanel extends JPanel{
  23. //Screen Settings
  24. public final int originalTileSize = 16;
  25. public final static int scale = 4;
  26. int fps = 60;
  27. public GameController gameController;
  28. public int tileSize = originalTileSize * scale;
  29. public int maxScreenCol = 16;
  30. public int maxScreenRow = 12;
  31. public int screenWidth = tileSize * maxScreenCol;
  32. public int screenHeight = tileSize * maxScreenRow;
  33. // World Settings
  34. public final static int maxWorldCol = 100;
  35. public final static int maxWorldRow = 100;
  36. //System
  37. public UI ui = new UI(this);
  38. private Graphics2D g2;
  39. // Game State
  40. public GAMESTATE gameState;
  41. public TileManager tileManager;
  42. public EntityManager entityManager;
  43. private PopupManager popupManager;
  44. private InventoryView inventoryView;
  45. private ShopView shopView;
  46. public Camera camera;
  47. private MainMenu mainMenu;
  48. private SettingsMenu settingsMenu;
  49. private PauseMenu pauseMenu;
  50. public GamePanel(GameController controller) {
  51. this.gameController = controller; // get from controller
  52. this.camera = new Camera(this, controller.getKeyHandler());
  53. this.settingsMenu = new SettingsMenu(this);
  54. this.tileManager = new TileManager(this);
  55. this.entityManager = new EntityManager(this);
  56. this.popupManager = new PopupManager(this, new ArrayList<>(Arrays.asList(tileManager, entityManager)));
  57. this.mainMenu = new MainMenu(this);
  58. this.pauseMenu = new PauseMenu(this);
  59. this.shopView = new ShopView(this);
  60. Inventory inventory = gameController.getModel().getInventory();
  61. this.inventoryView = new InventoryView(inventory);
  62. GameMouseListener mdl = new GameMouseListener(controller, this, camera);
  63. this.addMouseListener(mdl);
  64. this.addMouseMotionListener(mdl);
  65. this.addMouseWheelListener(new MouseWheelZoom(controller));
  66. this.setPreferredSize(new Dimension(screenWidth, screenHeight));
  67. this.setBackground(Color.BLACK);
  68. this.setDoubleBuffered(true);
  69. this.addKeyListener(controller.getKeyHandler()); // now safe
  70. this.setFocusable(true);
  71. gameState = GAMESTATE.MAIN_MENU;
  72. }
  73. public void loadMap(String worldPath){
  74. tileManager.loadMap(worldPath);
  75. }
  76. public void zoomInOut(int i) {
  77. if (gameState != GAMESTATE.PLAY) {
  78. return;
  79. }
  80. int oldTileSize = tileSize;
  81. int oldWorldWidth = oldTileSize * maxWorldCol;
  82. int oldWorldHeight = oldTileSize * maxWorldRow;
  83. int minTileSize = originalTileSize * scale / 4;
  84. int maxTileSize = originalTileSize * scale;
  85. // Only adjust tileSize within allowed bounds
  86. int newTileSize = tileSize + i;
  87. if (newTileSize < minTileSize || newTileSize > maxTileSize) {
  88. return;
  89. }
  90. tileSize = newTileSize;
  91. int newWorldWidth = tileSize * maxWorldCol;
  92. int newWorldHeight = tileSize * maxWorldRow;
  93. tileManager.resize(tileSize);
  94. entityManager.resize(tileSize);
  95. // Adjust camera position relative to the new scale
  96. double widthMultiplier = (double) newWorldWidth / oldWorldWidth;
  97. double heightMultiplier = (double) newWorldHeight / oldWorldHeight;
  98. camera.worldX = (int)(camera.worldX * widthMultiplier);
  99. camera.worldY = (int)(camera.worldY * heightMultiplier);
  100. camera.move(0,0);
  101. }
  102. public void closeMenus(){
  103. ui.closeMenus();
  104. }
  105. public InventoryView getInventoryView(){
  106. return inventoryView;
  107. }
  108. @Override
  109. public void paintComponent(Graphics g) {
  110. super.paintComponent(g);
  111. g2 = (Graphics2D) g;
  112. if(gameState == GAMESTATE.NEW_GAME){
  113. gameController.makeNewGame();
  114. gameState = GAMESTATE.PLAY;
  115. }else if(gameState == GAMESTATE.LOAD_GAME){
  116. gameController.loadGame();
  117. gameState = GAMESTATE.PLAY;
  118. }
  119. tileManager.draw(g2);
  120. entityManager.draw(g2);
  121. popupManager.drawPopups(g2);
  122. if(gameState == GAMESTATE.SHOP){
  123. shopView.drawOverlay(g2);
  124. }
  125. if (gameState == GAMESTATE.INVENTORY) {
  126. inventoryView.drawInventoryOverlay(g2);
  127. }
  128. if (gameState == GAMESTATE.QUIT) {
  129. GameSaver.saveGame(gameController);
  130. System.exit(0);
  131. }
  132. if(gameState == GAMESTATE.PAUSED){
  133. pauseMenu.draw(g2);
  134. }else if(gameState == GAMESTATE.MAIN_MENU){
  135. drawMenu(mainMenu, g2);
  136. }else if(gameState == GAMESTATE.SETTINGS){
  137. drawMenu(settingsMenu, g2);
  138. }
  139. g2.dispose();
  140. }
  141. private void drawMenu(AbstractMenu menu, Graphics2D g2){
  142. menu.draw(g2);
  143. }
  144. public void generateNewWorld() {
  145. tileManager.generateNewWorld();
  146. }
  147. public double getZoom() {
  148. return originalTileSize/tileSize;
  149. }
  150. public void toggleShop() {
  151. closeMenus();
  152. if(gameState == GAMESTATE.SHOP){
  153. gameState = GAMESTATE.PLAY;
  154. }else gameState = GAMESTATE.SHOP;
  155. }
  156. public ShopView getShopView() {
  157. return shopView;
  158. }
  159. public void handleMenusClicks(int x, int y) {
  160. if(gameState == GAMESTATE.MAIN_MENU){
  161. mainMenu.handleClick(x,y);
  162. }else if(gameState == GAMESTATE.SETTINGS){
  163. settingsMenu.handleClick(x,y);
  164. }else if(gameState == GAMESTATE.PAUSED){
  165. pauseMenu.handleClick(x,y);
  166. }
  167. }
  168. }