我们用JavaSwing写一个简单地java项目——黄金矿工,首先建一个game包,用以存放各个类。
图片素材有一个天空背景、一个地面背景、一个人物、一个勾爪、不同大小的金块、石块及药水。
抓取金块得分,抓取石块扣分,每一关刷新金块与石块的位置。
运行类
GameWin 这是主要的类,继承自JFrame,是图形用户界面的顶层容器。它管理游戏状态、渲染和用户交互。
List objectList 一个列表,存储各种游戏对象(如金块和岩石),可以与之交互。
bj 一个类的实例,表示背景或主要游戏逻辑。
line 一个类的实例,表示用于捕捉对象的线。
offScreenImage 用于双缓冲的图像,以减少渲染时的闪烁。
state 一个静态整数,表示游戏的当前状态(例如,开始、运行、成功、失败、商店)。
构造块初始化objectList添加不同类型的对象(如金块、金块2、金块3和岩石)。每种类型的数量由循环计数定义。
launch() 该方法设置JFrame的属性(大小、标题、关闭操作),并添加鼠标监听器以处理用户交互。它进入一个无限循环,不断重绘游戏并调用nextL()检查游戏状态的变化。
鼠标监听器处理不同的游戏状态
状态 | 事件 |
---|---|
状态0(开始) | 当右键单击时开始游戏 |
状态1(运行) | 允许玩家与游戏互动(例如,左键单击捕捉对象) |
状态2(成功) | 根据鼠标点击打开商店或重新开始游戏 |
状态3(失败) | 当左键单击时重置游戏 |
状态4(商店) | 类似于状态3,重置游戏 |
nextL() 该方法检查游戏是否应该根据游戏逻辑转换到新状态(例如,玩家是否达到了目标)。如果达到了目标,则转到商店或增加等级。
paint(Graphics g) 该方法负责渲染游戏。它创建一个用于双缓冲的离屏图像,调用bj和line对象的各种绘制方法,并遍历objectList绘制每个对象。
源码
package game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
public class GameWin extends JFrame {
List<Object> objectList = new ArrayList<>();
bj bj = new bj();//背景
line line = new line(this);//抓取线
//gold gold = new gold();//金块
Image offScreenImage;
public static int state;//状态——开始:0,运行:1,成功:2,失败:3,商店:4
{
for (int i = 0; i<1; i++) {
objectList.add(new gold());
}
for (int i = 0; i<2; i++) {
objectList.add(new gold2());
}
for (int i = 0; i<3; i++) {
objectList.add(new gold3());
}
for (int i = 0; i<3; i++) {
objectList.add(new rock());
}
}//添加被抓取元素
void launch() {
this.setVisible(true);
this.setSize(666,638);
this.setLocationRelativeTo(null);
this.setTitle("抓住那个会动的!");
this.setResizable(false);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
switch(state) {
case 0:
if(e.getButton() == 3){
state = 1;
bj.start = System.currentTimeMillis();
}
break;
case 1:
if(e.getButton() == 1 && line.state == 0){
line.state = 1;
}
if(e.getButton() == 3 && line.state == 3&&bj.djNum>0){
bj.djFlag = true;
bj.djNum--;
}
break;
case 2:
if(e.getButton() == 1){
bj.shop = true;
}
if(e.getButton() == 3){
state = 1;
bj.start = System.currentTimeMillis();
}
break;
case 3:
if(e.getButton() == 1){
state = 0;
bj.reG();
line.reG();
}
break;
case 4:
if(e.