//利用二维数组实现人物走动的经典案例分析 <二>
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,我会尽快给您答复.
以上内容是本人自己撰写,不能随意转载,如经发现要负责法律责任。
分享到:
相关推荐
本篇文章将深入探讨一个基于J2ME的二维数组实现的俄罗斯方块项目,让我们一起走进这个经典游戏的编程世界。 俄罗斯方块,作为一款流传甚广的游戏,其核心在于各种形状的方块不断下落并排列。在J2ME中,我们通常使用...
在这个J2ME俄罗斯方块游戏中,游戏板被表示为二维数组。每个元素代表游戏板上的一个单元格,可以为空或填充有方块的一部分。当新方块生成时,它们在数组中以特定形状存储,随着游戏进行,数组中的数据会更新以反映...
以下将详细探讨在J2ME平台上实现的四个经典项目:贪吃蛇、俄罗斯方块、魔方和连连看。 1. **贪吃蛇** 贪吃蛇是一款深受用户喜爱的休闲游戏,玩家通过控制蛇的移动来吃食物,每次吃掉食物后,蛇的身体会变长。在...
分享:J2ME游戏代码 分享:J2ME游戏代码 分享:J2ME游戏代码分享:J2ME游戏代码 分享:J2ME游戏代码 分享:J2ME游戏代码分享:J2ME游戏代码 分享:J2ME游戏代码 分享:J2ME游戏代码分享:J2ME游戏代码 分享:J2ME...
这可能涉及到二维数组或者链表数据结构来存储游戏状态,以及复杂的匹配算法来检测可消除的对。 3. **动画效果**:消除图片时,为了提升用户体验,通常会添加动画效果,比如淡出、缩放或滑动消失。这些效果可能通过...
总的来说,“J2ME&Gaming中文版”是一本引导初学者进入J2ME游戏开发领域的教程,它将帮助你理解如何利用Java语言在移动平台上创建互动性强、趣味性高的游戏。通过深入学习和实践,你可以掌握到构建移动游戏所需的...
通过上下左右键控制任务走动,可以用于迷宫等游戏……
在"J2ME游戏开发中的地图设计与绘制.txt"文件中,可能详细讲解了如何规划地图结构,如何使用二维数组存储地图数据,以及如何利用J2ME的图形API高效地渲染地图。同时,文件可能还讨论了如何实现动态加载和滚动地图,...
开发者可以从中学习到如何使用二维数组来表示游戏地图,以及实现玩家操作的逻辑判断。 4. **手机版数独小游戏J2ME源码**:数独游戏在任何平台上都有广泛的受众。此源码可以帮助理解如何在J2ME上实现算法,生成和...
开发者可能使用二维数组或者更复杂的结构来存储地图信息,然后在Canvas上绘制。J2ME提供了低级别的Graphics类,用于进行像素级的绘图操作,包括画线、填充、画图等。同时,了解如何优化绘制性能以适应移动设备的限制...
《J2ME手机游戏案例精编电子教程》是一份深入探讨Java 2 Micro Edition (J2ME)在手机游戏开发中的应用的宝贵资源。J2ME是Java平台的一个子集,专为嵌入式设备,如早期的智能手机和平板电脑设计,它提供了开发移动...
**J2ME经典小游戏** Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备,特别是早期的智能手机。J2ME为开发者提供了在小型设备上创建应用程序和游戏的框架。这个压缩包中的"J2ME...
J2ME手机游戏案例精编电子教程
《J2ME嵌入式开发案例精解》是一本专注于J2ME(Java 2 Micro Edition)技术在嵌入式领域的应用书籍。J2ME是Java平台的一个子集,主要用于移动设备、消费电器和其他资源有限的计算设备。本书提供的源码.zip文件包含了...
在J2ME领域,经典游戏之一就是"坦克大战"。这款游戏以其简单的操作、策略性的战斗和多样的关卡设计深受玩家喜爱。"坦克大战"的标签暗示了我们将在讨论的压缩包文件中找到一个基于J2ME实现的此类游戏。 在J2ME平台上...
4. **数据结构**:为了存储棋盘状态,开发者可能使用二维数组或者自定义的数据结构来表示棋盘,同时还需要跟踪每个棋子的位置。 5. **优化与性能**:考虑到J2ME运行在资源有限的设备上,代码可能进行了优化以降低...
在Android开发中,Matrix类是用于处理二维图形变换的核心工具,它可以执行平移、旋转、缩放和倾斜等操作。这篇博文"利用Android的Matrix类实现J2ME的drawRegion的镜像方法"探讨了如何在Android环境中复现J2ME的`...
J2ME游戏编程:TP319:G899 W511.iso 随书光盘,欢迎大家下载 大家共享^A^
### J2ME 字符型转化成字节数组 #### 知识点一:J2ME简介 J2ME(Java 2 Platform, Micro Edition)是Sun Microsystems为嵌入式和移动设备设计的一种Java平台。它包括了一套适用于资源受限设备(如手机、PDA和个人...