class="MsoNormal" style="text-indent: 21pt; margin: 0cm 0cm 0pt;">
?
起初看到这个,你的想法是什么,这小子想干嘛呢???
?????? 这个方法是在一个多月前做多线程游戏的时候想到的,最初是中南的一位朋友提出来的。最近的博客老是在“炒剩饭”,一些新学的东西也总是来不及作总结,不过觉得这个想法确实不错,所以也才拿出来再与大家探讨一下,说不定还有更好的方法。
?????? 我们所玩的一些场景不动2D的游戏,往往需要构建一些地图,如泡泡堂,坦克大战等等。
?
而在地图构建的时候,我们往往采用的是用一个数组将所需的地图保存起来,但是做到后来,需要的地图多了,保存的效率往往也就偏低了,而且还会耗费大多的代码去填数组。
?????? 在一个记事本中把你想要做的地图保存起来,看上去也更加直观,简洁。使用IO流进行字节读取是出错率相对较低的,所以我们的地图中理论上可以存在256种元素(一个byte占8位)。当然,我们或许不需要这么多,a-z加上1到9就完全可以满足我们的日常需求了。
?????? 最开始的时候,有人问到,既然是OOP,为什么不用对象来保存我们的地图元素?原因很简单,我们操作byte数据的效率要高于操作对象本身。
?????? 好的,闲话不多说,方法如下:
首先,我们需要一个ArrayList来保存数据,有什么用呢?继续看你就知道了
?//创建地图数组来保存数据
?ArrayList<Byte> MapList=new ArrayList<Byte>();
/** * 将记事本中的数据读入到数组当中 * @param mapName 记事本的文件名 * @return 得到的字节数组 */ public int[][] createMap(String mapName){ File file=new File(mapName); //创建地图数组 int map[][]=null; if(file.exists()){ try{ InputStream in=new FileInputStream(file); //创建与文件相同大小的字节数组 byte content[]=new byte[in.available()]; //读取字节数组 in.read(content); //将内容添加到队列当中 for(int i=0;i<content.length;i++){ MapList.add(content[i]); } //移除回车符 for(int i=0;i<MapList.size();i++){ if(MapList.get(i)==10){ MapList.remove(i); } } //移除换行符 for(int i=0;i<MapList.size();i++){ if(MapList.get(i)==13){ MapList.remove(i); } } //封装字节内容 String string=new String(content); String arr[]=string.split("\r\n"); //存入数组当中 int index=0; map=new int[arr.length][arr[0].length()]; for(int i=0;i<map.length;i++){ for(int j=0;j<map[i].length;j++{ map[i][j]=MapList.get(index)-48; index++; } } in.close(); }catch(Exception e){ e.printStackTrace(); } }else{ System.out.println("文件不存在"); } return map; }
??????? 比较关键的步骤是移除回车换行字符,这两个字符是我们看不到的,只有在打印的时候才会发现他们,
莫名其妙的多出个10跟13,起初我也是觉得纳闷,任何方法当然都要测试一下,自己做个记事本地图试一下吧。