鉴于前一周学习javaME技术,还是超有感想的,感觉到在javaME中的很多思维和javaSE中的差不多,我按照起初学习的javaSE的方法一步步学习javaME,因为javaME主要是做手机的移动开发,这里面就不对javaME环境配置介绍了,因为网上有很全面的的介绍。对于j2ME我们接触最多是按钮(Command)所以我也是从这开始学习的,再学习CommandListener、LIst、textbox还有表单元。在API工具中我也学习了线程,这里面的线程和J2SE中的差不多,只是调用方式不同而已,不过都是extends Thread,但是在j2ME中药implements Runnable而已。还是比较容易些。最近学习到了Canvas绘图。就制作了一个拼图游戏。
一、拼图前思考
1、首先是拼图是一幅整体图片,但是我们拼图时是不同图块一个个拼接起来的,我们要怎么来出来呢?是用多个小图片拼接起来还是用一幅大图呢?
2、手机上的上下左右该怎么控制图片间的调用?
3、各个小图片怎么打乱?
4、怎么判断最终结果?
二、拼图过程
带着这些问题开始寻找答案,一步步实现。
针对问题1:
学习了Canvas,就可以重新绘制图形,如果界面引入很多张小图操作起来也非常麻烦而且需要的程序代码页需要很多,我就将多幅图片封装成为Image然后进行平均切割,然后通过数组进行存储图片的,把图片放到了数组中通过数组就可以直接调用
int[][] map = {{00,01,02,03},{10,11,12,13}, {20,21,22,23},{30,31,32,33}};
这个也为以后的打乱图片提供的帮助。在接下来就是图片的切割与图片有规律的存放到数组中,我这里面采用的是4*4的图片拼图,所以高度与宽度都采用原图形的四分之一。然后再确定坐标,合理的不重叠的叠放图片。
protected void paint(Graphics g) { gra = g; g.setColor(255, 255, 255); g.fillRect(0, 0, this.getWidth(), this.getHeight()); for(int x =0;x<4;x++){ for(int y=0 ; y<4;y++){ if(map[x][y]!=33){ //获取编号的第一位数 int xSegment = map[x][y]/10; //获取编号的第2位数 int ySegment = map[x][y]%10; //画到界面左上角 g.drawRegion(img, xSegment*edge, ySegment*edge, edge, edge, Sprite.TRANS_NONE,x*edge, y*edge,Graphics.LEFT|Graphics.TOP); } } } }
运用上诉代码进行图片的切割。
针对问题2
键盘的控制就是如何来控制哪个方向的图像移动到空白处,然后在边界处不让图片移动。所以就按照图像的布局进行安排调用。调用了SWITCH来进行方向键的选择判断。
//键盘按钮,用来移动 protected void keyPressed(int keyCode){ int action = this.getGameAction(keyCode); int xOf = -1; int yOf = -1; for(int x=0;x<4;x++){ for(int y =0;y<4;y++){ if(map[x][y]==33){ xOf = x; yOf = y; break; } } } switch(action){ case GameCanvas.UP: if(yOf!=3){ this.swap(xOf, yOf, xOf, yOf3+1); } break; case GameCanvas.DOWN: if(xOf!=0){ this.swap(xOf, yOf, xOf, yOf-1); } break; case GameCanvas.LEFT: if(xOf!=3){ this.swap(xOf, yOf, xOf+1, yOf); } break; case GameCanvas.RIGHT: if(xOf!=0){ this.swap(xOf, yOf, xOf-1, yOf); } repaint(); } }
针对问题3
之前已经将图片存放到数组中了,所以我们只需要对数组进行改变,但是由于是随机打乱我们就必须用到Random函数,交换足够的个数。我这里就运用到了for循环。
void initMap(){ Random rnd = new Random(); int temp,x1,x2,y1,y2; //将地图数组打乱 for(int i=0;i<100;i++){ x1 = rnd.nextInt(4); x2 = rnd.nextInt(4); y1 = rnd.nextInt(4); y2 = rnd.nextInt(4); temp = map[x1][y1]; map[x1][y1] = map[x2][y2]; map[x2][y2] = temp; } this.repaint(); }
针对问题4
想法是就是正常遍历数组的顺序,如果顺序不发生变化就拼接成功。按照常理也是这样的,但是功能还没有,总是报错还在调试。
三、拼图现结果
下面是实现的图片打乱:
这是实现基本的移动功能:
四、工程待续
上面还有很多要完善,首先实现一个拼图成功的判断,然后增添一个选项譬如可以实现4*4样式和5*5样式等,添加一个时间计时功能,判定谁的时间少。时间仓促完成效果还不是特理想了哦。。