陈锐 GUI图形界面的编写,类的设计及代码编写,实现脱离IDE运行
集大矿工 模仿经典游戏黄金矿工
以黄金矿工游戏为例,正常进行游戏需要构建 “黄金” “石块” “抓钩抓取” “碰撞检测 ” 等 ,我主要负责这些图形界面的设计,因为黄金矿工网上做的人也很多,所以我们决定重新设计背景以及抓取物品类型
炸弹,大书,小书,中等书籍 都继承自物品类 ,每个物品都有其对应的坐标,对应权重,对应长短,拥有自己的图片
定义坐标(x,y)表示该物品位于坐标轴的位置,均使用Random自定义随机生成。定义长和宽,根据长宽及坐标构造出矩形,就可以表示物品具体所在位置,中间加入物品图片
代码:
public class Objects {
/**
* (坐标)
*/
public int x;
public int y;
/**
* (宽高)
*/
public int width;
public int height;
/**
* (图片)
*/
Image image;
/**
* (是否能移动)
*/
public boolean isMove;
/**
* (质量)
*/
public int mass;
/**
* (积分)
*/
public int score;
/**
* (标记 1为课本 2为炸弹)
*/
public int type;
public void paintSelf(Graphics g) {
g.drawImage(image, x, y, null);
}
public int getWidth() {
return width;
}
/**
*
* @Title: getRecangle
* @Description: 获取矩形,判断这个物体具体到达的位置
* @return Rectangle
*/
public Rectangle getRecangle() {
return new Rectangle(x, y, width, height);
}
}
炸弹类
抓到炸弹 分数-2,所以其对应的权重为-2
选取图片
代码
/**
*
* @ClassName Bomb
* @Description 炸弹
* @Author 陈锐
* @Time 2021年1月9日 下午3:30
*/
public class Bomb extends Objects {
public Bomb() {
this.x = new Random().nextInt(701);
this.y = new Random().nextInt(300, 550);
this.width = 71;
this.height = 71;
this.isMove = false;
this.mass = 50;
this.score = -2;
this.type = 2;
this.image = Toolkit.getDefaultToolkit().getImage("imgs/bomb.png");
}
}
/**
*
* @ClassName MinBook
* @Description
* @Author 陈锐
* @Time 2021年1月9日 下午3:30
*/
public class MiniBook extends Objects {
public MiniBook() {
this.x = new Random().nextInt(701);
this.y = new Random().nextInt(300, 700);
this.width = 36;
this.height = 36;
this.mass = 15;
this.score = 2;
this.image = Toolkit.getDefaultToolkit().getImage("imgs/c.png");
}
}
/**
*
* @ClassName MiddleBook
* @Description
* @Author 陈锐
* @Time 2021年1月9日 下午3:30
*/
public class MiddleBook extends Objects {
public MiddleBook() {
this.x = new Random().nextInt(701);
this.y = new Random().nextInt(300, 600);
this.width = 52;
this.height = 52;
this.isMove = false;
this.mass = 30;
this.score = 4;
this.type = 1;
this.image = Toolkit.getDefaultToolkit().getImage("imgs/jz.png");
}
}
大号书籍,分数最大,质量最大,相应设计时候的体积也最大
选取图片
/**
*
* @ClassName PlusBook
* @Description 最大号书籍
* @Author 陈锐
* @Time 2021年1月9日 下午3:30
*/
public class PlusBook extends MiddleBook {
public PlusBook() {
this.x = new Random().nextInt(701);
this.y = new Random().nextInt(500, 700);
this.width = 85;
this.height = 85;
this.mass = 60;
this.score = 8;
this.image = Toolkit.getDefaultToolkit().getImage("imgs/jw.png");
}
}
关卡,电池数量,当前分数,目标分数,倒计时
/**
* (绘制)
*/
void paintSelf(Graphics g) {
switch (GameWin.gameState) {
case 0:
g.drawImage(startPicture, 0, 0, null);
drawWord(g, 80, Color.ORANGE, "集大矿工", 40, 150);
drawWord(g, 40, Color.lightGray, "轻触右键开始", 40, 210);
break;
case 1:
g.drawImage(backGroundPicture, 0, 200, null);
g.drawImage(backGroundPicture1, 0, 0, null);
g.drawImage(minerPicture, 310, 50, null);
drawWord(g, 30, Color.black, "积分:" + count, 30, 150);
/**
* (药水组件)
*/
g.drawImage(batteryPicture, 550, 40, null);
drawWord(g, 30, Color.black, "*" + batteryNum, 610, 70);
/**
* (关卡数)
*/
drawWord(g, 20, Color.black, "第" + level + "关", 30, 60);
/**
* (目标积分)
*/
drawWord(g, 30, Color.black, "目标" + goal, 30, 110);
/**
* (时间组件)
*/
endTime = System.currentTimeMillis();
long tim = 20 - (endTime - startTime) / 1000;
drawWord(g, 30, Color.black, "时间:" + (tim > 0 ? tim : 0), 520, 150);
break;
case 2:
g.drawImage(backGroundPicture, 0, 200, null);
g.drawImage(backGroundPicture1, 0, 0, null);
g.drawImage(batteryPicture, 300, 400, null);
drawWord(g, 30, Color.black, "价格:" + price, 300, 500);
drawWord(g, 30, Color.black, "左键购买 右键取消", 250, 600);
if (shop) {
count = count - price;
batteryNum++;
shop = false;
GameWin.gameState = 1;
startTime = System.currentTimeMillis();
}
break;
case 3:
g.drawImage(defeatPicture, 0, 0, null);
drawWord(g, 80, Color.red, "失败 " + "积分:" + count, 100, 100);
drawWord(g, 40, Color.gray, "左键重新开始游戏", 150, 150);
break;
case 4:
g.drawImage(winPicture, 0, 0, null);
drawWord(g, 80, Color.red, "成功 " + "积分:" + count, 100, 100);
drawWord(g, 40, Color.gray, "左键重新开始游戏", 200, 520);
break;
default:
}
}
每一关设计游戏时间为20秒
/**
* (t倒计时完成 f正在倒计时)
*/
boolean gameTime() {
int gameTime = 20;
long time = (endTime - startTime) / 1000;
if (time > gameTime) {
return true;
}
return false;
}
/**
* (重置元素)
*/
void reGame() {
/**
* (关卡数)
*/
level = 1;
/**
* (目标得分)
*/
goal = level * 10;
/**
* (总分)
*/
count = 0;
/**
* (药水数量)
*/
batteryNum = 3;
/**
* (药水状态,默认F,T 正在使用 F 无法使用)
*/
batteryState = false;
}
默认使用黑体
/**
* (绘制字符串)
*/
public static void drawWord(Graphics g, int size, Color color, String string, int x, int y) {
g.setColor(color);
g.setFont(new Font("黑体", Font.BOLD, size));
g.drawString(string, x, y);
}
}
我们平时在下一个软件,使用一个软件的时候,都不能让看到源代码,一方面是对开发者的开发权益保护,另一方面是为了让用户使用的时候更加方便不容易让程序出错,所以将程序打包,脱离IDE运行是很有必要的
网上关于vscode 导出jar包的教程较少,描述也都有不同的方法,大部分都是eclipse的使用方法. 所以这里主要介绍vscode 的导出jar方法
点开项目目录,找到 “->”,单击,选择好main函数,jar即可导入到项目文件夹下
最后在程序窗口看到这行命令,jar就成功导出了
看上去好像很简单,似乎是非常方便,接下来我们尝试运行jar包,就会出现各种各样的问题。不同的机型,vscode插件的配置方法, 使用JDK的版本,都会导致运行Jar包时出现各种各样的错
如
因为本人才疏学浅,所以解决问题的办法都比较暴力,欢迎老师同学批评指正
我在尝试运行jar包的时候大致遇到以下几种情况:
因为课设时间比较急迫,遇到的问题没有全部截屏,所以采用口头叙述
(1)显示 “你的jar包 生成依靠的JDK版本是 11.x, 但系统依靠的版本JDK是13.x…… ” ,出现这种情况,一般是vscode 安装配置好java环境过后,又安装过其他的java编程软件如“eclipse” ,然后又重复配置系统jdk环境,安装新版本后导致新旧版本冲突导致的错误。
解决办法:找到系统安装目录删除所有版本的jdk,统一安装最新版本的jdk,
输入 电脑控制台 和 vscode 控制台 输入 javac -version 查看jdk版本是否一致,一致后更改完成,jar即可正常运行
(2) 显示“无法加载主类,找不到主类”,这种情况我估计是vscode 脑袋比较笨的原因了,或者是其他什么我不知道的原因,大致是因为变成jar包最后我找不到main ,不知道怎么运行,这种情况的话,就把主类单独提出来,作为一个类,不要把主函数写到别的类里面
(3)显示 “加载主类 windows.Main 时出现 LinkageError
java.lang.UnsupportedClassVersionError: Preview features are not enabled for windows/Main (class file version 61.65535). Try running with ‘–enable-preview’” 安装中文翻译的意思,这种情况是文件格式所引起的,复制好报错问题文件的代码,删除文件,重新添加文件
想要转成.exe,需要有其他软件的支持,这里使用的是:exe4j :官网:www.exe4j.com
参考博客 https://blog.csdn.net/qq_45964209/article/details/105889616
使用软件 Inno Setup 编译器
这一步尝试了很久一直在找问题,但是最终还是没有完全成功 、
根据网上教程下载了对应软件,但最终生成安装包安装成功后并不能正常运行
问题猜测:因为我使用的JDK 17文件夹当中并没有找到对应的jre,所以在网上下载了对应的jre,但是因为我生成jar的时候使用的并不是jre版本,而是jdk17所以导致出错,目前没有想到对应的解决办法,希望假期可以解决这个问题