前言:不好意思啊,昨天去柯桥了趟,基本没怎么碰电脑, 不过脑子里还是想这点这个地图编辑器的问题的,开始一直在想怎么解决外部文件读入导致换行符的混入,后来发现BufferedReader类的readLine方法,爽,直接过滤,省了我不少的麻烦,嘿嘿。还有就是我对地图文件做了稍稍的改动,头部加上了两个表示地图大小的标注,希望以后能用到。好,废话少说,看具体的吧~我截图都截好了那~ 都已经弄了这么晚了,看来又要明天凌晨才能发稿了……厄,这个,不是我臭屁,但是想来想去还是说一下,版权所有,如要转载清注明出处http://www.blog.net/Sozell和作者:SosoAyaen。小弟我写点东西不容易,谢谢。
先说下关于上次做过的地图的载入问题。我是通过一个设置Layout布局来决定图片的布局规格的,而当要载入地图时来推算到底是几行几列的我觉得没有必要(不是说
10
10
EEEEEEEEEE
EGGGGGGGGE
EGFGFGFGFE
EEEEGGFGGE
EEEEEFFGEE
EEEEGGFEEE
EEEGGGGGGE
EEEEEEEEEE
EEGGGGGGGE
EEEEEEEEEE
开头就是宽和高的参数了。既然是专门用来读取地图文件的,所以我就直接给它做了个类:MapFileReader。下面给出这个类的代码:
importjava.io.*;
publicclassMapFileReader...{
privateBufferedReader buffReader;
privateintmapX, mapY;
privateString mapStr;
/** *//** * Method MapFileReader
*
*@paramfileName
*/
publicMapFileReader(String fileName)throwsFileNotFoundException, IOException...{
//TODO: 在这添加你的代码buffReader=newBufferedReader (newFileReader(fileName) );
mapX=Integer.parseInt ( buffReader.readLine() );
mapY=Integer.parseInt ( buffReader.readLine() );
String str;
StringBuffer strBuff=newStringBuffer();
while((str=buffReader.readLine())!=null)...{
strBuff.append(str);
} mapStr=strBuff.toString();
}
/** *//** * Method close
* close the BufferedReader
*
*/
publicvoidclose()throwsIOException...{
//TODO: 在这添加你的代码buffReader.close();
}
/** *//** * Method getMapX
* 得到地图的宽
*
*
*@return *
*/
publicintgetMapX()...{
//TODO: 在这添加你的代码returnthis.mapX;
}
/** *//** * Method getMapY
* 得到地图的高
*
*@return *
*/
publicintgetMapY()...{
//TODO: 在这添加你的代码returnthis.mapY;
}
/** *//** * Method getMapFileToString
*
*
*@return *
*/
publicString getMapFileToString()...{
//TODO: 在这添加你的代码returnthis.mapStr;
}
/** *//** * Method main
*
*
*@paramargs
*
*/
publicstaticvoidmain(String[] args)...{
//TODO: 在这添加你的代码
try...{
char[] buf;
MapFileReader mfr=newMapFileReader("../mapFile/map1.txt");
buf=mfr.getMapFileToString().toCharArray();
System.out.println (mfr.getMapFileToString());
System.out.println (buf);
for(inti=0; i<10*10; i++)...{
System.out.printf("%d", LandStylePic.getIndex(buf[i]));
} System.out.println();
}
catch(FileNotFoundException e)...{
e.printStackTrace();
}
catch(IOException e)...{
e.printStackTrace();
} }
}
因为每个类我都单独做了测试,所以都有一个main(String[] args)主函数。这个不会变成方法带入类中,所以其他类中用到此类也不会有其中的代码执行。注意:FileReader是现在用到的读入字符的类(具体自己看JDK,里面有详细说明),而它是没有readLine方法的,而BufferedReader是带缓冲的Reader,可以把FileReader作为BufferedReder构造的参数,就像套水管一样,套上BufferedReader出来的就能用BufferedReader的方法了。至于String和StringBuffer的区别不在本文讨论范围内,记住String是不能改变而StringBuffer是可变的就行了,为了不频繁申请内存资源,所以用StringBuffer比较好。readLine读进来的是字符串(String),开始的两行是要存到Int变量中去的,所以要调用Inetger.parseInt(String)方法把String转化为Int,而Integer是Int的类表示方法(理解性说法),它有很多方法,而Int之类的类型如Float、Double、char不是类,所以他们声明的变量从严格的意义上来说不是对象,所以有了对应的wrap类来提供对应的方法。
这个文件要加到前面的工程中去,或者放到前面那些程序的同文件夹下,然后再编译执行这个文件你就会看到一个比较有趣的画面,它对地图文件做了内部翻译,结果是内部索引号,说白了就是变成数字序列了。这是给“翻译图片”程序用的,呵呵。给个执行结果:
那么前面的MapsEditorFrame.java也要做相应的改动了。其实也就是把maps数组不手写,而直接把MapFileReader的对象的getMapFileToSting()的地图内容字符串给它就行了,由于返回的是个String类型,而String本身就带一个toCharArray()的方法,所以两次调用就直接把地图内容给放到maps的char类型数组里面了,而其他程序几乎不需要大的改动。(改动还是有的,比如添加了个设置地图大小的方法setMapSize(int x, int y))
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.util.*;
importjava.io.*;
/** *//** * Sample application using JFrame.
*
*@authorSosoAyaen
*@version1.00 06/08/10
*/
publicclassMapsEditorFrameextendsJFrameimplementsActionListener...{
//容器组件等privateJButton jbOK=null, jbCancel=null, jbIcon=null,
jbSave=null, jbLoadMapFromFile=null;
privateJPanel jpCenter=null, jpIcon=null, jpSouth=null,
jpNorth=null, jpEast=null, jpEastCo=null;
privateJLabel jlMap=null, jlTitle=null, jlTips=null;
privateJMenu jmenu=null;
privateJMenuItem jmiExit=null;
privateJMenuBar jmb=null;
privateJTextField jtf=null;
privateintchange=1;//控制点击同一按钮后控制不同控件
//临时测试用的地图文件数组privatechar[] maps;
//随机数privateRandom rand=newRandom();
privateintWIDTH=5, HEIGHT=5;
privatefinalString mapFilePath="../mapFile/";
//private Dimension d = null;
/** *//** * The constructor.
*/
publicMapsEditorFrame (String title)...{
super(title);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//载入地图文件
try...{
MapFileReader mfr=newMapFileReader (mapFilePath+"map1.txt");
maps=mfr.getMapFileToString().toCharArray();