📄 mappreview.java
字号:
/* * MegaMek - Copyright (C) 2002,2003,2004,2005 Ben Mazur (bmazur@sev.org) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */package megamek.client.ui.AWT;import java.awt.*;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.util.Enumeration;import java.util.Vector;import java.io.*;import megamek.common.*;/** * Displays a Preview of a Board */public class MapPreview extends Canvas { // these indices match those in Terrains.java, and are therefore sensitive to any changes there private final static Color[] m_terrainColors = new Color[Terrains.SIZE]; private static Color HEAVY_WOODS; private static Color BACKGROUND; private static Color SINKHOLE; private static Color SMOKE_AND_FIRE; private final static int SHOW_NO_HEIGHT = 0; private final static int SHOW_GROUND_HEIGHT = 1; private final static int SHOW_BUILDING_HEIGHT = 2; private final static int SHOW_TOTAL_HEIGHT = 3; private final static int NBR_MODES = 3; private Image m_mapImage; private Dialog m_dialog; private IBoard m_board; private static final int margin = 6; private int topMargin; private int leftMargin; private static final int buttonHeight = 14; private boolean minimized = false; private int heightBufer; private Vector roadHexIndexes = new Vector(); private int zoom = GUIPreferences.getInstance().getMinimapZoom(); private int[] hexSide = {3,5,6,8,10,12}; private int[] hexSideByCos30 = {3,4,5,7,9,10}; private int[] hexSideBySin30 = {2,2,3,4,5,6}; private int[] halfRoadWidthByCos30 = {0,0,1,2,2,3}; private int[] halfRoadWidthBySin30 = {0,0,1,1,1,2}; private int[] halfRoadWidth = {0,0,1,2,3,3}; private int heightDisplayMode = SHOW_NO_HEIGHT; private ClientGUI clientgui; /** * Creates and lays out a new map preview. */ public MapPreview(Dialog d, IBoard board) throws IOException { m_board = board; m_dialog = d; initializeColors(); m_dialog.setResizable(false); addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent me) { processMouseClick(me.getX(), me.getY(), me); } }); // TODO: replace this quick-and-dirty with some real size calculator. Dimension size = getSize(); boolean updateSize = false; if ( size.width < GUIPreferences.getInstance().getMinimumSizeWidth()) { size.width = GUIPreferences.getInstance().getMinimumSizeWidth(); updateSize = true; } if ( size.height < GUIPreferences.getInstance().getMinimumSizeHeight() ) { size.height = GUIPreferences.getInstance().getMinimumSizeHeight(); updateSize = true; } if ( updateSize ) { setSize( size ); } setLocation( GUIPreferences.getInstance().getMinimapPosX(), GUIPreferences.getInstance().getMinimapPosY() ); } /* * Initialize default colours and override with config file if there is one. */ private void initializeColors() throws IOException { // set up defaults -- this might go away later... BACKGROUND = Color.black; m_terrainColors[0] = new Color(218,215,170); SINKHOLE = new Color(218,215,170); m_terrainColors[Terrains.WOODS] = new Color(180,230,130); HEAVY_WOODS = new Color(160,200,100); m_terrainColors[Terrains.ROUGH] = new Color(215,181,0); m_terrainColors[Terrains.RUBBLE] = new Color(200,200,200); m_terrainColors[Terrains.WATER] = new Color(200,247,253); m_terrainColors[Terrains.PAVEMENT] = new Color(204,204,204); m_terrainColors[Terrains.ROAD] = new Color(71,79,107); m_terrainColors[Terrains.FIRE] = Color.red; m_terrainColors[Terrains.SMOKE] = new Color(204,204,204); SMOKE_AND_FIRE = new Color(153,0,0); m_terrainColors[Terrains.SWAMP] = new Color(49,136,74); m_terrainColors[Terrains.BUILDING] = new Color(204,204,204); m_terrainColors[Terrains.BRIDGE] = new Color(109,55,25); m_terrainColors[Terrains.ICE] = new Color(204,204,255); m_terrainColors[Terrains.MAGMA] = new Color(200,0,0); m_terrainColors[Terrains.MUD] = new Color(218, 160, 100); m_terrainColors[Terrains.JUNGLE] = new Color(180,230,130); // now try to read in the config file int red; int green; int blue; File coloursFile = new File("data/images/hexes/" + GUIPreferences.getInstance().getMinimapColours()); //$NON-NLS-1$ // only while the defaults are hard-coded! if(!coloursFile.exists()) { return; } Reader cr = new FileReader(coloursFile); StreamTokenizer st = new StreamTokenizer(cr); st.lowerCaseMode(true); st.quoteChar('"'); st.commentChar('#'); scan: while (true) { red=0; green=0; blue=0; switch(st.nextToken()) { case StreamTokenizer.TT_EOF: break scan; case StreamTokenizer.TT_EOL: break scan; case StreamTokenizer.TT_WORD: // read in String key = st.sval; if (key.equals("unitsize")) { //$NON-NLS-1$ st.nextToken(); } else if (key.equals("background")) { //$NON-NLS-1$ st.nextToken(); red = (int)st.nval; st.nextToken(); green = (int)st.nval; st.nextToken(); blue = (int)st.nval; BACKGROUND = new Color(red,green,blue); } else if (key.equals("heavywoods")) { //$NON-NLS-1$ st.nextToken(); red = (int)st.nval; st.nextToken(); green = (int)st.nval; st.nextToken(); blue = (int)st.nval; HEAVY_WOODS = new Color(red,green,blue); } else if (key.equals("sinkhole")) { //$NON-NLS-1$ st.nextToken(); red = (int)st.nval; st.nextToken(); green = (int)st.nval; st.nextToken(); blue = (int)st.nval; SINKHOLE = new Color(red,green,blue); } else if (key.equals("smokeandfire")) { //$NON-NLS-1$ st.nextToken(); red = (int)st.nval; st.nextToken(); green = (int)st.nval; st.nextToken(); blue = (int)st.nval; SMOKE_AND_FIRE = new Color(red,green,blue); } else { st.nextToken(); red = (int)st.nval; st.nextToken(); green = (int)st.nval; st.nextToken(); blue = (int)st.nval; m_terrainColors[Terrains.getType(key)]=new Color(red,green,blue); } } } cr.close(); } public void initializeMap() { // sanity check (cfg file could be hosed) if (zoom < 0) { zoom = 0; } else if (zoom > (hexSide.length - 1)) { zoom = (hexSide.length - 1); } int requiredWidth, requiredHeight; int currentHexSide = hexSide[zoom]; int currentHexSideByCos30 = hexSideByCos30[zoom]; int currentHexSideBySin30 = hexSideBySin30[zoom]; topMargin = margin; leftMargin = margin; requiredWidth = m_board.getWidth()*(currentHexSide + currentHexSideBySin30) + currentHexSideBySin30 + 2*margin; requiredHeight = (2*m_board.getHeight() + 1)*currentHexSideByCos30 + 2*margin + buttonHeight; setSize(requiredWidth, requiredHeight); m_dialog.pack(); //m_dialog.show(); m_mapImage = createImage(getSize().width,getSize().height); if (getSize().width > requiredWidth) leftMargin = ((getSize().width - requiredWidth)/2) + margin; if (getSize().height > requiredHeight) topMargin = ((getSize().height - requiredHeight)/2) + margin; drawMap(); } // draw everything public synchronized void drawMap() { if (m_mapImage == null) { return; } if ( !m_dialog.isVisible() ) return; Graphics g = m_mapImage.getGraphics(); Color oldColor = g.getColor(); g.setColor(BACKGROUND); g.fillRect(0,0,getSize().width,getSize().height); g.setColor(oldColor); roadHexIndexes.removeAllElements(); for (int j = 0; j < m_board.getWidth(); j++) { for (int k = 0; k < m_board.getHeight(); k++) { IHex h = m_board.getHex(j, k); g.setColor(terrainColor(h, j, k)); paintCoord(g, j, k, true); } } if (! roadHexIndexes.isEmpty()) paintRoads(g); if (SHOW_NO_HEIGHT!=heightDisplayMode) { for (int j = 0; j < m_board.getWidth(); j++) { for (int k = 0; k < m_board.getHeight(); k++) { IHex h = m_board.getHex(j, k); paintHeight(g, h, j , k); } } } drawBtn(g); repaint(); } public void paint(Graphics g) { if (m_mapImage != null) { g.drawImage(m_mapImage, 0, 0, this); } } private void paintHeight(Graphics g, IHex h, int x, int y) { if (heightDisplayMode == SHOW_NO_HEIGHT) return; if(zoom > 2){ int baseX = x *(hexSide[zoom] + hexSideBySin30[zoom]) + leftMargin; int baseY = (2*y + 1 + x%2)* hexSideByCos30[zoom] + topMargin; g.setColor(Color.white); int height = 0; if (h.getTerrain(Terrains.BUILDING) != null && heightDisplayMode == SHOW_BUILDING_HEIGHT) { height = h.ceiling(); } else if (heightDisplayMode == SHOW_GROUND_HEIGHT) { height = h.floor(); } else if (heightDisplayMode == SHOW_TOTAL_HEIGHT) { height = ((h.getTerrain(Terrains.BUILDING) != null) || (h.getTerrain(Terrains.FUEL_TANK) != null)) ? h.ceiling() : h.floor(); } if (height != 0) { g.drawString(height + "", baseX + 5, baseY + 5); //$NON-NLS-1$ } } } private void paintCoord(Graphics g, int x, int y, boolean border) { int baseX = x *(hexSide[zoom] + hexSideBySin30[zoom]) + leftMargin; int baseY = (2*y + 1 + x%2)* hexSideByCos30[zoom] + topMargin; int [] xPoints = new int[6]; int [] yPoints = new int[6]; xPoints[0] = baseX; yPoints[0] = baseY;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -