[java]代码库package playPlane;

import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

import javax.swing.JFrame;

import javax.swing.JPanel;

import java.awt.Graphics;

import java.util.Random;

import java.util.Timer;

import java.util.TimerTask;

import java.util.Arrays;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.Color;

import java.awt.Font;

/** 主程序类 */

public class ShootGame extends JPanel {

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 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 = START; //当前状态(默认为启动状态)

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"));

}catch(Exception e){

e.printStackTrace();

}

}

private Hero hero = new Hero(); //英雄机对象

private FlyingObject[] flyings = {}; //敌人(敌机+小蜜蜂)数组对象

private Bullet[] bullets = {}; //子弹数组对象

/** 生成敌人(敌机+小蜜蜂)对象 */

public FlyingObject nextOne(){

Random rand = new Random(); //随机数对象

int type = rand.nextInt(20); //生成0到19之间的随机数

if(type < 4){ //若为0则返回小蜜蜂对象

return new Bee();

}else{ //若为1到19则返回敌机对象

return new Airplane();

}

}

int flyEnteredIndex = 0; //敌人入场计数

/** 敌人(敌机+小蜜蜂)入场 */

public void enterAction(){ //10毫秒走一次

flyEnteredIndex++; //每10毫秒增1次

if(flyEnteredIndex%40==0){ //400(10*40)毫秒走一次

FlyingObject obj = nextOne(); //获取敌人(敌机+小蜜蜂)对象

flyings = Arrays.copyOf(flyings,flyings.length+1); //扩容

flyings[flyings.length-1] = obj; //将敌人对象赋值给flyings数组的最后一个元素

}

}

/** 飞行物(敌机+小蜜蜂+子弹+英雄机)走一步 */

public void stepAction(){ //10毫秒走一次

hero.step(); //英雄机走一步

for(int i=0;i

flyings[i].step(); //敌人走一步

}

for(int i=0;i

bullets[i].step(); //子弹走一步

}

}

int shootIndex = 0; //子弹入场计数

/** 子弹入场(英雄机发射子弹) */

public void shootAction(){ //10毫秒走一次

shootIndex++; //每10毫秒增1

if(shootIndex%30==0){ //300(10*30)毫秒走一次

Bullet[] bs = hero.shoot(); //获取子弹对象(由英雄机发射出来的)

bullets = Arrays.copyOf(bullets,bullets.length+bs.length); //扩容(bs有几个元素,就扩大几个容量)

System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length); //数组的追加(将bs数组追加到bullets数组末尾)

}

}

/** 删除越界的飞行物(敌机+小蜜蜂+子弹) */

public void outOfBoundsAction(){

int index = 0; //1.不越界敌人数组下标 2.不越界敌人个数

FlyingObject[] flyingLives = new FlyingObject[flyings.length]; //不越界敌人数组,初始长度即为flyings的长度

for(int i=0;i

FlyingObject f = flyings[i]; //获取每一个敌人

if(!f.outOfBounds()){ //若不越界

flyingLives[index] = f; //将不越界敌人对象添加到不越界敌人数组中

index++; //1.不越界数组下标增一 2.不越界敌人个数增一

}

}

flyings = Arrays.copyOf(flyingLives,index); //将不越界敌人数组复制到flyings中,flyings的长度为index

index = 0; //1.下标归零 2.不越界个数归零

Bullet[] bulletLives = new Bullet[bullets.length]; //不越界子弹数组,初始长度即为bullets的长度

for(int i=0;i

Bullet b = bullets[i]; //获取每一个子弹

if(!b.outOfBounds()){ //若不越界

bulletLives[index] = b; //将不越界子弹对象添加到不越界子弹数组中

index++; //1.不越界数组下标增一 2.不越界子弹个数增一

}

}

bullets = Arrays.copyOf(bulletLives,index); //将不越界子弹数组复制到bullets中,bullets的长度为index

}

/** 所有子弹与所有敌人(敌机+小蜜蜂)的碰撞 */

public void bangAction(){

for(int i=0;i

Bullet b = bullets[i]; //获取每一个子弹

bang(b); //一个子弹与所有敌人的碰撞

}

}

int score = 0; //玩家的得分

/** 一个子弹与所有敌人(敌机+小蜜蜂)的碰撞 */

public void bang(Bullet b){

int index = -1; //被撞敌人的下标

for(int i=0;i

FlyingObject f = flyings[i]; //获取每一个敌人

if(f.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;

}

}

//将被撞的敌人对象与数组中的最后一个元素交换

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; //修改当前状态为游戏结束状态

}

}

/** 判断游戏是否结束 返回true表示游戏结束 */

public boolean isGameOver(){

for(int i=0;i

FlyingObject f = flyings[i]; //获取每一个敌人

if(hero.hit(f)){ //撞上了

hero.subtractLife(); //英雄机减命

hero.clearDoubleFire(); //英雄机清空火力值

//将被撞的敌人对象与数组中的最后一个元素交换

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(); //鼠标的x坐标

int y = e.getY(); //鼠标的y坐标

hero.moveTo(x, y); //英雄机随着鼠标动

}

}

/** 重写鼠标点击事件 */

public void mouseClicked(MouseEvent e){

switch(state){ //根据当前状态做不同操作

case START: //启动状态时

state=RUNNING; //当前状态变为运行状态

break;

case GAME_OVER: //游戏结束状态时

score = 0; //清理现场,数据归零

hero = new Hero();

flyings = new FlyingObject[0];

bullets = new Bullet[0];

state=START; //当前状态变为启动状态

break;

}

}

/** 重写鼠标移出事件 */

public void mouseExited(MouseEvent e){

if(state==RUNNING){ //运行状态时变为暂停状态

state=PAUSE;

}

}

/** 重写鼠标移入事件 */

public void mouseEntered(MouseEvent e){

if(state==PAUSE){ //暂停状态时变为运行状态

state=RUNNING;

}

}

};

this.addMouseListener(l); //处理鼠标操作事件

this.addMouseMotionListener(l); //处理鼠标滑动事件

Timer timer = new Timer(); //定时器对象

int intervel = 10; //定时的间隔(以毫秒为单位)

timer.schedule(new TimerTask(){

public void run(){ //定时干的那个事(10毫秒一次)

if(state==RUNNING){ //当前状态为运行状态时操作

enterAction(); //敌人(敌机+小蜜蜂)入场

stepAction(); //飞行物(敌机+小蜜蜂+子弹+英雄机)走一步

shootAction(); //子弹入场(英雄机发射子弹)

outOfBoundsAction(); //删除越界的飞行物(敌机+小蜜蜂+子弹)

bangAction(); //子弹与敌人(敌机+小蜜蜂)的碰撞

checkGameOverAction(); //检查游戏是否结束

}

repaint(); //重画(调用paint()方法)

}

},intervel,intervel); //定时计划

}

/** 重写paint() g:画笔 */

public void paint(Graphics g){

g.drawImage(background,0,0,null); //画背景图

paintHero(g); //画英雄机对象

paintFlyingObjects(g); //画敌人(敌机+小蜜蜂)对象

paintBullets(g); //画子弹对象

paintScoreAndLife(g); //画分和画命

paintState(g); //画状态

}

/** 画英雄机对象 */

public void paintHero(Graphics g){

g.drawImage(hero.image,hero.x,hero.y,null); //画英雄机对象

}

/** 画敌人(敌机+小蜜蜂)对象 */

public void paintFlyingObjects(Graphics g){

for(int i=0;i

FlyingObject f = flyings[i]; //获取每一个敌人(敌机+小蜜蜂)

g.drawImage(f.image,f.x,f.y,null); //画敌人(敌机+小蜜蜂)对象

}

}

/** 画子弹对象 */

public void paintBullets(Graphics g){

for(int i=0;i

Bullet b = bullets[i]; //获取每一个子弹

g.drawImage(b.image,b.x,b.y,null);

}

}

/** 画分和画命 */

public void paintScoreAndLife(Graphics g){

g.setColor(new Color(0xFF0000)); //设置颜色(纯红)

g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,24)); //设置字体样式(字体:SANS_SERIF 样式:BOLD加粗 字号:24)

g.drawString("SCORE: "+score,10,25); //画分

g.drawString("LIFE: "+hero.getLife(),10,45); //画命

}

/** 画状态 */

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("Fly"); //创建窗口对象

ShootGame game = new ShootGame(); //创建面板对象

frame.add(game); //将面板添加到窗口上

frame.setSize(WIDTH, HEIGHT); //设置窗口大小

frame.setAlwaysOnTop(true); //设置总是在最上面

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置默认关闭操作(关闭窗口中退出程序)

frame.setLocationRelativeTo(null); //设置窗口位置(居中)

frame.setVisible(true); //1.设置窗口可见 2.尽快调用paint()

game.action(); //启动程序的执行

}

}

[代码运行效果截图]

