前言:哎,我真是成了夜猫子了,现在每天都凌晨5点左右睡觉,疯了快都。最近发现自己做东西都是碰到了不会的时候才去看,呃,比较托慢速度,而且刚领悟的东西也不一定是对的,消化了还要看吸收啊!而好像关于SWING的东西最近几乎没讲到了,都在讲类似算法的东西了,原谅偶吧,偶也是变学边做的,最多比人家多了点点的想法而已。昨天白天一个人上网的时候感觉自己好空虚,即使在做这个地图编辑器也一样,人是怕寂寞的动物啊,所以也没怎么大弄,今天又添油加醋得弄了点新的想法,并实现了一下,虽然做法很愚钝,不过不失为一个能用的实现,就是不是很实用啊,还是把地图的编写放到人身上,不聪明。不过也有另外的好消息!嘿嘿,偶弄到了新的地图显示,先给大家看看显示效果吧,啊哈哈。
嘿嘿,这个就是我新引进的,比起上次的那个是有过之而不不及吧,就不知道放到我的手机上会不会太大,是在不行就改成8×8大小的,16的估计会太大,谁让偶穷,手机是128×128的呢。(哎,也真是的,都快大学毕业了,还这里玩这些东东,应该想一想以后的工作才是啊,说到底,这个还不是自己在玩!)
新的图元比较详细,一个地形起码有9个好像,因为有考虑到边缘的显示效果,比我画的强多了,呵呵。
我有了新的想法,就是本来是把地图全都添加在源文件内的,如果要添加新的地图那么就一定要改源文件并且重新编译,这样就是说没有源文件就不能添加新的元素进去,这就不好玩了,而且重新编译也好浪费时间,还不如做了灵活点,直接把控制信息写到文件中去,然后让程序读入控制文件来决定载入的信息,这样多方便啊,于是很自然就让这个小项目又多了个读取地图资源文件的类:MapResourceFileReader。其实和以前的那个读取地图内容文件的类有点大同小异,不过区别还是有的,由于内部成员变量不同,也没办法做成继承之类的东西,也怪我做这个之前没有系统地考虑这些,本来按照软件工程的要求来做是蛮不错的,但是只有我一个人,寂寞啊,做那个又很枯燥,我又不能一下子想周全,所以就做到哪里想到哪里咯~幸亏是小程序。下面给出代码吧:
import
java.io.
*
;
import
javax.swing.ImageIcon;
import
java.util.
*
;


/** */
/**
* @author SosoAyaen
*
* 地图资源文件读入类
**/

