package main;
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
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.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
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 = 9158805858745581422L;
public static final int WIDTH = 400; // 窗口的宽
public static final int HEIGHT = 654; // 窗口的高
// 静态资源
public static BufferedImage background; // 背景图
public static BufferedImage start; // 开始图
public static BufferedImage pause; // 暂停图
public static BufferedImage gameover; // 游戏结束图
public static BufferedImage airplane; // 敌机图
public static BufferedImage bee; // 蜜蜂图
public static BufferedImage bullet; // 子弹图
public static BufferedImage hero0; // 英雄机0图
public static BufferedImage hero1; // 英雄机1图
public static AudioClip music;
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;
private int state = 0; // 当前状态
private Hero hero = new Hero(); // 英雄机
private Bullet[] bullets = {}; // 子弹数组
private FlyingObject[] flyings = {}; // 敌人数组
private Timer timer;
private int intervel = 10; // 间隔时间:单位--毫秒
// 静态块
static {
try {
background = ImageIO.read(ShootGame.class.getResource("background.png"));
start = ImageIO.read(ShootGame.class.getResource("start.png"));
pause = ImageIO.read(ShootGame.class.getResource("pause.png"));
gameover = ImageIO.read(ShootGame.class.getResource("gameover.png"));
airplane = ImageIO.read(ShootGame.class.getResource("airplane.png"));
bee = ImageIO.read(ShootGame.class.getResource("bee.png"));
bullet = ImageIO.read(ShootGame.class.getResource("bullet.png"));
hero0 = ImageIO.read(ShootGame.class.getResource("hero0.png"));
hero1 = ImageIO.read(ShootGame.class.getResource("hero1.png"));
URL musicPath = ShootGame.class.getResource("game_music.wav");
music = Applet.newAudioClip(musicPath);
} catch (Exception e) {
e.printStackTrace();
}
}
public static FlyingObject nextOne() {
Random rand = new Random();
int type = rand.nextInt(20); // 生成0到19的随机数
if (type == 0) { // 随机数为0,返回bee;否则返回敌机
return new Bee();
} else {
return new Airplane();
}
}
int flyEnteredIndex = 0;
// 敌人登场
public void enterAction() {// 10毫秒走一次
flyEnteredIndex++; // 每10毫秒增1
if (flyEnteredIndex % 40 == 0) {
FlyingObject obj = nextOne();
flyings = Arrays.copyOf(flyings, flyings.length + 1);
flyings[flyings.length - 1] = obj;// 将敌人赋值给flyings数组的最后一个元素
}
}
public void stepAction() { // 10毫秒走一次
hero.step(); // 英雄机走一步
int num = time1 / 15;
for (int i = 0; i < flyings.length; i++) {
for(int j = 0; j <= num; j++) {
flyings[i].step(); // 敌人走一步
}
}
for (int i = 0; i < bullets.length; i++) {
for(int j = 0; j <= num/2; j++) {
bullets[i].step(); // 子弹走一步
}
}
}
int shootIndex = 0;
public void shootAction() { // 10毫秒走一次
shootIndex++; // 每10毫秒增1
if (shootIndex % 30 == 0) { // 300毫秒发射一次子弹
Bullet[] bs = hero.shoot();// 获取子弹对象
bullets = Arrays.copyOf(bullets, bullets.length + bs.length);
System.arraycopy(bs, 0, bullets, bullets.length - bs.length, bs.length);
}
}
// 删除越界飞行物
public void outOfBoundsAction() {
int index = 0;
FlyingObject[] flyingLives = new FlyingObject[flyings.length];
for (int i = 0; i < flyings.length; i++) {
FlyingObject f = flyings[i];
if (!f.outOfBounds()) {
flyingLives[index] = f;// 不越界,将其装入flyingLives[]数组中
index++;
}
}
flyings = Arrays.copyOf(flyingLives, index);
index = 0;
Bullet[] bulletsLives = new Bullet[bullets.length];
for (int i = 0; i < bullets.length; i++) {
Bullet bs = bullets[i];
if (!bs.outOfBounds()) {
bulletsLives[index] = bs;// 不越界,将其装入flyingLives[]数组中
index++;
}
}
bullets = Arrays.copyOf(bulletsLives, index);
}
int score = 0; // 得分
static double time = 0.00;//时间
static int time1 = 0;
// 所有子弹与所有敌人撞
public void bangAction() {
for (int i = 0; i < bullets.length; i++) {
bang(bullets[i]);
}
}
// 一个子弹与所有敌人撞
public void bang(Bullet b) {
int index = -1;// 被撞敌人的索引
for (int i = 0; i < flyings.length; i++) {// 遍历所有的敌人
if (flyings[i].shootBy(b)) {// 判断是否撞上
index = i; // 记录被撞敌人的索引
break;
}
}
if (index != -1) {// 撞上了
FlyingObject one = flyings[index];
if (one instanceof Enemy) {
Enemy e = (Enemy) one;
score += e.getScore();
}
if (one instanceof Award) {
Award a = (Award) one;
int type = a.getType();
switch (type) {
case Award.DOUBLE_FIRE: // 奖励活力值
hero.addDoubleFire(); // 英雄机增加火力
break;
case Award.LIFE: // 奖励命
hero.addLife(); // 英雄机增命
break;
}
}
// 被撞敌人与flyings数组中的最后一个元素交换
FlyingObject t = flyings[index];
flyings[index] = flyings[flyings.length - 1];
flyings[flyings.length - 1] = t;
// 缩容,删除随后一个元素---即被撞的对象
flyings = Arrays.copyOf(flyings, flyings.length - 1);
}
}
public void checkGameOverAction() {
if (isGameOver()) { // 结束游戏
state = GAME_OVER;
time1 = 0;
time = 0;
}
}
public boolean isGameOver() {
for (int i = 0; i < flyings.length; i++) { // 撞上了,
if (hero.hit(flyings[i])) {
hero.subtractLife(); // 生命减1
hero.setDoubleFire(0); // 火力值清零
// 相撞之后,交换缩容
FlyingObject t = flyings[i];
flyings[i] = flyings[flyings.length - 1];
flyings[flyings.length - 1] = t;
flyings = Arrays.copyOf(flyings, flyings.length - 1);
}
}
return hero.getLife() <= 0; // 英雄机的命<=0,游戏结束
}
// 启动执行代码
public void action() {
MouseAdapter l = new MouseAdapter() {
public void mouseMoved(MouseEvent e) {
if (state == RUNNING) { // 运行状态下执行
int x = e.getX(); // 鼠标Y坐标
int y = e.getY(); // 鼠标X坐标
hero.moveTo(x, y); // 英雄机随着鼠标移动而移动
}
}
// 鼠标的点击事件
public void mouseClicked(MouseEvent e) {
switch (state) {
case PAUSE:
state = RUNNING;
music.stop();
music.loop();
break;
case RUNNING:
state = PAUSE;
music.stop();
break;
case START:
state = RUNNING;
music.stop();
music.loop();
break;
case GAME_OVER:
hero = new Hero();// 清理现场
flyings = new FlyingObject[0];
bullets = new Bullet[0];
score = 0;
state = START;
music.stop();
break;
}
}
public void mouseEntered(MouseEvent e) {
if (state == PAUSE) {
state = RUNNING;
}
}
public void mouseExited(MouseEvent e) {
if (state == RUNNING) {
state = PAUSE;
}
}
};
this.addMouseListener(l); // 处理鼠标操作事件
this.addMouseMotionListener(l);// 处理鼠标移动事件
timer = new Timer(); // 创建定时器对象
timer.schedule(new TimerTask() {
public void run() { // 定时干的那个事--10毫秒走一次
if (state == RUNNING) { // 运行状态下执行
enterAction();
stepAction();// 飞行物走一步
shootAction();// 子弹入场
outOfBoundsAction();// 删除越界飞行物
bangAction(); // 子弹与敌人撞
没有合适的资源?快使用搜索试试~ 我知道了~
基于Java的飞机大战游戏的设计与实现
共43个文件
png:18个
class:10个
java:8个
需积分: 1 0 下载量 105 浏览量
2024-05-15
23:38:53
上传
评论
收藏 3.97MB ZIP 举报
温馨提示
现如今,随着智能手机的兴起与普及,加上5G网络的深入,越来越多的IT行业开始向手机行业转移重心。而手机行业中游戏方面的利润所占比重较大,并且手机游戏大多数则是由Java语言开发研制的。所以我想顺应时代发展,用学到的Java知识对游戏进行一次深入的了解与创作。 Java语言在我们大学学习中占了很大的比重,其优点甚多:面向对象,可靠,安全,多平台可移植,高性能,多线程等。面向对象是相对于c语言的面向过程来说的,在面向对象编程中,我们用Java去新建一个对象,调用其方法就能实现我们的目标,并不需要了解这个对象的方法的具体实现过程;Java的可靠安全特点体现Java不支持指针,禁止第三方访问,杜绝了外部风险。所以使用Java开发游戏,是一个正确的选择
资源推荐
资源详情
资源评论
收起资源包目录
飞机大战.zip (43个子文件)
飞机大战
.classpath 301B
.settings
org.eclipse.jdt.core.prefs 598B
src
main
FlyingObject.java 699B
Airplane.java 645B
Hero.java 2KB
airplane.png 3KB
Bullet.java 445B
gameover.png 20KB
Bee.java 868B
hero0.png 12KB
icon.jpg 115KB
hero1.png 16KB
background.png 26KB
game_music.wav 1.99MB
bullet.png 408B
start.png 30KB
ShootGame.java 10KB
pause.png 15KB
Enemy.java 83B
Award.java 213B
bee.png 9KB
bin
main
Bullet.class 820B
ShootGame$1.class 2KB
Award.class 203B
Airplane.class 1004B
Enemy.class 121B
airplane.png 3KB
Hero.class 2KB
gameover.png 20KB
hero0.png 12KB
icon.jpg 115KB
hero1.png 16KB
background.png 26KB
ShootGame.class 9KB
game_music.wav 1.99MB
ShootGame$2.class 917B
bullet.png 408B
start.png 30KB
pause.png 15KB
FlyingObject.class 840B
bee.png 9KB
Bee.class 1KB
.project 391B
共 43 条
- 1
资源评论
ShaZiJ
- 粉丝: 756
- 资源: 54
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Annotations_Train_abstract_v002.zip
- ap5030dn-openwrt-ath79-generic-huawei-ap5030dn-initramfs-kernel
- 华为AP无线接入控制器学习资料
- 金铲铲S13双城之战自动拿牌助手2.0
- Sigrity Power SI 仿真分析教程与实例分析.rar
- 基于Vue和JavaScript的掌上生活超市小程序配送解决方案设计源码
- 基于Java和安卓基础知识的简易记事本设计源码
- 基于SaToken轻量级Java权限认证的XrSaTokenVue Vue设计源码
- 基于Java语言的RxTool设计源码集合
- PHP性能检测扩展XHProf与FirePHP线上调试工具详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功