微信打飞机java 源代码_微信打飞机相关推荐

  1. 微信第三方扫描登录 java源代码_微信开放平台基于网站应用授权登录源码(java)...

    1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数: 2. 通过code参数加上AppID和AppSecret等,通过 ...

  2. 微信小程序 java 传值_微信小程序传值获取值的实例方法

    微信小程序传值以及获取值方法的详解 微信小程序传值以及获取值方法,传值有两种方法,对应也有获取值得方法, 1.设置id的方法标识跳转后传递的参数值: 2.通过使用data - xxxx 的方法来标识要 ...

  3. 微信小程序java服务_微信小程序访问webService(Java)

    在前台UI确认后,终于进入到后台服务的搭建及实现中.所及而来的问题就出现了,为了提高后台程序的可用性.设计初期决定,通过搭建java WebService实现.准备工作还是比较充分的,创建WebSer ...

  4. 微信公众平台java接口_微信公众平台自动消息接口(JAVA)

    一个小DEMO,通过发送地理位置,获取今明两天的气温情况. 代码部署在了OpenShift平台:地区定位以及天气服务由雅虎提供. 微信文档: http://mp.weixin.qq.com/cgi-b ...

  5. 微信投票系统java开发_微信投票系统 v3.0

    微信投票系统简介 微信投票系统软件是一个以php+MySQL进行开发的微信投票系统. 吸粉神器,微信图文投票系统,强大的微信投票系统,防作弊的微信投票系统. 微信投票系统安装步骤: 解压压缩包到根目录 ...

  6. 微信jssdk开发java版_微信jssdk

    class JSSDK { private $appId; private $appSecret; public function __construct($appId, $appSecret) { ...

  7. 微信用户绑定java实例_微信开放平台 帐号管理 绑定在同一个开放平台帐号下的公众号及小程序让用户unionid一致...

    第三方平台在获得此权限后,可以代替已授权的公众号/小程序创建开放平台帐号或进行绑定/解绑操作. 绑定在同一个开放平台帐号下的公众号及小程序,用户unionid一致.开发者可调用"获取用户基本 ...

  8. 微信回调 java_详解APP微信支付(java后台_统一下单和回调)

    1.微信配置信息 global.properties 2.方法wxpay用于生成预支付订单信息 方法notifyWeiXinPay用于微信支付成功后的回调, 注意: 在手机端使用微信支付成功后,微信服 ...

  9. 微信用户绑定java实例_第三方网站微信登录java代码实现

    前两个星期在公司中的项目加上了微信登录.绑定的功能,在这里做个记录! 一.开发前知识 1.微信开放平台与微信公众平台的区别 1.1 微信公众平台: ② 微信公众平台面向的是普通的用户,比如自媒体和媒体 ...

  10. APP微信支付(java后台_统一下单和回调)

    微信支付Java后台 1.微信配置信息 global.properties 2.方法wxpay用于生成预支付订单信息 方法notifyWeiXinPay用于微信支付成功后的回调, 注意: 在手机端使用 ...

最新文章

  1. java display html_css html布局之display属性_动力节点Java学院整理
  2. 历时3年,清华大学iDLab实验室打造《强化学习和控制》课程及讲义!
  3. Reddit 票选:2019 年绝对不能错过的机器学习论文
  4. Delphi之对象库(Object Repository)
  5. python自动发邮件运行正常就是收不到邮件是为什么_python stmp module 163邮箱发送邮件不成功...
  6. 简单点赞效果html,js实现点赞效果
  7. 论文浅尝 | 将结构预测作为增广自然语言间的翻译任务
  8. 自动化部署kvm虚拟机_自动化虚拟助手
  9. 吴恩达机器学习 11.聚类
  10. 炒股如果亏损一直买入可行吗
  11. 蓝桥杯 ADV-98 算法提高 约数个数
  12. 微信人脸识别-采集个人信息
  13. 小企业会计准则 ——主要账务处理和财务报表(2)
  14. Linux编辑grldr文件,使用syslinux完美引导GRLDR。
  15. Nvidia驱动负优化与GTX1070的测试
  16. 对啊英语音标---一、什么是字母的名称音和发音
  17. poj1321棋盘问题
  18. Android 8.1 应用安装过程总结
  19. R语言调色板——colors()
  20. HDU2188——悼念512汶川大地震遇难同胞——选拔志愿者(Bash Game巴士博弈)(我去,名字肿么这么长)

热门文章

  1. 计算机校准颜色,显示器颜色校正,教您怎么校准显示器颜色
  2. Matlab中文注释乱码问题解决方案
  3. 计算机打印不了测试纸,XP打印机打印不了测试页如何解决|打印机打印不了测试页的原因...
  4. 模糊数学 计算机智能,吴国平:如果“模糊数学”没有出现,人工智能或许就无从谈起...
  5. 还找不到想要的文章吗?微信公众号搜索方法大全
  6. Modelsim下载安装【Verilog】
  7. Quartus 13.1和 Modelsim 安装
  8. Office 如何打印A4不干胶标签纸
  9. 将pycharm汉化
  10. garmone build on sb2