j2me中地图怎么实现

iwillfling 2006-04-18 09:26:32
游戏中的地图比屏幕要大.听说要用数组实现,怎么实现数组和图片的对应,当人物移动到边上时,地图也要跟着移动.
...全文
835 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wtobias 2006-06-08
  • 打赏
  • 举报
回复
你可以用编辑器自己编辑
也可以自己拼数组
xiyuanna 2006-06-01
  • 打赏
  • 举报
回复
飞天鼠真是谢谢了,一直都没弄明白是怎么回事,被你一说懂了不少
ForestOcean 2006-05-14
  • 打赏
  • 举报
回复
标记。。。学习中。。。
shiyonggang 2006-05-14
  • 打赏
  • 举报
回复
http://bbs.j2me.com.cn/这里已经提供了地图编辑器工具,而且也有专门讨论区,交流地图编辑器的用法
egxsguo 2006-05-12
  • 打赏
  • 举报
回复
难就难在速度太慢,16*16的Tile,要用64块才能铺满128*128的一屏,也就是说一帧要setClip64次,drawImage64次,呵呵,要是滚动起来肯定有的受
shiyonggang 2006-05-12
  • 打赏
  • 举报
回复
自己写地图编辑器啊,难道你想怎样
delphiseabird 2006-05-12
  • 打赏
  • 举报
回复
地图编辑器不一样,算法也不一样。总得来说是让同时再入的地图越少越好。

--------------------------------
www.coderpub.com coderpub技术论坛
iwillfling 2006-05-04
  • 打赏
  • 举报
回复
你用的是什么地图编辑器?
shiyonggang 2006-05-04
  • 打赏
  • 举报
回复
使用地图编辑器生成地图数组,然后根据数组的数据绘制地图,没啥难得啊
jobenc 2006-04-27
  • 打赏
  • 举报
回复
我用的是1.0,实在是不好写啊
贝壳鱼 2006-04-26
  • 打赏
  • 举报
回复
好好想想
MrYoucheng 2006-04-26
  • 打赏
  • 举报
回复
1 地图多大你就搞个w×h的数组
2 算出你地图宽度和高度的一半(是tile啊)
3 人物所在位置左边上边各减上面算出的一半,下面右边各加一半就得到要显示的区域
4 当然如果算出来的区域值超界了调整一下就可以了
brey 2006-04-24
  • 打赏
  • 举报
回复
midp2.0可以用TiledLayer类
midp1.0要自己写
sy7907 2006-04-24
  • 打赏
  • 举报
