?? sprite.java
字號:
import javax.microedition.lcdui.Graphics;
/**
* A state manager for a game sprite. Use in conjunction with an ImageSet in
* order to draw animated, multi-state sprites. For each instance of an animated
* graphic you should create one corresponding Sprite object. Graphics are
* shared using a common ImageSet. To animate you must call this class's cycle
* method.
* @author Martin J. Wells
*/
public class Sprite
{
private int currentFrame;
private int currentState;
private long currentStateBegan; // time this currentState started
private ImageSet imageSet;
private long lastFrameChange;
private int totalCycles;
/**
* Constructor for a Sprite object requiring the source image set and the
* starting state and frame.
* @param is The imageSet which is the source of graphics for this Sprite.
* @param startingState The starting state (normally 0).
* @param startingFrame The starting frame (normally 0).
*/
public Sprite(ImageSet is, int startingState, int startingFrame)
{
imageSet = is;
setState(startingState, true);
currentFrame = startingFrame;
}
/**
* Change to a specific frame.
* @param f The frame to change to.
*/
public final void setFrame(int f)
{
currentFrame = f;
}
/**
* Change to a different state.
* @param s The state to change to.
* @param force Normally we wont change change if that is already the current
* state. However this has the effect of not reseting the state began time
* and totalCycles counter. Set this to true to force those to be reset.
*/
public final void setState(int s, boolean force)
{
if (currentState != s || force)
{
currentState = s;
currentFrame = 0;
totalCycles = 0;
currentStateBegan = System.currentTimeMillis();
}
}
/**
* Resets all state information such as the current animation frame, total
* number of completed cycles and the time the state began.
*/
public final void reset()
{
currentFrame = 0;
totalCycles = 0;
currentStateBegan = 0;
lastFrameChange = 0;
}
/**
* Get the time the last state change occurred.
* @return Time last state was changed in milliseconds since epoch.
*/
public final long getWhenStateBegan()
{
return currentStateBegan;
}
/**
* @return The total time spent in the current state.
*/
public final long getTimeInCurrentState()
{
return (System.currentTimeMillis() - currentStateBegan);
}
/**
* @return The current state.
*/
public final int getCurrentState()
{
return currentState;
}
/**
* @return The current frame number.
*/
public final int getCurrentFrame()
{
return currentFrame;
}
/**
* Draws the current sprite frame onto a specified graphics context.
* @param target The target to draw the image frame onto.
* @param targetX The target x position.
* @param targetY The target y position.
*/
public final void draw(Graphics target, int targetX, int targetY)
{
imageSet.draw(target, currentState, currentFrame, targetX, targetY);
}
/**
* Cycles the current sprites animation and goes forward by the number of
* frames corresponding to the amount of time that has elapsed.
* @param deltaMS The amount of time that has passed in milliseconds.
*/
public final void cycle(long deltaMS)
{
// change frame if we are animating (and enough time has passed)
if (imageSet.getTotalFrames(currentState) > 1 &&
imageSet.getAnimTime(currentState) > 0)
{
long deltaTime = System.currentTimeMillis() - lastFrameChange;
if (deltaTime > imageSet.getAnimTimePerFrame(currentState))
{
currentFrame++;
lastFrameChange = System.currentTimeMillis();
if (currentFrame >= imageSet.getTotalFrames(currentState))
{
currentFrame = 0;
totalCycles++;
}
}
}
}
/**
* @return The total number of cycles this sprite has animated through.
* Very useful for determining if a sprite has finished it's animation.
*/
public final int getTotalCycles()
{
return totalCycles;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -