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文件

  1. eclipse导出项目:导出JAR文件,一直点下一步就可。
  2. 打开exe4j。(相关图片因版本问题无法上传,只能文字描述了
  3. 1.Welcome右下方有个Change License按钮,需要填注册码,不填则会每次打开exe文件都会弹出一个提示框。注册码在网上一大把。
  4. 2.Froject type选择"JAR in EXE" mode。
  5. 4.Executable info勾选Generate 64-bit executable(64位电脑才需要勾选)。
  6. 5.Java invecation里面添加所有Jar包,设置程序的主方法。
  7. 5.Native libraries里面添加所有dll文件,没有就不用导入。
  8. 6.Search sequence里面添加jre路径,如.\jre1.8.0.202,就代表打包好的exe文件与jre文件夹需要放在同一级目录里面,如果填.\lib\jre1.8.0.202,则需要在exe文件旁边建立文件夹lib,然后把jre文件夹复制到lib里面。
  9. 6.Preferred VM里面选择Client hotspot VM,然后直接Finish。
  10. 点击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的功能也快介绍完了,下一卷主要内容就是说一些图片相关的功能:注册(登录)界面常常使用的生成验证码图像识别(就是在屏幕上查找与另一个图片的坐标,比如在屏幕上截取一张图片,运行程序后,得出这张截图在屏幕的位置,主要用于脚本可识别图片,好处就是即使窗口移动了也可以找到正常的坐标),一些小功能:设置软件的试用期自动关机,最后就是需要脚本源码的道友,在评论下方留下邮箱账号即可!

发布了3 篇原创文章 · 获赞 1 · 访问量 1627

猜你喜欢

转载自blog.csdn.net/weixin_44005360/article/details/105266162