回复
在Act游戏中的地图是根据主角的移动而反方向移动的,其实主角始终都处于当前的屏幕内,只是作为背景的地图反方向的作了移动,从视觉上来看主角向前移动了。
一般都将组成地图背景的各个小方块图片的索引放在一个二维数组中,如果数据过大可以考虑将地图索引数据保存在文件中,游戏初始化的时候再读入地图数据。地图数据文件以后缀名为.map存储。
具体的方法如下:
注:本文的例子是在NOKIA的平台下面的代码,所以屏幕的大小为128*128,整张地图是由16*37个小方格组成
//导入地图数据
public void levelMapGenerate() {
int x, y;
byte data[]=new byte[16];
try {
DataInputStream dis = new DataInputStream(getClass().
getResourceAsStream(
"/maps/gamemap.map"));
//dis.read(data);
x = 16;
y = 37;
System.gc();
this.mapArray = null;
this.mapArray = new byte[y][x];
for (int i = 0; i < y; i++) {
dis.read(); //
dis.read();//读取换行符
dis.read(data1);
for (int j = 0; j < x; j++) {
this.mapArray[i][j] = (byte) (data[j] - 48);//将ASCII码值转换位数据的实际值
System.out.print("mapArray["+i);
System.out.print("]["+j);
System.out.println("]=="+mapArray[i][j]);
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}
System.gc();
}
地图数据是以字符串方式直接存到了.map文件中,没有进行任何编码的处理。可以直接用文本编辑工具打开进行修改。这里有两点需要注意,第一,读入的数据是ASCII码值,所以读进来以后需要进行编码的转换,即减去48。第二,地图数据是按行列进行排列的,在每一行的末尾都有换行符,所以在读取数据的时候也将每行的换行符读了进来。这也是为什么有两个read()的原因。
另外还有另外一种方式举行存储地图数据,就是将地图数据转换为二进制文件,然后读取这个二进制文件,这样做的好处在于可以减小地图数据的大小,同时也在一定程度上对数据进行了加密。具体的实现方法见其他例子。
当然地图数据也可以直接在代码中写出,不需要从文件中读取。


回到主提,将读入的数据放在二维数组mapArray后,就是如何处理主角的移动了。
在定义Map这个类的时候,定义两个成员变量x,y分别表示当前的屏幕在整张地图中的坐标(左上角)
static Image[] mapImage = new Image[6]; //组成地图的小方格图片
static byte[][] mapArray; //地图数组
static int x, y, startX, startY; //x,y是当前屏幕的坐标

public void Map(){

x = 0;
y = 0;
startX = x;
startY = y;
try {
for (int i = 0; i < mapImage.length; i++) {
mapImage[i] = Image.createImage("/images/" + "mapt" + i + ".png");
}
}
catch (Exception ex) {
ex.printStackTrace();
}
levelMapGenerate();

}

在进行画图的时候需要判断当前屏幕坐标在这个地图中的位置,即处于二位数组的位置。
以下是Map类的paint函数:
public void paint(Graphics g) {
int starti, startj;
starti = (x - startX) / 32;
startj = (y - startY) / 16;
for (int i = starti; i < starti + 5 && i < this.mapArray.length; i++) {
for (int j = startj; j < startj + 9 && j < this.mapArray[0].length; j++) {
g.drawImage(mapImage[this.mapArray[i][j] % 6],
i * 32-x,
j * 16-y, Graphics.LEFT | Graphics.TOP);
}
}
}

每次只画出128*128大小的屏幕,即4*8个32*16大小的方格。

整个Map类的设计就写好了,下面就是如何去响应主角的移动了,这个例子中主角是可以四个方向移动的。
public void MoveX(int dx) {
if (dx != 0) {
if ( (map.x + dx <= 37*32-128 ) && (map.x + dx >=0)) {
ChangeMapXY(dx, 0);
}
}
}

public void MoveY(int dy) {
if (dy != 0) {
if ( (map.y + dy < 128) && (map.y + dy >= 0)) {
ChangeMapXY(0, dy);
}
}
}

主要的难点是在边界时进行越界的判断,根据情况的不同,条件也会不同。然后再Keypress()和KeyReleased()里面根据实际的情况改变dx,dy的值就可以实现主角在地图中的移动问题了。

我还没有试过,你看看吧,我不知道上边写的对不!

sayigood 2006-04-23
  • 打赏
  • 举报
回复
是的,你查一些相关的书,王森的不错!
网络咖啡 2006-04-19
  • 打赏
  • 举报
回复
import java.io.IOException; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; import javax.microedition.lcdui.game.GameCanvas; import javax.microedition.lcdui.game.LayerManager; import javax.microedition.lcdui.game.Sprite; import javax.microedition.lcdui.game.TiledLayer; public class WalkGameCanvas_18 extends GameCanvas implements Runnable{ private Graphics g; private Image i1,i2; private Sprite splayer; private LayerManager lm; private int [][]map; private int []right=new int[]{3,4,5}; private int []left=new int[]{9,10,11}; private int []up=new int[]{0,1,2}; private int []down=new int[]{6,7,8}; private TiledLayer t; private int viewX,y,x,viewY; private int keyState; private boolean rightFlag; private boolean leftFlag; private boolean upFlag; private boolean downFlag; WalkGameCanvas_18(){ super(true); g=this.getGraphics(); try{ i1=Image.createImage("/item01.png"); i2=Image.createImage("/walk.png"); }catch(IOException e){ e.printStackTrace(); } t=new TiledLayer(20,18,i1,16,16); map=new int[][]{ { 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12 }, { 16, 22, 16, 17, 1, 2, 16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 16, 22, 16, 17 }, { 11, 12, 11, 12, 6, 7, 11, 12, 11, 12, 3, 4, 5, 12, 11, 12, 11, 12, 11, 12 }, { 16, 22, 16, 17, 16, 17, 16, 17, 16, 17, 8, 9, 10, 17, 16, 17, 16, 22, 16, 17 }, { 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12 }, { 16, 22, 16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 16, 22, 16, 17 }, { 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12 }, { 16, 22, 16, 17, 16, 17, 16, 17, 16, 17, 13, 14, 15, 17, 16, 17, 16, 22, 16, 17 }, { 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 18, 19, 20, 12, 11, 12, 11, 12, 11, 12 }, { 16, 22, 16, 17, 21, 21, 21, 22, 22, 21, 21, 17, 24, 25, 16, 17, 16, 22, 16, 17 }, { 11, 12, 11, 12, 21, 21, 23, 21, 21, 21, 21, 12, 11, 12, 11, 12, 11, 12, 11, 12 }, { 16, 22, 16, 17, 26, 27, 28, 29, 30, 17, 16, 17, 16, 17, 16, 17, 16, 22, 16, 17 }, { 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12 }, { 16, 22, 16, 17, 16, 17, 16, 17, 16, 17, 33, 34, 16, 17, 16, 17, 16, 22, 16, 17 }, { 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 35, 36, 11, 12, 11, 12, 11, 12, 11, 12 }, { 16, 22, 16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 16, 22, 16, 17 }, { 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12 }, { 16, 22, 16, 17, 16, 17, 16, 31, 32, 17, 16, 17, 16, 17, 16, 17, 16, 22, 16, 17 } }; for(int i=0;i<18;i++) for(int j=0;j<20;j++) t.setCell(j, i, map[i][j]); splayer=new Sprite(i2,i2.getWidth()/12,i2.getHeight()); lm=new LayerManager(); lm.append(splayer); lm.append(t); new Thread(this).start(); }

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