package com.tarena.shoot;
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.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ShootGame extends JPanel {
public static final int WIDTH = 400; // 面板宽
public static final int HEIGHT = 654; // 面板高
/** 游戏的当前状态: START RUNNING PAUSE GAME_OVER */
private int state;
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 score = 0; // 得分
private Timer timer; // 定时器
private int intervel = 1000/100; // 时间间隔(毫秒)
public static BufferedImage background;
public static BufferedImage start;
public static BufferedImage pause;
public static BufferedImage gameover;
public static BufferedImage bullet;
public static BufferedImage airplane;
public static BufferedImage[] airplaneEmber=new BufferedImage[4];
public static BufferedImage bee;
public static BufferedImage[] beeEmber=new BufferedImage[4];;
public static BufferedImage hero0;
public static BufferedImage hero1;
public static BufferedImage[] heroEmber=new BufferedImage[4];;
public static BufferedImage bigPlane;
public static BufferedImage[] bigPlaneEmber=new BufferedImage[4];;
private FlyingObject[] flyings = {}; // 敌机数组
private Bullet[] bullets = {}; // 子弹数组
private Hero hero = new Hero(); // 英雄机
private Ember[] embers = {}; // 灰烬
static {// 静态代码块
try {
background = ImageIO.read(ShootGame.class
.getResource("background.png"));
bigPlane = ImageIO
.read(ShootGame.class.getResource("bigplane.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"));
pause = ImageIO.read(ShootGame.class.getResource("pause.png"));
gameover = ImageIO
.read(ShootGame.class.getResource("gameover.png"));
start = ImageIO
.read(ShootGame.class.getResource("start.png"));
for(int i=0; i<4; i++){
beeEmber[i] = ImageIO.read(
ShootGame.class.getResource("bee_ember"+i+".png"));
airplaneEmber[i] = ImageIO.read(
ShootGame.class.getResource("airplane_ember"+i+".png"));
bigPlaneEmber[i] = ImageIO.read(
ShootGame.class.getResource("bigplane_ember"+i+".png"));
heroEmber[i] = ImageIO.read(
ShootGame.class.getResource("hero_ember"+i+".png"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void paint(Graphics g) {
g.drawImage(background, 0, 0, null); // 画背景图
paintEmber(g);
paintHero(g); // 画英雄机
paintBullets(g); // 画子弹
paintFlyingObjects(g); // 画飞行物
paintScore(g); // 画分数
paintState(g); // 画游戏状态
}
/** 画英雄机 */
public void paintHero(Graphics g) {
g.drawImage(hero.getImage(), hero.getX(), hero.getY(), null);
}
public void paintEmber(Graphics g) {
for (int i = 0; i < embers.length; i++) {
Ember e = embers[i];
g.drawImage(e.getImage(), e.getX(), e.getY(), null);
}
}
/** 画子弹 */
public void paintBullets(Graphics g) {
for (int i = 0; i < bullets.length; i++) {
Bullet b = bullets[i];
if(! b.isBomb())
g.drawImage(b.getImage(), b.getX() - b.getWidth() / 2, b.getY(),
null);
}
}
/** 画飞行物 */
public void paintFlyingObjects(Graphics g) {
for (int i = 0; i < flyings.length; i++) {
FlyingObject f = flyings[i];
g.drawImage(f.getImage(), f.getX(), f.getY(), null);
}
}
/** 画分数 */
public void paintScore(Graphics g) {
int x = 10;
int y = 25;
Font font = new Font(Font.SANS_SERIF,Font.BOLD, 14);
g.setColor(new Color(0x3A3B3B));
g.setFont(font); // 设置字体
g.drawString("SCORE:" + score, x, y); // 画分数
y+=20;
g.drawString("LIFE:" + hero.getLife(), x, y);
}
/** 画游戏状态 */
public void paintState(Graphics g) {
switch (state) {
case START:
g.drawImage(start, 0, 0, null);
break;
case PAUSE:
g.drawImage(pause, 0, 0, null);
break;
case GAME_OVER:
g.drawImage(gameover, 0, 0, null);
break;
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Shoot Game");
ShootGame game = new ShootGame(); // 面板对象
frame.add(game); // 将面板添加到JFrame中
frame.setSize(WIDTH, HEIGHT); // 大小
frame.setAlwaysOnTop(true); // 其总在最上
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 默认关闭操作
frame.setIconImage(new ImageIcon("images/icon.jpg").getImage()); // 设置窗体的图标
frame.setLocationRelativeTo(null); // 设置窗体初始位置
frame.setVisible(true); // 尽快调用paint
game.action(); // 启动执行
}
public void action() { // 启动执行代码
// 鼠标监听事件
MouseAdapter l = new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) { // 鼠标移动
if (state == RUNNING) { // 运行时移动英雄机
int x = e.getX();
int y = e.getY();
hero.moveTo(x, y);
}
}
@Override
public void mouseEntered(MouseEvent e) { // 鼠标进入
if (state == PAUSE) { // 暂停时运行
state = RUNNING;
}
}
@Override
public void mouseExited(MouseEvent e) { // 鼠标退出
if (state != GAME_OVER) {
state = PAUSE; // 游戏未结束,则设置其为暂停
}
}
@Override
public void mouseClicked(MouseEvent e) { // 鼠标点击
switch (state) {
case START:
state = RUNNING;
break;
case GAME_OVER: // 游戏结束,清理现场
flyings = new FlyingObject[0];
bullets = new Bullet[0];
hero = new Hero();
score = 0;
state = START;
break;
}
}
};
this.addMouseListener(l); // 处理鼠标点击操作
this.addMouseMotionListener(l); // 处理鼠标滑动操作
timer = new Timer(); // 主流程控制
timer.schedule(new TimerTask() {
@Override
public void run() {
if (state == RUNNING) {
enterAction(); // 飞行物入场
stepAction(); // 走一步
shootAction(); // 射击
bangAction(); // 子弹打飞行物
outOfBoundsAction(); // 删除越界飞行物及子弹
checkGameOverAction(); // 检查游戏结束
emberAction();
}
repaint(); // 重绘,调用paint()方法
}
}, intervel, intervel);
}
private void emberAction() {
Ember[] live = new Ember[embers.length];
int index = 0;
for (int i = 0; i < embers.length; i++) {
Ember ember = embers[i];
if(! ember.burnDown()){
live[index++]=ember;
}
}
embers = Arrays.copyOf(live, index);
}
int flyEnteredIndex = 0; // 飞行物入场计数
/** 飞行物入场 */
public void enterAction() {
flyEnteredIndex++;
if (flyEnteredIndex % 40 == 0) { // 300毫秒--10*30
FlyingObject obj = nextOne(); // 随机生成一个飞行物
flyings = Arrays.copyOf(flyings, flyings.length + 1);
flyings[flyings.length - 1] = obj;
}
}
public void stepAction() {
/** 飞行物走一步 */
for (int i = 0; i < flyings.length; i++) { // 飞行物走一步
FlyingObject f = flyings[i];
f.step();
}
/** 子弹走一步 */
for (int i = 0; i < bullets.length; i++) {
Bullet b = bullets[i];
b.step();
}
hero.step();
}
int shootIndex = 0; // 射击计数
/** 射击 */
public void shootAction() {
shootIndex++;
if (shootIndex % 30 == 0) { // 100毫秒发一颗
Bullet[] bs = hero.shoot(); // 英雄打出子弹
bullets = Arrays.copyOf(bullets, bullets.length + bs.length); // 扩容
System.
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
飞机大战.zip (79个子文件)
Shooter
bin
com
tarena
shoot
Airplane.class 1KB
bee_ember0.png 6KB
bigplane.png 7KB
ShootGame$1.class 2KB
gameover.png 20KB
bee_ember2.png 6KB
bigplane_ember1.png 8KB
airplane_ember1.png 3KB
bigplane_ember0.png 8KB
FlyingObject.class 2KB
hero_ember0.png 17KB
background.png 26KB
airplane_ember3.png 1KB
airplane_ember0.png 3KB
airplane.png 3KB
bullet.png 408B
ShootGame$2.class 942B
hero_ember1.png 18KB
Ember.class 1KB
Bullet.class 929B
hero1.png 16KB
Enemy.class 133B
hero0.png 12KB
BigPlane.class 1KB
bee_ember3.png 6KB
bee.png 6KB
start.png 42KB
pause.png 15KB
Bee.class 1KB
ShootGame.class 11KB
bigplane_ember2.png 10KB
hero_ember3.png 6KB
bigplane_ember3.png 3KB
Award.class 215B
airplane_ember2.png 4KB
Hero.class 3KB
hero_ember2.png 20KB
bee_ember1.png 6KB
.settings
org.eclipse.jdt.core.prefs 629B
src
com
tarena
shoot
ShootGame.java 11KB
bee_ember0.png 6KB
bigplane.png 7KB
gameover.png 20KB
bee_ember2.png 6KB
bigplane_ember1.png 8KB
Ember.java 763B
BigPlane.java 1KB
airplane_ember1.png 3KB
Airplane.java 653B
bigplane_ember0.png 8KB
Enemy.java 122B
hero_ember0.png 17KB
background.png 26KB
Bullet.java 517B
airplane_ember3.png 1KB
airplane_ember0.png 3KB
airplane.png 3KB
bullet.png 408B
hero_ember1.png 18KB
hero1.png 16KB
Hero.java 2KB
hero0.png 12KB
Award.java 187B
bee_ember3.png 6KB
bee.png 6KB
start.png 42KB
pause.png 15KB
FlyingObject.java 2KB
bigplane_ember2.png 10KB
hero_ember3.png 6KB
bigplane_ember3.png 3KB
Bee.java 797B
airplane_ember2.png 4KB
hero_ember2.png 20KB
bee_ember1.png 6KB
.project 383B
.classpath 301B
run.bat 47B
shooter.jar 282KB
共 79 条
- 1
资源评论
亮点菌
- 粉丝: 2w+
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功