起初看到這個,你的想法是什麼,這小子想干嘛呢???
這個方法是在一個多月前做多線程游戲的時候想到的,最初是中南的一位朋友提出來的。最近的博客老是在“炒剩飯”,一些新學的東西也總是來不及作總結,不過覺得這個想法確實不錯,所以也才拿出來再與大家探討一下,說不定還有更好的方法。
我們所玩的一些場景不動2D的游戲,往往需要構建一些地圖,如泡泡堂,坦克大戰等等。
而在地圖構建的時候,我們往往采用的是用一個數組將所需的地圖保存起來,但是做到後來,需要的地圖多了,保存的效率往往也就偏低了,而且還會耗費大多的代碼去填數組。
在一個記事本中把你想要做的地圖保存起來,看上去也更加直觀,簡潔。使用IO流進行字節讀取是出錯率相對較低的,所以我們的地圖中理論上可以存在256種元素(一個byte占8位)。當然,我們或許不需要這麼多,a-z加上1到9就完全可以滿足我們的日常需求了。
最開始的時候,有人問到,既然是OOP,為什麼不用對象來保存我們的地圖元素?原因很簡單,我們操作byte數據的效率要高於操作對象本身。
好的,閒話不多說,方法如下:
首先,我們需要一個ArrayList來保存數據,有什麼用呢?繼續看你就知道了
//創建地圖數組來保存數據
ArrayList<Byte> MapList=new ArrayList<Byte>();
查看本欄目
Java代碼
/** * 將記事本中的數據讀入到數組當中 * @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,起初我也是覺得納悶,任何方法當然都要測試一下,自己做個記事本地圖試一下吧。