社区
J2ME
帖子详情
j2me中地图怎么实现
iwillfling
2006-04-18 09:26:32
游戏中的地图比屏幕要大.听说要用数组实现,怎么实现数组和图片的对应,当人物移动到边上时,地图也要跟着移动.
...全文
835
16
打赏
收藏
j2me中地图怎么实现
游戏中的地图比屏幕要大.听说要用数组实现,怎么实现数组和图片的对应,当人物移动到边上时,地图也要跟着移动.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
恩
J2ME
中
实现
人走
地图
走功能
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(); }
J2ME
_Map_Test.rar_
j2me
_
地图
_
地图
代码
J2ME
实现
地图
滚动,简单的
地图
滚动实例,包括源代码和
地图
文件
j2me
编程Google
地图
实现
经代码
教你如何用
j2me
开发Google
地图
,
实现
手机GPS导航功能
J2ME
地图
编辑器mappy
可编辑
J2ME
游戏背景
地图
,简单
实现
地图
设计和描绘。
基于
J2ME
_MobileSVG的校园
地图
设计与
实现
本文对手机提供
地图
的有关服务方式进行了分析, 并采用
J2ME
手机上网的方式获取
地图
, 利用Mobile SVG 对
地图
数据进行组织和编码, 在此基础上设计了基
J2ME
/ SVG 的手机校园
地图
服务并对其关键技术进行讨论。
J2ME
13,100
社区成员
26,495
社区内容
发帖
与我相关
我的任务
J2ME
Java J2ME
复制链接
扫一扫
分享
社区描述
Java J2ME
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章