📄 boardview1.java
字号:
/* * MegaMek - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006 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.swing;import megamek.client.event.BoardViewEvent;import megamek.client.event.BoardViewListener;import megamek.client.event.MechDisplayEvent;import megamek.client.event.MechDisplayListener;import megamek.client.ui.AWT.Messages;import megamek.client.ui.swing.util.ImageCache;import megamek.client.ui.swing.util.ImprovedAveragingScaleFilter;import megamek.client.ui.swing.util.KeyAlphaFilter;import megamek.client.ui.swing.util.PlayerColors;import megamek.client.ui.swing.util.StraightArrowPolygon;import megamek.common.Building;import megamek.common.Compute;import megamek.common.Coords;import megamek.common.Entity;import megamek.common.GunEmplacement;import megamek.common.IBoard;import megamek.common.IEntityMovementMode;import megamek.common.IEntityMovementType;import megamek.common.IGame;import megamek.common.IHex;import megamek.common.Infantry;import megamek.common.LosEffects;import megamek.common.Mech;import megamek.common.Minefield;import megamek.common.Mounted;import megamek.common.MovePath;import megamek.common.MoveStep;import megamek.common.Player;import megamek.common.Protomech;import megamek.common.Tank;import megamek.common.TargetRoll;import megamek.common.Targetable;import megamek.common.Terrains;import megamek.common.UnitLocation;import megamek.common.WeaponResult;import megamek.common.WeaponType;import megamek.common.actions.ArtilleryAttackAction;import megamek.common.actions.AttackAction;import megamek.common.actions.ChargeAttackAction;import megamek.common.actions.ClubAttackAction;import megamek.common.actions.DfaAttackAction;import megamek.common.actions.EntityAction;import megamek.common.actions.KickAttackAction;import megamek.common.actions.PhysicalAttackAction;import megamek.common.actions.ProtomechPhysicalAttackAction;import megamek.common.actions.PunchAttackAction;import megamek.common.actions.PushAttackAction;import megamek.common.actions.SearchlightAttackAction;import megamek.common.actions.WeaponAttackAction;import megamek.common.event.BoardEvent;import megamek.common.event.BoardListener;import megamek.common.event.GameBoardChangeEvent;import megamek.common.event.GameBoardNewEvent;import megamek.common.event.GameEntityChangeEvent;import megamek.common.event.GameEntityNewEvent;import megamek.common.event.GameEntityRemoveEvent;import megamek.common.event.GameListener;import megamek.common.event.GameListenerAdapter;import megamek.common.event.GameNewActionEvent;import megamek.common.event.GamePhaseChangeEvent;import megamek.common.preference.IClientPreferences;import megamek.common.preference.IPreferenceChangeListener;import megamek.common.preference.PreferenceChangeEvent;import megamek.common.preference.PreferenceManager;import javax.swing.JComponent;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JScrollBar;import javax.swing.JWindow;import javax.swing.ToolTipManager;import java.awt.Adjustable;import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.MediaTracker;import java.awt.Point;import java.awt.Polygon;import java.awt.Rectangle;import java.awt.Toolkit;import java.awt.event.AdjustmentEvent;import java.awt.event.AdjustmentListener;import java.awt.event.InputEvent;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.event.MouseWheelEvent;import java.awt.event.MouseWheelListener;import java.awt.image.FilteredImageSource;import java.awt.image.ImageFilter;import java.awt.image.ImageObserver;import java.awt.image.ImageProducer;import java.io.IOException;import java.util.ArrayList;import java.util.Enumeration;import java.util.HashMap;import java.util.Iterator;import java.util.Vector;/** * Displays the board; lets the user scroll around and select points on it. */public final class BoardView1 extends JComponent implements IBoardView, BoardListener, MouseListener, MouseMotionListener, KeyListener, AdjustmentListener, MechDisplayListener, IPreferenceChangeListener { private static final int TRANSPARENT = 0xFFFF00FF; // the dimensions of megamek's hex images private static final int HEX_W = 84; private static final int HEX_H = 72; private static final int HEX_WC = HEX_W - HEX_W / 4; // The list of valid zoom factors. Other values cause map aliasing, // I can't be bothered figuring out why. - Ben private static final float[] ZOOM_FACTORS = {0.30f, 0.41f, 0.50f, 0.60f, 0.68f, 0.79f, 0.90f, 1.00f //1.09f, 1.17f }; // the index of zoom factor 1.00f private static final int BASE_ZOOM_INDEX = 7; // line width of the c3 network lines private static final int C3_LINE_WIDTH = 1; private static final Font FONT_7 = new Font("SansSerif", Font.PLAIN, 7); //$NON-NLS-1$ private static final Font FONT_8 = new Font("SansSerif", Font.PLAIN, 8); //$NON-NLS-1$ private static final Font FONT_9 = new Font("SansSerif", Font.PLAIN, 9); //$NON-NLS-1$ private static final Font FONT_10 = new Font("SansSerif", Font.PLAIN, 10); //$NON-NLS-1$ private static final Font FONT_12 = new Font("SansSerif", Font.PLAIN, 12); //$NON-NLS-1$ private Dimension hex_size = null; private Font font_hexnum = FONT_10; private Font font_elev = FONT_9; private Font font_minefield = FONT_12; private final IGame game; private final JFrame frame; private Point mousePos = new Point(); private final Rectangle view = new Rectangle(); private final Point offset = new Point(); private Dimension boardSize; // scrolly stuff: private JScrollBar vScrollbar = null; private JScrollBar hScrollbar = null; private boolean isScrolling = false; private final Point scroll = new Point(); private boolean initCtlScroll; private boolean ctlKeyHeld = false; private int previousMouseX; private int previousMouseY; // back buffer to draw to private Image backImage; private Dimension backSize; private Graphics backGraph; // buffer for all the hexes you can possibly see private Image boardImage; private Rectangle boardRect; private Graphics boardGraph; // entity sprites private ArrayList<Sprite> entitySprites = new ArrayList<Sprite>(); private HashMap<Integer, Sprite> entitySpriteIds = new HashMap<Integer, Sprite>(); // sprites for the three selection cursors private final CursorSprite cursorSprite; private final CursorSprite highlightSprite; private final CursorSprite selectedSprite; private final CursorSprite firstLOSSprite; private final CursorSprite secondLOSSprite; // sprite for current movement private ArrayList<Sprite> pathSprites = new ArrayList<Sprite>(); // vector of sprites for all firing lines private ArrayList<Sprite> attackSprites = new ArrayList<Sprite>(); // vector of sprites for C3 network lines private ArrayList<Sprite> C3Sprites = new ArrayList<Sprite>(); // tooltip stuff private JWindow tipWindow; private boolean isTipPossible = false; private long lastIdle; private TilesetManager tileManager = null; // polygons for a few things private Polygon hexPoly; private Polygon[] facingPolys; private Polygon[] movementPolys; // the player who owns this BoardView's client private Player localPlayer = null; // should we mark deployment hexes for a player? private Player m_plDeployer = null; // should be able to turn it off(board editor) private boolean useLOSTool = true; private int zoomIndex; private float scale; private ImageCache<Image,Image> scaledImageCache = new ImageCache(); // Displayables (Chat box, etc.) private final Vector displayables = new Vector(); // Move units step by step private final Vector movingUnits = new Vector(); private long moveWait = 0; // moving entity sprites private ArrayList<Sprite> movingEntitySprites = new ArrayList<Sprite>(); private HashMap<Integer, Sprite> movingEntitySpriteIds = new HashMap<Integer, Sprite>(); private final ArrayList<Sprite> ghostEntitySprites = new ArrayList<Sprite>(); private final transient Vector boardListeners = new Vector(); // wreck sprites private ArrayList<Sprite> wreckSprites = new ArrayList<Sprite>(); private Coords rulerStart; // added by kenn private Coords rulerEnd; // added by kenn private Color rulerStartColor; // added by kenn private Color rulerEndColor; // added by kenn // Position of the mouse before right mouse button was pressed. Used to have an anchor for scrolling private Point oldMousePosition = null; // Indicate that a scrolling took place, so no popup should be drawn on right mouse button release private boolean scrolled = false; private Coords lastCursor; private Coords highlighted; private Coords selected; private Coords firstLOS; private final ClientGUI clientgui; //TODO please eliminate the usage of the clientgui private final RedrawWorker redrawWorker = new RedrawWorker(); //selected entity and weapon for artillery display private Entity selectedEntity = null; private Mounted selectedWeapon = null; //hexes with ECM effect private HashMap<Coords, Integer> ecmHexes = null; private boolean dirtyBoard = true; /** * Construct a new board view for the specified game */ public BoardView1(IGame game, JFrame frame) throws IOException { this(game, frame, null); } /** * Construct a new board view for the specified game */ public BoardView1(IGame game, JFrame frame, ClientGUI clientgui) throws IOException { //TODO please eliminate the usage of the clientgui this.clientgui = clientgui; this.game = game; this.frame = frame; tileManager = new TilesetManager(this); game.addGameListener(gameListener); game.getBoard().addBoardListener(this); redrawWorker.start(); addKeyListener(this); addMouseListener(this); addMouseMotionListener(this); addMouseWheelListener( new MouseWheelListener(){ public void mouseWheelMoved(MouseWheelEvent we){ if(GUIPreferences.getInstance().getMouseWheelZoom()) { if (we.getWheelRotation() > 0){ zoomIn(); } else { zoomOut(); } } } }); zoomIndex = GUIPreferences.getInstance().getMapZoomIndex(); checkZoomIndex(); scale = ZOOM_FACTORS[zoomIndex]; updateFontSizes(); updateBoardSize(); // tooltip tipWindow = new JWindow(frame); hex_size = new Dimension((int) (HEX_W * scale), (int) (HEX_H * scale)); initPolys(); cursorSprite = new CursorSprite(Color.cyan); highlightSprite = new CursorSprite(Color.white); selectedSprite = new CursorSprite(Color.blue); firstLOSSprite = new CursorSprite(Color.red); secondLOSSprite = new CursorSprite(Color.red); setToolTipText(""); System.out.println("ToolTip delay is set at: "+ToolTipManager.sharedInstance().getInitialDelay()); PreferenceManager.getClientPreferences().addPreferenceChangeListener(this); } public void preferenceChange(PreferenceChangeEvent e) { if (e.getName().equals(IClientPreferences.MAP_TILESET)) { updateBoard(); } } /** * Adds the specified board listener to receive * board events from this board. * * @param listener the board listener. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -