【实例简介】

【实例截图】

【核心代码】

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.arraycopy(bs, 0, bullets, bullets.length - bs.length,

bs.length); // 追加数组

}

}

/** 子弹与飞行物碰撞检测 */

public void bangAction() {

for (int i = 0; i < bullets.length; i ) { // 遍历所有子弹

Bullet b = bullets[i];

bang(b);

}

}

/** 删除越界飞行物及子弹 */

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; // 不越界的留着

}

}

flyings = Arrays.copyOf(flyingLives, index); // 将不越界的飞行物都留着

index = 0; // 重置为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;

}

}

bullets = Arrays.copyOf(bulletLives, index); // 将不越界的子弹留着

}

/** 检查游戏结束 */

public void checkGameOverAction() {

if (isGameOver()) {

state = GAME_OVER; // 改变状态

}

}

/** 检查游戏是否结束 */

public boolean isGameOver() {

int index = -1;

for (int i = 0; i < flyings.length; i ) {

FlyingObject obj = flyings[i];

if (hero.hit(obj)) { // 检查英雄机与飞行物是否碰撞

hero.subtractLife();

hero.setDoubleFire(0);

index = i;

Ember ember = new Ember(hero);

embers = Arrays.copyOf(embers, embers.length 1);

embers[embers.length-1]=ember;

}

}

if(index!=-1){

FlyingObject t = flyings[index];

flyings[index] = flyings[flyings.length-1];

flyings[flyings.length-1] = t;

flyings = Arrays.copyOf(flyings, flyings.length-1);

Ember ember = new Ember(t);

embers = Arrays.copyOf(embers, embers.length 1);

embers[embers.length-1]=ember;

}

return hero.getLife() <= 0;

}

/** 子弹和飞行物之间的碰撞检查 */

public void bang(Bullet bullet) {

int index = -1; // 击中的飞行物索引

for (int i = 0; i < flyings.length; i ) {

FlyingObject obj = flyings[i];

if (obj.shootBy(bullet)) { // 判断是否击中

index = i; // 记录被击中的飞行物的索引

break;

}

}

if (index != -1) { // 有击中的飞行物

FlyingObject one = flyings[index]; // 记录被击中的飞行物

FlyingObject temp = flyings[index]; // 被击中的飞行物与最后一个飞行物交换

flyings[index] = flyings[flyings.length - 1];

flyings[flyings.length - 1] = temp;

flyings = Arrays.copyOf(flyings, flyings.length - 1); // 删除最后一个飞行物(即被击中的)

// 检查one的类型 如果是敌人, 就算分

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;

}

}

//飞行物变成灰烬

Ember ember = new Ember(one);

embers = Arrays.copyOf(embers, embers.length 1);

embers[embers.length-1]=ember;

}

}

/**

* 随机生成飞行物

*

* @return 飞行物对象

*/

public static FlyingObject nextOne() {

Random random = new Random();

int type = random.nextInt(20); // [0,4)

if (type==0) {

return new Bee();

}else if(type<=2){

return new BigPlane();

}else{

return new Airplane();

}

}

}

