package sprite;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;
public class spriteCanvas extends Canvas implements Runnable {
public int[] key = new int[4];
public final static int KEY_UP = -1;
public final static int KEY_DOWN = -2;
public final static int KEY_LEFT = -3;
public final static int KEY_RIGHT = -4;
public int direct = -1, ndirect;
public Thread thread;
public Image image;
public Sprite mSprite;
int[][] FRAME_SEQUENCE = { { 0, 1, 2, 1 }, { 3, 4, 5, 4 }, { 6, 7, 8, 7 },
{ 9, 10, 11, 10 }, { 1 }, { 4 }, { 7 }, { 10 } };// 定义帧序列数组
int curX;
int curY;
public spriteCanvas() {
init();
}
public void init() {
try {
image = Image.createImage("/run.png");// 加载Sprite的原图像
} catch (Exception e) {
System.out.println("load image error:" + e);
}
mSprite = new Sprite(image, 21, 31);// 创建精灵,指定精灵的宽度为21,高度为31
// mSprite.setFrameSequence(FRAME_SEQUENCE[1]);
curX = (getWidth() - mSprite.getWidth()) / 2;// 获取精灵放置在屏幕中间X坐标
curY = (getHeight() - mSprite.getHeight()) / 2;// 获取精灵放置在屏幕中间Y坐标
mSprite.setRefPixelPosition(curX, curY);// 设置精灵的位置为屏幕的正中间
}
public void input() {
key[0] = key[2];
key[1] = key[3];
key[2] = 0;
}
public void update() {
mSprite.nextFrame();
if (key[1] == 0) {
if (ndirect == 0)
mSprite.setFrameSequence(FRAME_SEQUENCE[4]);// 将精灵序列加到精灵属性中
if (ndirect == 1)
mSprite.setFrameSequence(FRAME_SEQUENCE[5]);
if (ndirect == 2)
mSprite.setFrameSequence(FRAME_SEQUENCE[6]);
if (ndirect == 3)
mSprite.setFrameSequence(FRAME_SEQUENCE[7]);
direct = -1;
}
// System.out.println(key[1]);
switch (key[1]) {
case KEY_UP:
ndirect = 0;
if (direct != ndirect) {
mSprite.setFrameSequence(FRAME_SEQUENCE[0]);// 将精灵序列加到精灵属性中
direct = ndirect;
}
mSprite.move(0, -4);
break;
case KEY_DOWN:
ndirect = 1;
if (direct != ndirect) {
mSprite.setFrameSequence(FRAME_SEQUENCE[1]);// 将精灵序列加到精灵属性中
direct = ndirect;
}
mSprite.move(0, 4);
break;
case KEY_LEFT:
ndirect = 2;
if (direct != ndirect) {
mSprite.setFrameSequence(FRAME_SEQUENCE[2]);// 将精灵序列加到精灵属性中
direct = ndirect;
}
mSprite.move(-4, 0);
break;
case KEY_RIGHT:
ndirect = 3;
if (direct != ndirect) {
mSprite.setFrameSequence(FRAME_SEQUENCE[3]);// 将精灵序列加到精灵属性中
direct = ndirect;
}
mSprite.move(4, 0);
break;
}
}
protected void paint(Graphics g) {
g.setColor(0);
g.fillRect(0, 0, getWidth(), getHeight());
mSprite.paint(g);// 绘制精灵
}
public void startThread() {
if (thread == null)
thread = new Thread(this);
thread.start();
}
public void run() {
int debug = 0;
// System.out.println("debug:" + debug++);
try {
while (true) {
long stare = System.currentTimeMillis();
// System.out.println("debug:" + debug++);
input();
// System.out.println("debug:" + debug++);
update();
// System.out.println("debug:" + debug++);
repaint();
serviceRepaints();
long end = System.currentTimeMillis() - stare;
if (end < 150)
Thread.sleep(150 - end);
}
// spriteMidlet.quitApp();
} catch (Exception e) {
System.err.println("run error:" + e + " debug:" + debug);
}
}
/***************************************************************************
* 重载的FullCanvas的按键触发的方法
*
* @param keyCode
* int 系统传入的按键代码
**************************************************************************/
protected void keyPressed(int keyCode) {
key[2] = key[3] = keyCode;
}
/***************************************************************************
* 重载的FullCanvas的重复一个按键触发的方法
*
* @param keyCode
* 系统传入的按键代码
**************************************************************************/
protected void keyRepeated(int keyCode) {
}
/***************************************************************************
* 重载的FullCanvas的释放一个按键触发的方法
*
* @param keyCode
* 系统传入的按键代码
**************************************************************************/
public void keyReleased(int keyCode) {
key[3] = 0;
}
}