- 项目:飞机大战小游戏之绘制敌方飞机的随机降临
- 项目简介:飞机大战小游戏的角色,特征+行为
- 开发工具:eclipse
- 语言:Java
- 知识点:Random、模块化、监听器、定时器
代码架构:程序分两个包,共四个类
操作效果图:
ImageUtil.java:游戏加载图片的工具类
SmallPlane.java:敌方飞机
package com.demo.model;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import com.demo.util.ImageUtil;
/**
* 小敌机
*/
public class SmallPlane {
private BufferedImage image = ImageUtil.readImage("smallplane0.png");
private int x; // 飞机放置在面板上的x轴
private int y; // 飞机放置在面板上的y轴
// 定义构造函数
public SmallPlane() {
this.x = new Random().nextInt(GameStart.WIDTH - image.getWidth());
this.y = -image.getHeight();
}
/**
* 行为
*/
// 移动
public void movePlane() {
this.y += 3;
}
// 子弹的移动
public void moveBullet() {
this.y += 3;
}
// 开火的方法
public List<EnemyBullet> fire() {
List<EnemyBullet> list = new ArrayList<EnemyBullet>();
list.add(new EnemyBullet(this.x + image.getWidth() / 2, this.y + image.getHeight() / 2));
return list;
}
//是否越界
public boolean isOutOfBound() {
return this.y > GameStart.HEIGHT + image.getHeight();
}
//getters/setters方法
}
小型敌机与大型敌机和轰炸机的区别其实就是图片和开火的子弹条数,故更换一下图片修改一下开火的方法即可
// 小型敌机的开火方法
public List<EnemyBullet> fire() {
List<EnemyBullet> list = new ArrayList<EnemyBullet>();
list.add(new EnemyBullet(this.x + image.getWidth() / 2, this.y + image.getHeight() / 2));
return list;
}
// 大型敌机的开火方法
public List<EnemyBullet> fire() {
List<EnemyBullet> list = new ArrayList<EnemyBullet>();
list.add(new EnemyBullet(this.getX()+image.getWidth()/3-8,this.getY()+image.getHeight()/2)); //敌机子弹的位置偏移
list.add(new EnemyBullet(this.getX()+image.getWidth()*2/3,this.getY()+image.getHeight()/2));
return list;
}
// 轰炸机的开火方法
public List<EnemyBullet> fire() {
List<EnemyBullet> list = new ArrayList<>();
list.add(new EnemyBullet(this.getX()+image.getWidth()/6,this.getY()+image.getHeight()/2)); //敌机子弹的位置偏移
list.add(new EnemyBullet(this.getX()+image.getWidth()*2/6,this.getY()+image.getHeight()/2));
list.add(new EnemyBullet(this.getX()+image.getWidth()*3/6,this.getY()+image.getHeight()/2));
list.add(new EnemyBullet(this.getX()+image.getWidth()*4/6,this.getY()+image.getHeight()/2));
list.add(new EnemyBullet(this.getX()+image.getWidth()*5/6,this.getY()+image.getHeight()/2));
return list;
}
EnemyBullet.java:敌方飞机子弹
package com.demo.model;
import java.awt.image.BufferedImage;
import com.demo.util.ImageUtil;
/**
* 敌机子弹
*/
public class EnemyBullet {
/**
* 特征
*/
private BufferedImage image = ImageUtil.readImage("enemybullet0.png");
private int x; // 在画布的x轴
private int y; // 在画布的y轴
public EnemyBullet(int x, int y) {
this.x = x;
this.y = y;
}
/**
* 行为
*/
// 子弹的移动
public void move() {
this.y += 3;
}
//判断是否越界
public boolean isOutOfBound() {
return this.y > GameStart.HEIGHT + image.getHeight();
}
//getters/setters方法
}
GameStart.java:主程序
package com.demo.model;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import com.demo.util.ImageUtil;
/**
* 飞机大战小游戏(三):敌方飞机骚起来
* @author suoyue_zhan
*/
public class GameStart extends JPanel {
public static final int WIDTH = 400; //游戏界面宽度
public static final int HEIGHT = 654; //游戏界面长度
private BufferedImage background1 = ImageUtil.readImage("background.jpg"); // 背景图片:静态
//敌机的集合
private List<SmallPlane> enemyPlanes = new ArrayList<>();
//敌机登场
private void enemyPlaneEnter() {
enemyPlanes.add(new SmallPlane());
}
//绘制敌机
private void paintEnemyPhane(Graphics g) {
for (int i = 0; i < enemyPlanes.size(); i++) {
SmallPlane enemyPlane = enemyPlanes.get(i);
BufferedImage image = enemyPlane.getImage();
if(image != null && !enemyPlane.isOutOfBound()) {
g.drawImage(image, enemyPlane.getX(), enemyPlane.getY(), null);
}
}
}
//小敌机移动
public void enemyPlaneMove() {
for (SmallPlane enemyPlane : enemyPlanes) {
enemyPlane.movePlane();
}
}
private List<EnemyBullet> enemyBullets = new ArrayList<EnemyBullet>(); //敌机子弹集合
//敌机发送子弹
private void enemyPlaneFire() {
for (int i = 0; i < enemyPlanes.size(); i++) {
SmallPlane enemyPlane = enemyPlanes.get(i);
List<EnemyBullet> list = enemyPlane.fire();
enemyBullets.addAll(list);
}
}
//绘制敌机子弹:当子弹出界后,不要绘制出来
private void paintEnemyBullet(Graphics g) {
for(int i = 0; i < enemyBullets.size(); i++) {
EnemyBullet enemyBullet = enemyBullets.get(i);
BufferedImage image = enemyBullet.getImage();
if(image != null && !enemyBullet.isOutOfBound()) {
g.drawImage(image, enemyBullet.getX(), enemyBullet.getY(), null);
}
}
}
//敌机子弹移动
private void enemyBulletMove() {
for (EnemyBullet enemyBullet : enemyBullets) {
enemyBullet.move();
}
}
// 重写JPanel的绘制方法-->>所有图片都在该方法上执行
@Override
public void paint(Graphics g) {
g.drawImage(background1, 0, 0, null); //绘制背景图
this.paintEnemyPhane(g); //绘制敌机
this.paintEnemyBullet(g); //绘制敌机子弹
}
/**
* 窗口初始化
*/
public void init() {
JFrame jFrame = new JFrame("飞机大战"); // 设置窗口标题
jFrame.add(this); // this表示主类,也表示画板
jFrame.setSize(WIDTH, HEIGHT); // 设置窗口大小
jFrame.setLocationRelativeTo(null); // 设置窗口居中
jFrame.setAlwaysOnTop(true); // 设置窗口总是在顶端
jFrame.setResizable(false); // 设置不允许拖拉
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口时退出程序
jFrame.setIconImage(new ImageIcon("./images/icon.png").getImage()); // 设置图标
jFrame.setVisible(true); // 使窗口显示出来
initListener(); //安装程序监听器
initTimer(); //设置定时器,用于实现游戏中所有的动态逻辑效果
}
/**
* 监控鼠标的监听器
*/
private void initListener() {
//使用鼠标监听器的适配器
MouseAdapter adapter = new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
//获取鼠标的x坐标与y坐标
System.out.println("x: " + e.getX() + "y: " + e.getY());
}
};
//添加鼠标监听器
this.addMouseListener(adapter);
this.addMouseMotionListener(adapter);
}
/**
* 定时器
*/
private long count = 0; //控制频率
public void initTimer(){
Timer timer = new Timer(); //定时器对象
long delay = 10;
long period = 10;
//定时执行操作
//参数1:每隔一段时间执行的操作
//参数2:几毫米之后执行定时器
//参数3:每个几毫米执行一次
timer.schedule(new TimerTask() {
@Override
public void run() {
//敌机登场
if(count % 50 == 0) {
enemyPlaneEnter();
}
//敌机移动
if(count % 2 == 0) {
enemyPlaneMove();
}
//敌机发送子弹
if(count % 50 == 0) {
enemyPlaneFire();
}
//敌机子弹的移动
enemyBulletMove();
if(count == Long.MAX_VALUE-1){
count = 0;
}
count++;
repaint(); //重新绘制页面
}
}, delay,period);
}
/*
* 程序入口main()
*/
public static void main(String[] args) {
System.out.println("游戏开始了.....");
GameStart gameStart = new GameStart();
gameStart.init(); //显示主界面
}
}