引言
Java Swing,一种灵活的图形用户界面库,让我们可以以相对简便的方式创建图形化应用程序。在本文中,我们将讲述如何借助Swing构建一个简单的游戏:DogGame,它的规则是控制一只名为Wsc的狗来捕捉飞来的热狗。让我们浏览一下游戏设计的构思,代码的实现,并逐行解析关键的编程细节。
设计理念
在开始编码之前,我们需要理解的是,一个好的游戏是如何设计的。我们的DogGame具备以下特点:
- 简易性:界面简洁明了,用户易于上手。
- 响应性:游戏界面应对用户输入做出快速响应。
- 扩展性:代码结构清晰,便于未来添加新功能。
构建游戏模型
我们的游戏模型包含三个主要类:DogGame
, Wsc
, 和 HotDog
。
- DogGame:这是游戏的主类,负责创建游戏窗口,初始化游戏环境,并控制游戏的主要循环。
- Wsc:代表游戏中的狗,能够移动并接住热狗。
- HotDog:它们从屏幕的一端飞到另一端,是Wsc需要捕捉的目标。
游戏实现
在Java Swing中,我们通常从创建一个继承JPanel
的类开始。接着,我们将添加自定义的面板,用于渲染游戏元素,如Wsc和HotDog。让我们深入到每个类和关键功能的实现中。
DogGame类
DogGame类将继承自JFrame
,并创建游戏的主窗口。在这个类中,我们将设置窗口的大小,初始化游戏元素,并创建游戏的主要循环来更新和渲染元素。
public class DogGame extends JPanel implements Runnable, MouseMotionListener {
private Wsc wsc = new Wsc();
private List<HotDog> list = new ArrayList<>();
int sum = 0;
public DogGame() {
Icon icon = new ImageIcon(DogGame.class.getResource("/statics/Beijing.jpg"));
JLabel label = new JLabel(icon);
this.add(label);
}
// 采用定时器的方式,创建很多的热狗对象,存入到list集合中
// 使用Java的定时器的API,定时器每隔1秒钟执行一次方法
public void createHotDogs() {
TimerTask timerTask = new TimerTask() {
public void run() {
HotDog dog = new HotDog(list);
}
};
java.util.Timer timer = new java.util.Timer();
timer.schedule(timerTask, 0, 1000);
}
// 重写面板的绘图方法
public void paint(Graphics g) {
super.paint(g);
g.drawImage(wsc.getImage(), wsc.getX(), wsc.getY(), null);
for (int i = 0; i < list.size(); i++) {
HotDog hotDog = list.get(i);
hotDog.move();
int n = hotDog.clear(wsc);
sum += n;
g.drawImage(hotDog.getImage(), hotDog.getX(), hotDog.getY(), null);
}
g.setColor(Color.yellow);
g.setFont(new Font("宋体", Font.BOLD, 20));
g.drawString("您现在已经吃了" + sum + "个热狗", 20, 30);
if (sum >= 4) {
g.drawString("真香(热狗就是好吃)!", 250, 30);
}
}
// 线程run方法
public void run() {
while (true) {
this.repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
int x = e.getX();
wsc.setX(x);
}
// 主函数,运行主函数开始游戏
public static void main(String[] args) {
FlatDarkLaf.setup();
JFrame frame = new JFrame();
frame.setTitle("思聪吃热狗");
frame.setSize(489, 650);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DogGame dogGame = new DogGame();
frame.add(dogGame);
dogGame.createHotDogs();
dogGame.repaint();
new Thread(dogGame).start();
dogGame.addMouseMotionListener(dogGame);
frame.setVisible(true);
}
}
Wsc类
Wsc
类代表游戏中的狗,我们使用图片绘绘制狗,并实现键盘监听来移动狗的坐标。
public class Wsc {
private int x;
private int y;
private BufferedImage image;
public Wsc() {
try {
x = 180;
y = 500;
image = ImageIO.read(Wsc.class.getResource("/statics/Wsc.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public BufferedImage getImage() {
return image;
}
public void setImage(BufferedImage image) {
this.image = image;
}
}
HotDog类
接下来是HotDog
类,它需要能够随机生成,并沿屏幕飞行。
public class HotDog {
private int x;
private int y;
private BufferedImage image;
private Random random = new Random();
private List<HotDog> list;
// 热狗随机出现的位置
public HotDog(List<HotDog> list) {
try {
image = ImageIO.read(HotDog.class.getResource("/statics/HotDog.png"));
this.list = list;
y = 0;
x = random.nextInt(400);
this.list.add(this);
} catch (IOException e) {
e.printStackTrace();
}
}
public void move() {
y += 10;
if (y >= 600) {
this.list.remove(this);
}
}
//
// 吃热狗碰撞,消除数据
// 返回消除的数量
public int clear(Wsc wsc) {
int dogx2 = x;
int dogx3 = dogx2 + 66;
int dogy = y;
int dogy2 = dogy + 102;
int wscx = wsc.getX();
int wscx2 = wscx + 30;
int wscx3 = wscx + 80;
int wscy = wsc.getY();
int flagx2 = dogx2 - wscx2;
int flagx3 = dogx3 - wscx3;
int flagy = dogy2 - wscy;
if (flagx2 > -20 && flagx3 < 20 && flagy > 20 && flagy < 40) {
boolean remove = this.list.remove(this);
if (remove) {
return 1;
}
}
return 0;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public BufferedImage getImage() {
return image;
}
public void setImage(BufferedImage image) {
this.image = image;
}
}
项目亮点
使用到了FlatLaf (IDEA风格)-干净、优雅、扁平化的现代开源跨平台外观
<dependency>
<groupId>com.formdev</groupId>
<artifactId>flatlaf</artifactId>
<version>2.3</version>
</dependency>
结语
本文提供了一个简单游戏的设计和开发旅程——从构想到实现,从代码到操作。虽然简单,但DogGame是理解如何使用Java Swing构建应用程序的绝佳入门方式。学习完这个教程后,你应该能够运用相似的概念自己创建更复杂的游戏或其他类型的应用。
如要获取完整的代码和静态资源,请查看我的同名公众号
,回复:吃热狗
。希望你在构建自己的DogGame时会有很多乐趣!