ShopView.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package view.ui;
  2. import controller.factories.InteractiveTileFactory;
  3. import controller.tiles.interactive.InteractiveTileController;
  4. import model.Inventory;
  5. import model.items.ITEM_NAME;
  6. import model.tiles.InteractiveTileModel;
  7. import model.tiles.InteractiveTileType;
  8. import util.Translator;
  9. import util.economy.EconomyData;
  10. import util.economy.EconomyInfo;
  11. import view.GamePanel;
  12. import view.tile.TileManager;
  13. import javax.imageio.ImageIO;
  14. import java.awt.*;
  15. import java.awt.image.BufferedImage;
  16. import java.io.IOException;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import java.util.Map;
  20. public class ShopView {
  21. private GamePanel gamePanel;
  22. private List<InteractiveTileType> offers;
  23. int overlayY = 80;
  24. int slotSize = 128;
  25. int spacing = 8;
  26. int slotCount = 0;
  27. int offsetX, offsetY;
  28. public ShopView(GamePanel gamePanel){
  29. this.gamePanel = gamePanel;
  30. offers = EconomyInfo.getOffers();
  31. }
  32. public void drawOverlay(Graphics2D g2) {
  33. drawShopOverlay(g2, Translator.translate("menu.shop"));
  34. drawInventoryOverlay(g2);
  35. }
  36. private void drawInventoryOverlay(Graphics2D g2) {
  37. gamePanel.getInventoryView().drawInventoryOverlay(g2);
  38. }
  39. public void drawShopOverlay(Graphics2D g2, String title){
  40. slotCount = offers.size();
  41. int overlayWidth = (slotSize + spacing) * slotCount + spacing;
  42. int overlayHeight = slotSize + 2* spacing;
  43. offsetX = gamePanel.getWidth()/2 - overlayWidth/2;
  44. offsetY = overlayY + spacing;
  45. g2.setColor(new Color(0, 0, 0, 160));
  46. g2.fillRoundRect(offsetX, offsetY, overlayWidth, overlayHeight, 25,25);
  47. drawTitle(g2, title);
  48. offsetX += spacing;
  49. offsetY += spacing;
  50. for(InteractiveTileType type : offers){
  51. drawOffer(g2, type);
  52. }
  53. }
  54. public InteractiveTileController getClickedOffer(int x, int y) {
  55. int offerCount = offers.size();
  56. int overlayWidth = (slotSize + spacing) * offerCount + spacing;
  57. int baseOffsetX = gamePanel.getWidth() / 2 - overlayWidth / 2;
  58. int baseOffsetY = overlayY + spacing;
  59. int offerX = baseOffsetX + spacing;
  60. int offerY = baseOffsetY + spacing;
  61. for (int i = 0; i < offerCount; i++) {
  62. int currentX = offerX + i * (slotSize + spacing);
  63. int currentY = offerY;
  64. if (x >= currentX && x <= currentX + slotSize &&
  65. y >= currentY && y <= currentY + slotSize) {
  66. TileManager tm = gamePanel.tileManager;
  67. return InteractiveTileFactory.createTile(gamePanel.gameController, new InteractiveTileModel(tm.screenToWorldX(x), tm.screenToWorldY(y), offers.get(i)));
  68. }
  69. }
  70. return null; // No offer clicked
  71. }
  72. private void drawOffer(Graphics2D g2, InteractiveTileType offer){
  73. g2.setColor(Color.LIGHT_GRAY);
  74. g2.fillRoundRect(offsetX, offsetY, slotSize, slotSize, 25, 25);
  75. g2.setColor(Color.BLACK);
  76. BufferedImage image = getImage("/tiles/" + offer.toString().toLowerCase() + "/" + offer.toString().toLowerCase() + "Test.png");
  77. int imageSize = slotSize/2;
  78. g2.drawImage(image, offsetX + (slotSize/2 - imageSize/2), offsetY, imageSize, imageSize,null);
  79. EconomyData data = EconomyInfo.infoOf(offer);
  80. int stringOffset = slotSize + imageSize;
  81. List<Map.Entry<ITEM_NAME, Integer>> entries = new ArrayList<>(data.getCosts().get(1).entrySet());
  82. for(Map.Entry<ITEM_NAME, Integer> entry : entries){
  83. String needed = Translator.translate("item."+entry.getKey()) + ": " + entry.getValue();
  84. int strWidth = g2.getFontMetrics().stringWidth(needed);
  85. Inventory inventory = gamePanel.gameController.getModel().getInventory();
  86. if(inventory.hasEnough(entry.getKey(), entry.getValue())){
  87. g2.setColor(Color.BLACK);
  88. }else{
  89. g2.setColor(Color.RED);
  90. }
  91. g2.drawString(needed, offsetX + (slotSize/2 - strWidth/2), stringOffset);
  92. stringOffset += g2.getFontMetrics().getHeight();
  93. }
  94. offsetX += slotSize + spacing;
  95. if(offsetX >= gamePanel.getWidth() - slotSize*2){
  96. offsetY += slotSize + spacing;
  97. offsetX = slotSize + slotSize/2;
  98. }
  99. }
  100. private void drawTitle(Graphics2D g2, String title){
  101. Font defaultF = g2.getFont();
  102. g2.setFont(new Font("Arial", Font.BOLD, 50));
  103. FontMetrics fm = g2.getFontMetrics();
  104. int msgWidth = fm.stringWidth(title);
  105. g2.setColor(new Color(0, 0, 0, 100));
  106. int offset = 100;
  107. g2.fillRoundRect(gamePanel.screenWidth /2 - msgWidth /2 - offset/2, 40 - fm.getHeight()/2, msgWidth + offset, 50, 25, 25);
  108. g2.setColor(Color.WHITE);
  109. g2.drawString(title, gamePanel.screenWidth / 2 - msgWidth / 2, 50);
  110. g2.setFont(defaultF);
  111. }
  112. private BufferedImage getImage(String imagePath){
  113. try {
  114. return ImageIO.read(getClass().getResourceAsStream(imagePath));
  115. } catch (IOException e) {
  116. e.printStackTrace();
  117. }
  118. return null;
  119. }
  120. }