这两天跟着视频的老师做了一遍飞机大战游戏,下面分享一下自己的思路,当作让自己复习一遍了哈哈哈~
——————————————————————————————————————————————————————————
简单思路
1 先得把游戏界面的窗体实现
2 实现窗体里面背景的内容
3 选择游戏是采用鼠标监听还是键盘监听
4 把战机图片调用方法画在背景上面
5 让键盘或者鼠标监听战机的轨迹
6 将子弹始发点坐标定在战机坐标前面
7 将敌机图片也画在背景上面
8 定义方法规定敌机的飞行速度和轨迹
9 定义方法判断子弹是否击中敌机及战机是否与敌机相撞
10 定义一个敌机被子弹击中则消失的方法
11 定义一个相撞后战机的血量减少,敌机消失的方法
12 当战机血量为0时游戏结束,点击鼠标重新开始
13 定义不同型号敌机的属性
14 添加游戏音效
以上步骤最难的就是第九步,需要好好理解坐标轴中两个图片的对应关系
——————————————————————————————————————————————————————————
成品如下图
下面是代码的应用说明:
这是一个窗体类
定义游戏窗体的一些细节,以及在主方法中运行其他类的方法。
/*
* 游戏窗体类
*/
public class GameFrame extends JFrame {
public static void main(String[] args) {
GameFrame frame = new GameFrame();
frame.setVisible(true);// 显示窗体
GamePanel panel =new GamePanel(frame);//方便调用键盘监听器
panel.action();//调用启动游戏的方法
frame.add(panel);
frame.setVisible(true);
//调用背景音乐类中的方法
String filepath = "D:\\javagame\\飞机大战\\img\\game_music.wav";
musicStuff musicObject = new musicStuff();
musicObject.playMusic(filepath);
}
//构造方法设置窗体
public GameFrame() {
setTitle("全民飞机大战");// 设置标题
setSize(512, 768);//设置窗体大小
setLocationRelativeTo(null);// 相对于屏幕左上角居中
setResizable(false);// 设置不允许玩家拖动界面
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭游戏时把进程也关掉
}
}
——————————————————————————————————————————————————————————
这是一个画布背景类,我的绝大多数方法都在这个类中定义。
public class GamePanel extends JPanel {
BufferedImage bg = null;
// new战机对象
hero hero = new hero();
// 建立敌机集合 不使用数组做容器是因为敌机数量未知,建立数组先要定义数组长度
List<Ep> eps = new ArrayList<Ep>();
// 建立子弹的弹药库,与敌机集合想法一样
List<Fire> fs = new ArrayList<Fire>();
// 定义分数
int socre;
boolean gameover;// 设置开关
int power = 1;// 火力值
/*
* 开始游戏的方法 建立一个线程
*/
public void action() {
new Thread() {
public void run() {
while (true) {
// if语句判断是否gameover
if (!gameover) {
epEnter();// 敌机进场
epMove();
// 发射子弹
shoot();
// 子弹移动
fireMove();
shootEp();
hit();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
repaint();// 刷新界面
}
}
/*
* 检测子弹是否打到敌机
*/
public void shootEp() {
// 遍历所有子弹
for (int i = 0; i < fs.size(); i++) {
Fire f = fs.get(i);
bang(f);
}
}
/*
* 判断子弹是否击中敌机
*/
private void bang(Fire f) {
for (int i = 0; i < eps.size(); i++) {
Ep e = eps.get(i);
if (e.shootBy(f)) {
e.hp--;
// 当敌机没hp,死亡
if (e.hp <= 0) {
if (e.type == 12) {
power++;
if (po