imageset.java~2~
来自「基于J2ME的手机游戏软件。可以控制游戏人物在地图上上下左右行走;可以在地图上放」· JAVA~2~ 代码 · 共 116 行
JAVA~2~
116 行
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Graphics;
import java.io.IOException;
public final class ImageSet {
private int totalStates; //总的状态数
private Image[][] stateFrames; //状态帧集合
private int[] stateAnimTime; //每个状态动画的过场时间
private int[] stateFrameWidth; //每个状态帧的帧宽
private int[] stateFrameHeight; //每个状态帧的帧高
//error: 0001 裁剪的图片尺寸太大,超过原图大小
//error: 0002 帧图片不存在
public ImageSet(int numState) { //构造器:初始化构造的状态个数
stateAnimTime = new int[numState];
stateFrameWidth = new int[numState];
stateFrameHeight = new int[numState];
stateFrames = new Image[numState][];
}
public int addState(Image[] frames, int animTime) { //增加状态
int state = ++totalStates;
if (state > stateFrames.length) {
stateAnimTime = Tool.expandArray(stateAnimTime, 1);
stateFrameWidth = Tool.expandArray(stateFrameWidth, 1);
stateFrameHeight = Tool.expandArray(stateFrameHeight, 1);
stateFrames = Tool.expandArray(stateFrames, 1);
}
stateAnimTime[state - 1] = animTime;
stateFrameWidth[state - 1] = frames[0].getWidth();
stateFrameHeight[state - 1] = frames[0].getHeight();
stateFrames[state - 1] = frames;
return state - 1;
}
public int getTotalFrames(int state) {
return stateFrames[state].length;
}
public int getTotalStates() {
return totalStates;
}
public int getAnimTime(int state) {
return stateAnimTime[state];
}
public int getAnimTimePerFrame(int state) {
return stateAnimTime[state] / stateFrames[state].length;
}
public void draw(Graphics target, int state, int frame, int targetX,
int targetY, int anchor) {
if (stateFrames[state][frame] != null) {
target.drawImage(stateFrames[state][frame],
targetX, targetY, anchor);
}
else {
System.out.println("error;0002");
}
}
public Image getFrame(int state, int frame) {
return stateFrames[state][frame];
}
public static Image getImageRegion(Image source, int x, int y, int width,
int height)
//获得子图形文件
{
// Image result = Image.createImage(width,height);
if (x + width > source.getWidth() || y + height > source.getHeight()) {
System.out.println("error:0001");
System.out.println(x + width);
System.out.println(y + height);
}
int[] rgb = new int[width * height];
source.getRGB(rgb, 0, width, x, y, width, height);
Image result = Image.createRGBImage(rgb, width, height, true);
// result.getGraphics().drawImage(source,-x,-y,Graphics.TOP|Graphics.LEFT);
return result;
}
public static Image[] extractFrames(Image source, //源图像文件
int sourceX, int sourceY, //分割帧的起始点
int framesWide, int framesHigh, //帧的个数
int frameWidth, int frameHeight) { //单帧长和宽
Image[] result = new Image[framesWide * framesHigh];
int frameCount = 0;
for (int y = 0; y < framesHigh; y++)
for (int x = 0; x < framesWide; x++) {
result[frameCount++] = getImageRegion(source, sourceX + (x * frameWidth),
sourceY + (y * frameHeight),
frameWidth, frameHeight);
}
return result;
}
public static Image loadClippedImage(String fileName,
int posX, int posY,
int width, int height) {
try {
Image fileImage = Image.createImage(fileName);
return getImageRegion(fileImage, posX, posY, width, height);
}
catch (IOException ioe) {
System.out.println("error:0005");
}
return null;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?