/**
* @author zzb
* @version V1.0
* @creat 2022 0531 19:09
*/
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ShootGame extends JPanel {
private static final long serialVersionUID = 1L;
//背景图片的大小320*568
public static final int WIDTH = 320;
public static final int HEIGHT = 568;
//游戏界面固定大小336*607
public static final int FRAME_WIDTH = 336;
public static final int FRAME_HEIGHT = 607;
/*
* 游戏启动第一件事是从硬盘加载所有要用到的图片到内存当中
* 而且仅在启动时加载一次——静态块
* 缓存在程序中的所有图片,都会反复使用,仅保存一份——静态变量
* 下面,为每张图片加载一个静态变量,然后在静态块加加载每张图片
*/
public static BufferedImage background; //背景图片
public static BufferedImage start; //开始图片
public static BufferedImage airplane; //敌机图片
public static BufferedImage bigplane; //大飞机
public static BufferedImage hero0; //英雄机状态0
public static BufferedImage hero1; //英雄机状态1
public static BufferedImage bullet; //子弹
public static BufferedImage pause; //暂停图片
public static BufferedImage gameover; //游戏结束
//静态块,在类加载到方法区时执行一次,专门加载静态资源
static{
/*
* java从硬盘中加载图片到内存中:
* ImageIO.read方法:专门从硬盘中加载图片的静态方法
* 不用实例化,直接调用
* ShootGame.class:获得当前类的加载器所在路径
* ShootGame.class.getRerource("文件名"); 从当前类所在路径加载指定文件到程序中
*/
try {
background = ImageIO.read(ShootGame.class.getResource("background.png"));
airplane = ImageIO.read(ShootGame.class.getResource("airplane.png"));
bigplane = ImageIO.read(ShootGame.class.getResource("bigplane.png"));
bullet = ImageIO.read(ShootGame.class.getResource("bullet.png"));
start = ImageIO.read(ShootGame.class.getResource("start.png"));
pause = ImageIO.read(ShootGame.class.getResource("pause.png"));
hero0 = ImageIO.read(ShootGame.class.getResource("hero0.png"));
hero1 = ImageIO.read(ShootGame.class.getResource("hero1.png"));
gameover = ImageIO.read(ShootGame.class.getResource("gameover.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 为游戏中的角色定义数据结构,包括:
* 1个英雄机对象
* 1个存储所有敌人(敌机和大飞机)的对象数组
* 1个存储所有子弹的对象数组
*/
public Hero hero = new Hero();
public Flyer[] flyers = {}; //存储所有敌人对象的数组
public Bullet[] bullets = {}; //存储所有子弹对象的数组
//定义游戏状态:当前状态变量:默认为开始状态
private int state = START;
//定义游戏状态的备选项常量:
public static final int START = 0;
public static final int RUNNING = 1;
public static final int PAUSE = 2;
public static final int GAME_OVER = 3;
public static void main(String[] args) {
/*
* java中绘制窗体:JFrame对象——窗框
* 要想在窗体中绘制内容,还需要嵌入背景面板——JPanel
*/
JFrame frame = new JFrame("ShootGame");
frame.setSize(FRAME_WIDTH,FRAME_HEIGHT);//(336, 607);
frame.setAlwaysOnTop(true); //设置窗体置顶
//设置窗体关闭同时,退出程序
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null); //设置窗体的位置,null表示居中
/*在窗体中嵌入背景面板对象——JPanel*/
ShootGame game = new ShootGame(); //创建背景面板对象
frame.add(game); //将背景面板对象嵌入到窗体对象中
/*窗体默认不可见!必须调用setVisible方法才能显示窗体*/
frame.setVisible(true); //自动调用窗体的paint方法
game.action();
}
/**
* 游戏启动时要做的事
*/
public void action(){
/*游戏开始时,要定义鼠标事件的监听*/
//step1: 创建MouseAdapter匿名内部类——事件的响应程序
MouseAdapter l = new MouseAdapter(){
//step2: 重写希望的鼠标事件——鼠标移动
@Override
public void mouseMoved(MouseEvent e) {
//只有在RUNNING状态下英雄机才跟随鼠标移动
if(state == RUNNING){
//step3: 获得鼠标新位置
int x = e.getX();
int y = e.getY();
//step4: 将鼠标位置传给英雄机的move方法
hero.move(x, y);
}
}
@Override
public void mouseClicked(MouseEvent e) {
if(state == START || state == PAUSE){ //START或者PAUSE状态,单击才会改改为RUNNING状态
state = RUNNING;
}else if(state == RUNNING){ //游戏点击暂停
state = PAUSE;
}else if(state == GAME_OVER){ //游戏结束后单击,游戏初始化
state = START;
//从GAME_OVER到START,要重新初始化游戏数据
flyers = new Flyer[0];
bullets = new Bullet[0];
hero = new Hero();
}
}
@Override
public void mouseExited(MouseEvent e) {
if(state == RUNNING){
//仅在处于RUNNING状态下,鼠标移出才暂停
state = PAUSE;
}
}
@Override
public void mouseEntered(MouseEvent e) {
if(state == PAUSE){
state = RUNNING;
}
}
}; //匿名内部类要以分号结尾
/*step5: 要响应鼠标事件,必须将鼠标事件添加到程序的监听器中*/
this.addMouseMotionListener(l); //支持鼠标的移动事件,不支持鼠标单击事件
this.addMouseListener(l);; //支持鼠标单击事件
//step1: 创建定时器
Timer timer = new Timer();
//step2: 调用定时器对象的schedule方法,做计划
// 第一个参数:TimerTask类型的匿名内部类
// 必须重写run方法——核心——要做什么事
timer.schedule(new TimerTask(){
//首先定义一个计时器变量index,记录run方法运行的次数
private int runTimes = 0;
@Override
public void run() {
//除了repaint方法,其余功能只在RUNNING状态下执行
if(state == RUNNING){
//每执行一次run方法,runTimes就+1
runTimes++;
//每500亳秒生成一次敌人
if(runTimes % 50 == 0){
nextOne(); //自动随机创建敌人对象
}
//遍历每一个对象,调用对象的step
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
使用JAVA开发的飞机大战小游戏,包括i背景图以及绘制.zip (33个子文件)
Plane-Wars-main
飞机大战
src
Airplane.java 1009B
Hero.java 4KB
airplane.png 3KB
Bullet.java 943B
gameover.png 55KB
bigplane.png 7KB
Flyer.java 1KB
hero0.png 12KB
hero1.png 16KB
background.png 281KB
bullet.png 408B
BigPlane.java 2KB
start.png 23KB
ShootGame.java 15KB
pause.png 15KB
out
production
飞机大战
Bullet.class 797B
ShootGame$1.class 1KB
Airplane.class 998B
BigPlane.class 1KB
airplane.png 3KB
Hero.class 2KB
gameover.png 55KB
bigplane.png 7KB
hero0.png 12KB
hero1.png 16KB
background.png 281KB
ShootGame.class 6KB
ShootGame$2.class 1KB
bullet.png 408B
start.png 23KB
Flyer.class 863B
pause.png 15KB
飞机大战.iml 433B
共 33 条
- 1
资源评论
马coder
- 粉丝: 1207
- 资源: 6602
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功