public
class
MapResourceFileReader
...
{

private BufferedReader buffReader;
private ImageIcon[] imageIconArray;

/** *//**
* Method MapResourceFileReader
*
*
*/

public MapResourceFileReader(String resourseFileName) throws FileNotFoundException, IOException ...{
// TODO: 在这添加你的代码
buffReader = new BufferedReader( new FileReader(resourseFileName) );
String picName;
ArrayList alist = new ArrayList();

while ((picName = buffReader.readLine()) != null) ...{
System.out.println (picName);
alist.add(new ImageIcon(picName));
}
imageIconArray = new ImageIcon[alist.size()];

for (int i = 0; i<alist.size(); i++) ...{
imageIconArray[i] = (ImageIcon)alist.get(i);
}
}

/** *//**
* Method getImageIconArray
*
*
* @return
*
*/

public ImageIcon[] getImageIconArray() ...{
// TODO: 在这添加你的代码
return imageIconArray;
}


/** *//**
* Method main
*
*
* @param args
*
*/

public static void main(String[] args) ...{
// TODO: 在这添加你的代码

try ...{
new MapResourceFileReader("../mapResource/mapR.txt");
}

catch (FileNotFoundException e) ...{
e.printStackTrace();
}

catch (IOException e) ...{
e.printStackTrace();
}
}
}
哎,这里对ArrayList不是很熟悉,本来是有个toArray的方法的,可是我把它转换成ImageIcon[]后再给imageIconArray后还是报错,无语,只能下面循环了放进去,如果有好的方法不妨告诉我一下,谢谢了。下面是mapR.txt文件的内容:
..//mapResource//water//water_left.PNG
..//mapResource//water//water_middle.PNG
..//mapResource//water//water_right.PNG
..//mapResource//water//water_blue.PNG
..//mapResource//water//water_deep_normal.png
..//mapResource//mountain//oneHill.PNG
..//mapResource//grass//center.PNG
..//mapResource//grass//left_up.png
..//mapResource//grass//up.png
..//mapResource//grass//right_up.png
..//mapResource//grass//right.png
..//mapResource//grass//right_down.png
..//mapResource//grass//down.png
..//mapResource//grass//left_down.png
..//mapResource//grass//left.png
其实这里的内容是按实际情况写的,放哪里就怎么写,当然这个不是最终方案,β测试那,要写这么多还不烦死,我很懒惰的,呵呵。有好的想法也可以和我交流哟。
LandStylePic类也要修改,因为这个是会抛出异常的,所以不能再这个类里面定义final数据了,只能static的了,然后在构造函数中通过MapResourceFileReader中定义的getImageIconArray方法来获得图片资源数组。所以LandStylePic也要被实例化了,自然,那么在MapsEditorFrame要建立一个LandStylePic的对象了,所以也要小小的修改下,就给出两个文件的修改后代码吧:
LandStylePic:
/** */
/**
* 记录地图类型存储的类
*
**/
import
javax.swing.ImageIcon;
import
java.util.
*
;
import
java.io.
*
;


public
final
class
LandStylePic
...
{
// 存放地形图形的数组

/**//*public final static ImageIcon[] LANDSTYLES = {
new ImageIcon("../mapResource/water/water_left.PNG"),
new ImageIcon("../mapResource/water/water_middle.PNG"),
new ImageIcon("../mapResource/water/water_right.PNG"),
new ImageIcon("../mapResource/water/water_blue.PNG"),
new ImageIcon("../mapResource/water/water.PNG"),
new ImageIcon("../mapResource/mountain/山.PNG"),
new ImageIcon("../mapResource/grass/草.PNG"),
};*/
public static ImageIcon[] LANDSTYLES;

public LandStylePic () throws FileNotFoundException, IOException ...{
LANDSTYLES =
(new MapResourceFileReader("../mapResource/mapR.txt")).getImageIconArray();
}
// 存放地形相关信息的数据结构的数组

public final static MapsConstruction[] MAPCONS = ...{
new MapsConstruction(0, 'A', "water_left",
"水地形的左边部分,两栖物种以及飞行物种可登陆"),
new MapsConstruction(1, 'B', "water_middle",
"水地形的中间部分,两栖物种以及飞行物种可登陆"),
new MapsConstruction(2, 'C', "water_right",
"水地形的右边部分,两栖物种以及飞行物种可登陆"),
new MapsConstruction(3, 'D', "water_blue",
"水地形的反光部分,两栖物种以及飞行物种可登陆"),
new MapsConstruction(4, 'E', "water",
"水地形的反光部分,两栖物种以及飞行物种可登陆"),
new MapsConstruction(5, 'F', "土山",
"山地,只能放在草地之上飞行物种可登陆"),
new MapsConstruction(6, 'G', "草",
"草地中心,任何物种能登陆"),
new MapsConstruction(7, 'H', "leftup", ""),
new MapsConstruction(8, 'I', "up", ""),
new MapsConstruction(9, 'J', "rightup", ""),
new MapsConstruction(10, 'K', "right", ""),
new MapsConstruction(11, 'L', "rightdown", ""),
new MapsConstruction(12, 'M', "down", ""),
new MapsConstruction(13, 'N', "leftdown", ""),
new MapsConstruction(14, 'O', "left", ""),
};

/** *//**
* Method main
*
*
* @param args
*
*/

public static void main(String[] args) ...{
// TODO: 在这添加你的代码
}


/** *//**
* Method getIndex
*
*
* @param name
*
* @return
*
*/

public static int getIndex(String name) ...{
// TODO: 在这添加你的代码

for(int i = 0; i < MAPCONS.length; i++) ...{
if( name.equals( MAPCONS[i].getName() ) )

...{
return MAPCONS[i].getIndex();
}
}
return -1;
}


/** *//**
* Method getIndex
*
*
* @param mark
*
* @return
*
*/

public static int getIndex(char mark) ...{
// TODO: 在这添加你的代码

for(int i = 0; i < MAPCONS.length; i++) ...{

if ( mark == MAPCONS[i].getMarks() ) ...{
return MAPCONS[i].getIndex();
}
}
return -1;
}
}
这个是吧,其实应该把对应的那个数组也存到文件中去,这里因为只是测试下用的,所以就没动了,还很不完善那~呵呵。
MapsEditorFrame:
import
java.awt.
*
;
import
java.awt.event.
*
;
import
javax.swing.
*
;
import
java.util.
*
;
import
java.io.
*
;


