Java开发游戏脚本第三卷
XML文件存储数据
我举个例子,我的窗口数据需要存储到文件,它的结构为:
public class Game {
// Game类的成员变量
private String Title;
private int X;
private int Y;
private int Width;
private int Height;
// get方法与set方法省略
}
需要的第三方Jar包: dom4j-2.1.1.jar
本人用的是这版本,下载其他版本也是可以用的。
将数据存到XML文件中
/**
* 本方法判断指定文件是否与指定信息类有重复的<title>属性内容,有则修改该信息,否则添加该信息
*
* @param file - 指定文件
* @param game - 指定信息类
*/
public static void ReviseGame(File file, Game game) {
try {
InputStream in = new FileInputStream(file);
SAXReader reader = new SAXReader();
Document doc = reader.read(in);
Element root = doc.getRootElement();
List<Element> elements = root.elements();
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
boolean FileIsExist = false;
for (Element element : elements) {
// 如果文件存在一样的<title>属性内容,则修改该相关的其他信息
if (game.getTitle() != null && game.getTitle().equals(element.elementText("title"))) {
element.element("x").setText(String.valueOf(game.getX()));
element.element("y").setText(String.valueOf(game.getY()));
element.element("width").setText(String.valueOf(game.getWidth()));
element.element("height").setText(String.valueOf(game.getHeight()));
FileIsExist = true;
break;
}
}
// 如果文件不存在<title>属性内容,则向文件添加该信息
if (!FileIsExist) {
// 添加DOM节点
Element element = root.addElement("game");
element.addElement("title").addText(game.getTitle());
element.addElement("x").addText(String.valueOf(game.getX()));
element.addElement("y").addText(String.valueOf(game.getY()));
element.addElement("width").addText(String.valueOf(game.getWidth()));
element.addElement("height").addText(String.valueOf(game.getHeight()));
}
// 写入文件
FileOutputStream fos = new FileOutputStream(file);
XMLWriter writer = new XMLWriter(fos, format);
writer.write(doc);
// 结束操作
writer.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
将XML文件中的数据提取出来
/**
* 本方法将文件的所有信息存储到列表中并返回
*
* @param file - 指定文件
* @return - 返回信息列表
*/
public static List<Game> getAllGame(File file) {
try {
InputStream in = new FileInputStream(file);
SAXReader reader = new SAXReader();
Document doc = reader.read(in);
Element root = doc.getRootElement();
List<Game> games = new ArrayList<>();
List<Element> elements = root.elements();
for (Element element : elements) {
// 遍历并把所有标签存储到列表中
Game game = new Game();
game.setTitle(element.elementText("title"));
game.setX(Integer.valueOf(element.elementText("x")));
game.setY(Integer.valueOf(element.elementText("y")));
game.setWidth(Integer.valueOf(element.elementText("width")));
game.setHeight(Integer.valueOf(element.elementText("height")));
games.add(game);
}
return games;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
将XML文件中的数据全部清空
/**
* 本方法会删除指定文件所有的根标签下的子标签,仅保留根标签
*
* @param file - 指定文件
*/
public static void removeAllGame(File file) {
try {
InputStream in = new FileInputStream(file);
SAXReader reader = new SAXReader();
Document doc = reader.read(in);
Element root = doc.getRootElement();
List<Element> elements = root.elements();
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
for (Element element : elements) {
// 遍历并删除所有子标签
element.detach();
}
// 写入文件
FileOutputStream fos = new FileOutputStream(file);
XMLWriter writer = new XMLWriter(fos, format);
writer.write(doc);
// 结束操作
writer.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
下面为测试结果:
使用exe4j打包成exe文件
- eclipse导出项目:导出JAR文件,一直点下一步就可。
- 打开exe4j。(相关图片因版本问题无法上传,只能文字描述了)
- 1.Welcome右下方有个Change License按钮,需要填注册码,不填则会每次打开exe文件都会弹出一个提示框。注册码在网上一大把。
- 在2.Froject type选择"JAR in EXE" mode。
- 在4.Executable info勾选Generate 64-bit executable(64位电脑才需要勾选)。
- 在5.Java invecation里面添加所有Jar包,设置程序的主方法。
- 在5.Native libraries里面添加所有dll文件,没有就不用导入。
- 在6.Search sequence里面添加jre路径,如.\jre1.8.0.202,就代表打包好的exe文件与jre文件夹需要放在同一级目录里面,如果填.\lib\jre1.8.0.202,则需要在exe文件旁边建立文件夹lib,然后把jre文件夹复制到lib里面。
- 在6.Preferred VM里面选择Client hotspot VM,然后直接Finish。
- 点击Finish之后就开始打包了,打包成功后就可以在你设置的保存路径下看到打包好的exe文件。
回首BUG
打包完成后就可以直接运行exe文件了,也可以发给朋友们使用,如果用缩放比例为125%的电脑写的Swing界面打包之后会发现界面变大了,因为打包之后的比例为100%,你把电脑的缩放比例调整为100%后,显示界面就正常了,我前一卷说的BUG就是这比例搞出来的,因为我电脑就是125%缩放比例,计算鼠标坐标是正常的,如果突然按照100%缩放比例来计算,会发现存在1.25倍数的坐标偏移,在这BUG出现之时,我一直以为是代码的问题,检测了很长一段时间,最后才知道是缩放比例的问题,然后就写了个检测缩放比例的代码,如下所示:
// 计算屏幕尺寸差异
double different;
// 计算真实的屏幕比例
GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
// 计算缩放比例为100%情况下的屏幕尺寸
Dimension di = Toolkit.getDefaultToolkit().getScreenSize();
// 差异对比计算
double different1 = gd.getDisplayMode().getWidth() / di.getWidth();
double different2 = gd.getDisplayMode().getHeight() / di.getHeight();
if(different1 == different2) {
different = different1;
}
注意:getScreenSize()方法在打包前也是按照125%比例计算的,在打包后就会按照100%比例计算,而getDefaultScreenDevice()无论什么情况都是按照你电脑设置的比例进行计算,所以我们可以通过两个方法的计算差异获得此电脑的缩放比例,然后通过缩放比例来调整坐标信息,如:检测同一个位置坐标,打包前为(625,625),打包后为(500,500),缩放比例就是1.25,我们只需要把程序的坐标计算结果乘上缩放比例,即可兼容所有缩放比例的电脑。当然,你也可以不用处理缩放比例的问题,既然这方法按照100%比例就能正常运行,我们只需计算一下差异,如果缩放比例不为100%,就弹出提示即可。
public static void main(String[] args) {
if (getDifferent()) {
//此处省略一万行代码
} else {
javax.swing.JOptionPane.showMessageDialog(null, "请将您的电脑的缩放尺寸改成100%", "提示", javax.swing.JOptionPane.WARNING_MESSAGE);
}
}
最后结语
脚本1.0的功能也快介绍完了,下一卷主要内容就是说一些图片相关的功能:注册(登录)界面常常使用的生成验证码,图像识别(就是在屏幕上查找与另一个图片的坐标,比如在屏幕上截取一张图片,运行程序后,得出这张截图在屏幕的位置,主要用于脚本可识别图片,好处就是即使窗口移动了也可以找到正常的坐标),一些小功能:设置软件的试用期,自动关机,最后就是需要脚本源码的道友,在评论下方留下邮箱账号即可!