利用二维数组实现j2me人物走动经典案例:


//利用二维数组实现人物走动的经典案例分析 <二>
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,我会尽快给您答复.

以上内容是本人自己撰写,不能随意转载,如经发现要负责法律责任。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值