package com.shoot;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
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;
//测试类
public class ShootGame extends JPanel {
//窗口高
public static final int WIDTH = 400;
public static final int HEIGHT = 654;
public static final int GAME_OVER=3;//游戏结束状态
public static final int START=0;//游戏开始状态
public static final int PAUSE=2;//游戏暂停状态
public static final int RUNING=1;//游戏结束状态
private int state=0;//当前状态
public static BufferedImage backgroud;//背景图
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图
private Hero hero = new Hero();
private FlyingObject[] flyings = {};
private Bullet[] bullets = {};
/*
ShootGame() {
flyings = new FlyingObject[2];//敌机,小蜜蜂
flyings[0] = new Airplane();
flyings[1] = new Bee();
bullets = new Bullet[1];
bullets[0] = new Bullet(130, 110);
}
*/
/*生成敌人,小蜜蜂*/
public static FlyingObject nextOne() {
Random rand = new Random();
int type = rand.nextInt(20);//0-19之间的随机数
//控制小蜜蜂数量
if (type == 0) {
return new Bee();
} else {
return new Airplane();
}
}
//入场计数 int indxe=1++,使用index控制敌机数量,每400ms产生一架
int flyEnteredIndex = 0;
static {//静态初始化资源
try {
backgroud = ImageIO.read(ShootGame.class.getResource("background.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"));
} catch (IOException e) {
e.printStackTrace();
}
}
/*敌人入场*/
public void enterAction() {
//将敌机放入flying数组
flyEnteredIndex++;
if (flyEnteredIndex % 40 == 0) {//每400毫秒产生一个敌人
FlyingObject obj = nextOne();
flyings = Arrays.copyOf(flyings, flyings.length + 1);//扩容
flyings[flyings.length - 1] = obj;//将敌人赋值给flyings最后一个元素
}
}
//飞行物走步
public void stepAction() {
hero.step();
//敌人走步
for (int i = 0; i < flyings.length; i++) {
flyings[i].step();//敌人走一步
}
//子弹走步
for (int i = 0; i < bullets.length; i++) {
bullets[i].step();//子弹走一步
}
}
/*英雄机发射子弹*/
int shootindex = 0;
public void shootAction() {
shootindex++;
if (shootindex % 30 == 0) {//每300ms走一次
//创建子弹对象,添加到bullets数组中
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;
index++;
}
}
flyings=Arrays.copyOf(flyingLives,index);
//System.out.println(flyings.length);
//子弹越界
index=0;
Bullet[] bulletLives=new Bullet[bullets.length];
for(int i=0;i<bullets.length;i++){
Bullet b=bullets[i];
if (!b.outOfBounds()){
bulletLives[index]=b;
index++;
}
}
bullets=Arrays.copyOf(bulletLives,index);
}
//检查游戏结束
public void checkGameOver(){
if(isGameOver()){
state=GAME_OVER;
}
}
/*判断游戏是否结束*/
public boolean isGameOver(){
for(int i=0;i<flyings.length;i++)
{
FlyingObject f = flyings[i];
if(hero.hit(f)){
hero.subtractLift();//英雄机-life;
//火力清零
hero.setDoubleFire(0);
//删除被撞敌人
FlyingObject temp=flyings[i];
flyings[i]=flyings[flyings.length-1];
flyings[flyings.length-1]=temp;
//缩容
flyings=Arrays.copyOf(flyings,flyings.length-1);
}
}
return hero.getLife()<=0;
}
/*启动执行action*/
public void action() {
//监听器对象
MouseAdapter l=new MouseAdapter() {
@Override
//重写鼠标移动方法
public void mouseMoved(MouseEvent e) {//监听器对象
if(state==RUNING){//只有运行 时可以控制
int x=e.getX();
int y=e.getY();
hero.moveTo(x,y);
}
}
//重写鼠标点击事件
public void mouseClicked(MouseEvent e){
switch (state){
case START:
state=RUNING;
break;
case GAME_OVER:
state=START;
break;
}
}
public void mouseExited(MouseEvent e){
if(state==RUNING){
state=PAUSE;
}
}
public void mouseEntered(MouseEvent e){
if(state==PAUSE){
state=RUNING;
}
}
};
this.addMouseListener(l);//处理鼠标操作事件
this.addMouseMotionListener(l);//处理鼠标滑动事件
Timer timer = new Timer();//定时器
int intervel = 10;
timer.schedule(new TimerTask() {
@Override
public void run() {//每10ms运行一次
if(state==RUNING) {
//只有运行状态能动
enterAction(); //敌人入场
stepAction();//飞行物
shootAction();//子弹
outOfBoundsAction();//删除越界飞行物
bangAction();//子弹碰撞
checkGameOver();//检查游戏结束
}
repaint();//重画
}
}, intervel, intervel);
}
int score=0;//玩家得分
/*所有子弹撞*/
public void bangAction(){
for (int i=0;i<bullets.length;i++)
{
Bullet b=bullets[i];//获取每一个子弹
bang(b);//碰撞
}
}
/*一颗子弹与敌人的碰撞*/
public void bang(Bullet b){
int index=-1;//被撞敌人下标,-1表示没撞上
for(int i=0;i<flyings.length;i++)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
飞机大战的需求: 1.游戏可以产生: 小敌机/大敌机/小蜜蜂 -> 随机(概率)产生 2.跟鼠标相关的操作: a.自己的飞机移动 b.点击开始游戏 c.鼠标移出窗口,游戏暂停 d.鼠标进入窗口,游戏继续 3.子弹打中小敌机: 分数 + 5 4.子弹打中大敌机: 分数 + 50,奖励(双倍火力,生命值加成) - 接口 5.子弹打中小蜜蜂: 奖励(双倍火力,生命值加成) API(application programming Interface): 应用程序接口 帮助文档 Scanner System -> java.lang Arrays -> java.utils Math -> java.lang 构造方法 方法 具体步骤: 1.创建窗口对象 2.创建画板对象 3.类的设计 - 确定类中目前需要的成员变量和成员方法 4.成员方法目前只有一个 - move(), 研究不同类的移动方式 5.创建类需要不同的构造方法 - 初始化成员变量 a.加载(读取)图片 -> static{} -> 静态代码块,需要静态成员变量 b.获取父类中的成员变量
资源推荐
资源详情
资源评论
收起资源包目录
shoot.zip (49个子文件)
shoot
feijidazhan.iml 433B
src
com
shoot
ShootGame.java 11KB
gameover.png 20KB
Airplane.java 643B
Enemy.java 97B
background.png 26KB
Bullet.java 536B
airplane.png 3KB
bullet.png 408B
hero1.png 16KB
Hero.java 2KB
hero0.png 12KB
Award.java 196B
bee.png 6KB
start.png 8KB
pause.png 15KB
FlyingObject.java 756B
Bee.java 889B
.idea
misc.xml 239B
modules.xml 269B
workspace.xml 3KB
.gitignore 190B
out
production
shoot
com
shoot
gameover.png 20KB
background.png 26KB
airplane.png 3KB
bullet.png 408B
hero1.png 16KB
hero0.png 12KB
bee.png 6KB
pause.png 15KB
feijidazhan
com
shoot
Airplane.class 1KB
ShootGame$1.class 1KB
gameover.png 20KB
FlyingObject.class 867B
background.png 26KB
airplane.png 3KB
bullet.png 408B
ShootGame$2.class 870B
Bullet.class 921B
hero1.png 16KB
Enemy.class 126B
hero0.png 12KB
bee.png 6KB
start.png 8KB
pause.png 15KB
Bee.class 1KB
ShootGame.class 8KB
Award.class 208B
Hero.class 2KB
共 49 条
- 1
资源评论
会helloworld
- 粉丝: 4
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功