⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boardview1.java

📁 MegaMek is a networked Java clone of BattleTech, a turn-based sci-fi boardgame for 2+ players. Fight
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
/* * 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 + -