飞机大战java_java 射击游戏(飞机大战)相关推荐

  1. 太空射击unity工程素材文件 飞机大战 飞行射击游戏源码(C#,Unity2019.2.4f1)素材+源码 最新写的,demo简单版本

    飞机大战素材 太空大战unity工程文件 飞行射击游戏源码(C#,Unity2019.2.4f1)素材+源码 最新写的,demo简单版本 希望能对初学者提供帮助,代码根据教材以及out了的代码更新了, ...

  2. 坦克大战java_Java课程设计——坦克大战

    坦克大战--坦克类 一. 团队课程设计博客链接 二.个人负责模块和任务说明 模块:坦克类(玩家坦克类+电脑坦克类),代码整合 三.代码的提交记录截图 四.负责模块和任务详细说明 玩家坦克继承Visib ...

  3. 视频教程-Cocos2d-x 3.x项目实战:星空大战(射击类游戏)-Cocos

    Cocos2d-x 3.x项目实战:星空大战(射击类游戏) 东北大学计算机专业硕士研究生,欧瑞科技创始人&CEO,曾任国内著名软件公司项目经理,畅销书作者,企业IT内训讲师,CSDN学院专家讲 ...

  4. Cocos2d-x 3.x项目实战:星空大战(射击类游戏)-李宁-专题视频课程

    Cocos2d-x 3.x项目实战:星空大战(射击类游戏)-17683人已学习 课程介绍         本课程是<从零开始掌握Cocos2d-x 3.0(基于3.0正式版) >课程配套的 ...

  5. java植物大战僵尸_植物大战僵尸java游戏

    [实例简介] 植物大战僵尸java游戏植物大战僵尸java游戏植物大战僵尸java游戏 [实例截图] [核心代码] baisixue19870221_10036231 └── 植物大战僵尸 ├── p ...

  6. 用python的tkinter做游戏(七)—— 双人射击游戏Demo(类的应用) 篇

    不知不觉这已经是第七篇文章了,今天来谈谈python中类(class)在游戏中的应用. 老规矩,先展现一下之前的几篇博文: 用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 用pytho ...

  7. 《飞机大战》安卓游戏开发源码(三)

    为什么80%的码农都做不了架构师?>>>    本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处:http://www.pm-road.com/index.php/2014/1 ...

  8. c语言小程序飞机大战,飞机大战微信小游戏:经典像素飞机大战小程序,点开即玩...

    50000+游戏爱好者已加入我们! 每天推荐好玩游戏! 关注我们,沐沐带你发现好游戏! <经典像素飞机大战>游戏小程序好玩吗? <经典像素飞机大战>小游戏怎么玩? 怎么进入&l ...

  9. JAVA 实现《飞机大战-II》游戏

    前言 <飞机大战-II>是一款融合了街机.竞技等多种元素的经典射击手游.华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺素爆棚,给你带来全方位震撼感受,体验飞行战斗的无限乐趣. ...

最新文章

  1. redis安装步骤(单机配置)
  2. skywalking链路追踪在微服务架构中的使用
  3. matlab保存变量的值,怎么不能保存之前的变量值?求解
  4. 第五人格pcmac_第五人格:未上线,勘探员已经让庄园内的CP乱了分寸,祭司最绝...
  5. nodejs unhandledPromiseRejectionWarning警告信息
  6. 数学课本上的几大变态
  7. jitter 如何优化网络_网络推广如何做好网站SEO优化
  8. [UE4]报错:Material with missing usage flag was applied to skeletal mesh 的解决方法:为材质设置相应的 usage flag
  9. snmp有android代理端吗,GitHub - wosika/SNMP4Android: 简易使用于安卓的SNMP工具类,基于snmp4j...
  10. 音乐社交APP源码 V1.1
  11. 推荐系统项目实战-电影推荐系统
  12. wps删除第二页页眉
  13. 三维模型的泰森多面体离散
  14. 新冠状病毒死亡率问题
  15. python爬虫:爬取酷狗音乐榜单中的音乐信息并存储到MySQL(附源码)
  16. 学机械 计算机,机械设计制造专业
  17. Google I/O 2014? No,Android I/O 2014
  18. django rest framework学习准备,面向对象中类的使用。
  19. Linux中RPM软件包和YUM软件仓库的介绍和使用
  20. python里output是什么意思_python-Python Input and Output

热门文章

  1. python 数据交互_Python用户交互以及数据类型
  2. Drupal 6 主题制作指南
  3. SMALE 实验室投稿期刊选择
  4. arduino处理中频信号_接收机的中频处理技术
  5. magnum 命令使用说明
  6. RISC-V架构解析
  7. RISC架构与CISC架构对比
  8. 如何通过路由器查看宽带的密码(多图预警)
  9. python-双均线系统-参数优化
  10. 2012 比较全的工资待遇搜集