/** */
/**
* Sample application using JFrame.
*
* @author SosoAyaen
* @version 1.00 06/08/10
*/

public
class
MapsEditorFrame
extends
JFrame
implements
ActionListener
...
{
// 容器组件等
private JButton jbOK = null, jbCancel = null, jbIcon = null,
jbSave = null, jbLoadMapFromFile = null;
private JPanel jpCenter = null, jpIcon = null, jpSouth = null,
jpNorth = null, jpEast = null, jpEastCo = null;
private JLabel jlMap = null, jlTitle = null, jlTips = null;
private JMenu jmenu = null;
private JMenuItem jmiExit = null;
private JMenuBar jmb = null;
private JTextField jtf = null;
private int change = 1; // 控制点击同一按钮后控制不同控件
// 临时测试用的地图文件数组
private char[] maps;
// 随机数
private Random rand = new Random();
private int WIDTH = 5, HEIGHT = 5;
private final String mapFilePath = "../mapFile/";
// private Dimension d = null;

/** *//**
* The constructor.
*/

public MapsEditorFrame (String title) throws FileNotFoundException, IOException ...{
super(title);
LandStylePic ls = new LandStylePic();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 载入地图文件

try ...{
MapFileReader mfr = new MapFileReader (mapFilePath + "map1.txt");
maps = mfr.getMapFileToString().toCharArray();
this.setMapSize (mfr.getMapX(), mfr.getMapY());
mfr.close();
}
catch (FileNotFoundException e)

...{
e.printStackTrace();
}
catch (IOException e)

...{
e.printStackTrace();
}
// d = new Dimension(11, 20);
// JMenu
JMenu jmFile = new JMenu("文件");
// 临时定义组件
JMenuItem jmiLoad = new JMenuItem("载入地图");
jmiLoad.addActionListener(this);
jmFile.add(jmiLoad);
jmiExit = new JMenuItem("退出");
jmiExit.addActionListener(this);
jmFile.add(jmiExit);
JMenu jmEdit = new JMenu("编辑");
JMenuItem jmiUndo = new JMenuItem("撤销");
jmEdit.add(jmiUndo);
// JMenuBar
jmb = new JMenuBar();
jmb.add(jmFile);
jmb.add(jmEdit);
this.setJMenuBar(jmb);
// JTextField
jtf = new JTextField(10);
jtf.setEditable(false);
// JLabel
// jlMap = new JLabel(mapsWater[0]);
jlTitle = new JLabel("SLG地图编辑器");
jlTips = new JLabel();
// JButton
jbLoadMapFromFile = new JButton("Load Maps");
jbLoadMapFromFile.addActionListener(this);
jbSave = new JButton("Save Maps");
jbSave.addActionListener(this);
jbOK = new JButton("OK");
// jbOK.setMaximumSize(new Dimension(6, 12));
jbOK.addActionListener(this);
// jbOK.setSize(d);
jbCancel = new JButton("Cancel");
jbCancel.setEnabled(false);
jbIcon = new JButton("WaterMiddle",
ls.LANDSTYLES[LandStylePic.getIndex("water_right")]);
// JPanel
jpSouth = new JPanel(new FlowLayout());
jpSouth.add(jbOK);
jpSouth.add(jbCancel);
jpNorth = new JPanel(new FlowLayout());
jpNorth.add(jlTitle);
jpEast = new JPanel(new GridLayout(0,1));
jpEastCo = new JPanel(new FlowLayout());
jpEastCo.add(jbIcon);
jpEast.add(jpEastCo);
jpEastCo = new JPanel(new FlowLayout());
jpEastCo.add(jbSave);
jpEast.add(jpEastCo);
jpEastCo = new JPanel(new FlowLayout());
jpEastCo.add(jbLoadMapFromFile);
jpEast.add(jpEastCo);
jpEastCo = new JPanel(new FlowLayout());
jpEastCo.add(jtf);
jpEast.add(jpEastCo);
jpEastCo = new JPanel(new FlowLayout());
jpEastCo.add(jlTips);
jpEast.add(jpEastCo);
jpIcon = new JPanel(new GridLayout(HEIGHT,WIDTH,0,0));

/**//*
for(int i = 0, j = 0; i<HEIGHT*WIDTH; i++)
{
j = rand.nextInt(4);
jlMap = new JLabel(LandStylePic.LANDSTYLES[j]);
jpIcon.add(jlMap);
}
//*/
// 按数组内容添加地图图片

for (int i = 0; i < HEIGHT*WIDTH; i++) ...{
jlMap = new JLabel( ls.LANDSTYLES[LandStylePic.getIndex(maps[i])] );
jpIcon.add(jlMap);
}
// 保证jpIcon内的JLabel不会因为外部窗口的拉伸而走样
jpCenter = new JPanel(new FlowLayout());
jpCenter.add(jpIcon);
// JFrame
this.setLayout(new BorderLayout());
this.setSize(500, 500);
this.setResizable(true);
this.add(BorderLayout.NORTH, jpNorth);
this.add(BorderLayout.SOUTH, jpSouth);
this.add(BorderLayout.CENTER, jpCenter);
this.add(BorderLayout.EAST, jpEast);
}

/** *//**
* Method setMapSize
*
*
* @param x
* @param y
*
*/

public void setMapSize (int x, int y) ...{
// TODO: 在这添加你的代码
this.WIDTH = x;
this.HEIGHT = y;
}

/** *//**
* Method actionPerformed
*
*
* @param e
*
*/

public void actionPerformed(ActionEvent e) ...{
// TODO: 在这添加你的代码
if (e.getActionCommand().equals("OK"))

...{
System.exit(0);
}
else if(e.getActionCommand().equals("Save Maps"))

...{
change *= -1;
if(change > 0)

...{
jtf.setText("TEST");
jlTips.setText("");
}
else

...{
jlTips.setText("Two pigs");
jtf.setText("");
}
}
else if (e.getActionCommand().equals("Load Maps") || e.getActionCommand().equals("载入地图"))

...{
System.out.println("Map loaded...");
}
else if (e.getActionCommand().equals("退出"))

...{
System.exit(0);
}
}

}
其实也真的没什么大修改,就加了个ls而已。不过还是全帖出来吧,怕说不清楚,自己看也好,呵呵。争取下次把控制地图的做好,真正实现免编译。啊~又快凌晨5点了,睡觉去咯~~
唠叨几句:为了发这几篇学习笔记我真的快被优快云的BLOG玩死了,不是发了慢就是分类上根本就没显示,还有就是发布了不能修改,看看前几篇我还没用代码优化的时候的帖子,惨不忍睹啊!编辑不能,我能有什么办法……这文章是昨天发的,可是到了今天我还是没有看到发布到外面去,没办法了,重发……快顶不住了!有时候浩浩汤汤写了好多,可就是被OB在一瞬间了……此之痛,无与伦比;特别是我等凌晨活动的人来说,一个晚上白忙活真够残忍的…… 这篇文章就有这么难发么?4遍了!