//利用二维数组实现人物走动的经典案例分析 <二> package com.canvas.image03; import java.io.IOException; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; public class ExCanvas extends Canvas { public Image imPlayer;// 定义人物图片 /* * 根据人物图片定义一个二维数组(4行4列) 第一列代表下,第二列代表左,第一列代表右,第一列代表上 */ public int dirPlayer[][] = { { 0, 1, 2, 3 }, // 下 { 4, 5, 6, 7 }, // 左 { 8, 9, 10, 11 }, // 右 { 12, 13, 14, 15 } // 上 }; // 根据数组定义人物的方向 public static final int DIR_DOWN = 0; // 下 public static final int DIR_LEFT = 1; // 左 public static final int DIR_RIGHT = 2; // 右 public static final int DIR_UP = 3; // 上 public static final int DIR_STOP = -1; // 初始化人物的方向值 public int dir = DIR_STOP; //人物停止的中间变量值 public int dirtemp=DIR_STOP; // 初始化人物的当前帧 public int nowPlayer = 0; // 初始化人物坐标 public int px = 80, py = 80; // 内部线程类控制人物的移动的速度及人物帧的变化 class MyThread extends Thread { public void run() { while (true) { if (dir >= 0 && dir <= 3) { // 当人物走动时 当前帧递增 nowPlayer++; if (nowPlayer >= 3) { // 对于人物方向的动作最大帧是3 nowPlayer = 0; } } switch (dir) { case DIR_UP: py -= 8; if (py <= 0) { py = getHeight(); } break; case DIR_DOWN: py += 8; if (py >= getHeight()) { py = 0; } break; case DIR_LEFT: px -= 8; if (px <= 0) { px = getWidth(); } break; case DIR_RIGHT: px += 8; if (px >= getWidth()) { px = 0; } break; default: break; } try { Thread.sleep(200); repaint(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } //本人自己撰写,不能随意转载,如经发现要负责法律责任。 public MyThread myt; // 定义线程对象 public ExCanvas() { myt = new MyThread();// 初始化线程对象 // 加载图片 try { imPlayer = Image.createImage("/Player.png"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } myt.start();// 启动线程 } protected void paint(Graphics arg0) { arg0.setColor(0X7f7f7f);// 定义背景颜色 arg0.fillRect(0, 0, this.getWidth(), this.getHeight());// 矩形填充 arg0.setClip(px, py, 32, 48);//剪裁区域 // System.out.println(dir+"========================"); // System.out.println(dirtemp+"============="+nowPlayer); int frame=0; if (dir == DIR_STOP) { if(dirtemp==-1){ //首次画的的人物方向为下 arg0.drawImage(imPlayer, px, py, Graphics.LEFT | Graphics.TOP); }else{ //当人物停止的时候 把人物停止到该方向的第一帧 frame = this.dirPlayer[dirtemp][nowPlayer]; // 等到人物当前帧的值 arg0.drawImage(imPlayer, px - frame % 4 * 32, py - frame / 4 * 48, Graphics.LEFT | Graphics.TOP); } } else { //当人物走动的时候 根据当前帧的变化及人物移动的速度改变人物坐标值 frame = this.dirPlayer[dir][nowPlayer]; // 等到人物当前帧的值 arg0.drawImage(imPlayer, px - frame % 4 * 32, py - frame / 4 * 48, Graphics.LEFT | Graphics.TOP); } arg0.setClip(0, 0, this.getWidth(), this.getHeight());// 重新填充 } public void keyPressed(int keyCode) { //按键处理改变人物的方向 System.out.println(keyCode); if (keyCode == 50 || keyCode == -1) { // 上 dir = DIR_UP; } if (keyCode == 56 || keyCode == -2) { // 下 dir = DIR_DOWN; } if (keyCode == 52 || keyCode == -3) { // 左 dir = DIR_LEFT; } if (keyCode == 54 || keyCode == -4) { // 右 dir = DIR_RIGHT; } if(keyCode==53 || keyCode==-5){ //人物停止 dirtemp=dir; //把人物当前方向值保留 dir=DIR_STOP; nowPlayer=0; //定位到人物在该方向的第一帧 } } public void keyReleased(int keyCode) { } protected void keyRepeated(int keyCode) { // TODO Auto-generated method stub super.keyRepeated(keyCode); } } //本人自己撰写,不能随意转载,如经发现要负责法律责任。
//运行测试类 package com.canvas.image03; import javax.microedition.lcdui.Display; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class MainApp extends MIDlet{ public ExCanvas ec;//定义底层屏幕对象 public MainApp(){ ec=new ExCanvas();//初始化底层屏幕对象 } protected void startApp() throws MIDletStateChangeException { //获得屏幕对象并制定屏幕显示对象屏幕 Display.getDisplay(this).setCurrent(ec); } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } protected void pauseApp() { // TODO Auto-generated method stub } }
本案例是在一维数组的基础上实现的,也是学习j2me基础的一个积累的过程。希望同过次案例对人物走动方面的游戏,你有一个比较好的理解。 本案例也是对j2me手机感兴趣的人和想在这方面发展的人一块分享。如果您有什么疑问请发送到RedArmy.Chen@gmail.com,我会尽快给您答复. 以上内容是本人自己撰写,不能随意转载,如经发现要负责法律责任。