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

📄 screenobjectpathfollower.java

📁 Vyger offers a D & D and Rogue-like environment in a graphical online roleplay game.
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* * Light And Shadow. A Persistent Universe based on Robert Jordan's Wheel of Time Books. * Copyright (C) 2001-2003 WOTLAS Team * * 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. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */package wotlas.common.movement;import wotlas.libs.pathfinding.*;import wotlas.common.*;import wotlas.common.message.movement.*;import wotlas.common.universe.*;import wotlas.utils.*;import wotlas.libs.persistence.*;import wotlas.common.screenobject.*;import wotlas.common.router.*;import java.awt.Point;/**  * First of all : look at pathFollower. * Second and last : this manage on TILEMAPS the movement of anything else then *                   the master player AND on the server OF EVERYTHING else then *                   the players * * IMPORTANT : this implementation is NOT synchronized... please avoid the situation *             when one thread is invoking the tick() method and the other a setXXX()... * * @author Petrus, Aldiss, Diego * @see wotlas.common.movement.MovementComposer * @see wotlas.common.movement.PathFollower */public class ScreenObjectPathFollower implements MovementComposer,BackupReady {    /** id used in Serialized interface.     */    private static final long serialVersionUID = 556565L;  /*------------------------------------------------------------------------------------*/  /** Distance in pixels before we consider the slave replica too far from its   *  master replica : we then make slave replica jump to its final position.   */    public final static int MAX_DISTANCE_DELAY = 200; /*------------------------------------------------------------------------------------*/  /** To tell that we must reconstruct a trajectory that was not possible   *  to construct before, due to a AStar not initialized...   */    transient private boolean reconstructTrajectory = false;  /** Saved DeltaTime for trajectory reconstruction.   */    transient private int movementDeltaTime; /*------------------------------------------------------------------------------------*/  // PATH FIELDS  /** Player's trajectory   */    transient private List path;  /** Our current index in the Path ( next point we target )   */    transient private int pathIndex;  /** Previous point in path.   */    transient private Point prevPoint;  /** Next point in path.   */    transient private Point nextPoint;  /** End point of the path (for persistence only).   */    private ScreenPoint endPoint;  /** Next Angle in the path.   */    transient private float nextAngle;  /** what's our current movement  ? walking ? turning ? do we have to provide   *  realistic rotations ?   */    private boolean walkingAlongPath;    transient private boolean turningAlongPath;    transient private boolean realisticRotations;  /** Last update time.   */    transient private long lastUpdateTime; /*------------------------------------------------------------------------------------*/  // KINEMATIC FIELDS  /** Current position   */    private float xPosition;    private float yPosition;  /** Current Orientation (our angle in rads)   */    private double orientationAngle;  /** PathFollower speed in pixel/s ( default 60 pixel/s )   */    transient private float speed = 60;  /** PathFollower angular speed in radian/s ( default 3 rad/s )   */    transient private float angularSpeed = 3;  /** in which angular direction are we turning ? +1 for positive direction, -1 otherwise.   */    transient private byte angularDirection;  /** Time when we initialized the last movement.   */    private long movementTimeStamp; /*------------------------------------------------------------------------------------*/  /** Do we have to set a special orientation of the player at the end of his movement.   *  This field is useful when recreating a trajectory : we don't want the final   *  orientation of the player to differ from the original replica.   */    transient private boolean useEndingOrientationValue;  /** The ending orientation for the slave replica of the player.   */    transient private double endingOrientation;  /** Asociated Player.   */    transient private ScreenObject screenObject; /*------------------------------------------------------------------------------------*/   /** To init the MovementComposer classes with the ground's mask.    * @param mask two dimension mask representing the zones where the players can go.    * @param maskTileSize mask tile size (in pixels).    * @param playerSize represents the average player size ( in maskTileSize unit )    */     public void setMovementMask( boolean mask[][], int maskTileSize, int spriteSize ) {         AStarDouble.setMask( mask );         AStarDouble.setTileSize( maskTileSize );         AStarDouble.setSpriteSize( spriteSize );     } /*------------------------------------------------------------------------------------*/   /** To get a path between two points via Astar.    * @param a first point    * @param b second point    * @return path    */     public static List findPath(  Point a, Point b, boolean pathInRoom ) {           int tileSize = AStarDouble.getTileSize();                   List path = AStarDouble.findPath( new Point( a.x/tileSize, a.y/tileSize ),                                       new Point( b.x/tileSize, b.y/tileSize ) );           path = AStarDouble.smoothPath(path);                                if( path==null || path.size()<2 )               return null; // no movement           if(path!=null)              for (int i=0; i<path.size(); i++) {                   Point p = (Point) path.elementAt(i);                   if(pathInRoom && i!=path.size()-1) {                      p.x = p.x*tileSize-5;                      p.y = p.y*tileSize-5;                   }                   else {                      p.x *= tileSize;                      p.y *= tileSize;                   }              }           return path;     } /*------------------------------------------------------------------------------------*/  /** Empty Constructor.   */    public ScreenObjectPathFollower() {        walkingAlongPath = false;        turningAlongPath = false;        realisticRotations = false;        useEndingOrientationValue = false;    } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/  /** Constructor with initial position & orientation   *   *  @param xPosition x position in pixels.   *  @param yPosition y position in pixels.   *  @param orientationAngle orientation angle in radians.   */    public ScreenObjectPathFollower( float xPosition, float yPosition, double orientationAngle ) {        this();        this.xPosition = xPosition;        this.yPosition = yPosition;        this.orientationAngle = orientationAngle;    } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/    /** To init this MovementComposer.    * @param player associated player.    */    public void init(Player player) {        Debug.signal( Debug.ERROR, null, "This should never be called : init with player on ScreenObjectPathFollower!" );    }    public void init(ScreenObject screenObject) {        this.screenObject = screenObject;    } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/  // KINEMATIC GETTERS & SETTERS  /** To get the X position.   * @return x position   */    public float getXPosition() {      return xPosition;    }  /** To set the X Position.   * @param x x cordinate   */    public void setXPosition( float xPosition ){      this.xPosition = xPosition;    }  /** To get the Y position.   * @return y position   */    public float getYPosition() {      return yPosition;    }  /** To set the Y Position.   * @param y y cordinate   */    public void setYPosition( float yPosition ){      this.yPosition = yPosition;    }  /** To get the orientation angle.   * @return angle in radians.   */    public double getOrientationAngle() {      return orientationAngle;    }  /** To set the orientation angle.   * @param orientationAngle angle in radians.   */    public void setOrientationAngle(double orientationAngle) {      this.orientationAngle = orientationAngle;    }  /** To set screenObject's speed   */    public void setSpeed(float speed) {      this.speed = speed;    }  /** To get screenObject's speed   */    public float getSpeed() {      return speed;    }  /** To set screenObject's angular speed   */    public void setAngularSpeed(float angularSpeed) {      this.angularSpeed = angularSpeed;    }  /** To get screenObject's angular speed   */    public float getAngularSpeed() {      return angularSpeed;    }  /** To set if the screenObject is walking along the path   */    public void setWalkingAlongPath(boolean walkingAlongPath) {      this.walkingAlongPath = walkingAlongPath;    }  /** is the screenObject moving ( same as isMoving(), this method is for persistence only )   */    public boolean getWalkingAlongPath() {      return walkingAlongPath;    }  /** To set the screenObject end position ( for persistence only )   */    public void setEndPoint(ScreenPoint endPoint) {      this.endPoint= endPoint;    }  /** To get the end position of the current movement ( for persistence only, prefer   *  getTargetPosition() )   */    public ScreenPoint getEndPoint() {      return endPoint;    } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -