菜鸟日记—2月10日

案例 : 飞机大战

要求: 玩家可控制飞机躲避炮弹,界面显示玩家游玩时间

效果:

1.游戏物体根类

(飞机,炮弹等类都继承于此类)

import java.awt.*;/*
* 游戏物体的根类
* */public class GameObject {Image img;      //图片double x,y;     //物体的坐标int speed;      //物体移动的速度int width,height;       //物体的宽度和高度public GameObject(Image img, double x, double y, int speed, int width, int height) {this.img = img;this.x = x;this.y = y;this.speed = speed;this.width = width;this.height = height;}public GameObject(Image img, double x, double y, int speed) {this.img = img;this.x = x;this.y = y;this.speed = speed;this.width = img.getWidth(null);this.height = img.getHeight(null);}public GameObject(){}public void drawMyself(Graphics g){g.drawImage(img,(int)x,(int)y,width,height,null);}//碰撞检测器//所有的物体都是矩形。当你获得对应的矩形的时候,我们就可以做一些相关的判断的操作!public Rectangle  getRec(){return new Rectangle((int)x,(int)y,width,height);}}

2.飞机类

import java.awt.*;
import java.awt.event.KeyEvent;/*
* 飞机相关属性类
* */public class Plane extends GameObject{//移动方向boolean up,down,left,right;boolean live = true;  //活着@Overridepublic void drawMyself(Graphics g){//飞机飞行的算法,可自行设定//x += speed;//死了就不绘制飞机if (live){super.drawMyself(g);if (up){y -= speed;}if (down){y += speed;}if (left){x -= speed;}if (right){x += speed;}if (x >= 770){x = 760;}if (x <= 0){x = 10;}if (y >= 770){y = 760;}if (y <= 40){y = 40;}}}//按下按键public void addDirection(KeyEvent e){switch (e.getKeyCode()){case KeyEvent.VK_LEFT:left = true;break;case KeyEvent.VK_RIGHT:right = true;break;case KeyEvent.VK_UP:up = true;break;case KeyEvent.VK_DOWN:down = true;break;}}//抬起按键public void minusDirection(KeyEvent e){switch (e.getKeyCode()){case KeyEvent.VK_LEFT:left = false;break;case KeyEvent.VK_RIGHT:right = false;break;case KeyEvent.VK_UP:up = false;break;case KeyEvent.VK_DOWN:down = false;break;}}//此类继承了GameObject类除了构造器之外的所有东西,//所以构造器需要重新写public Plane(Image img, double x, double y, int speed, int width, int height){super(img,x,y,speed,width,height);}public Plane(Image img, double x, double y, int speed){super(img,x,y,speed);}}

2.常量类

/*
* 此类用于存放相关常量
* */public class Constant {//游戏窗口的宽度public static final int GAME_WIDTH = 800;//游戏窗口的高度public static final int GAME_HEIGHT = 800;
}

4.炮弹类

import java.awt.*;
/*
* 炮弹类
*
* degree : 炮弹飞行的角度
* width : 炮弹宽度
* height : 炮弹高度
* speed : 飞行速度
* */public class Shell extends GameObject{double degree;public Shell(){x = 350;y = 350;degree = Math.random() * Math.PI * 2;  //Math.random()生成0-1之间的随机数//Math.PI * 2表示360°,因此Math.random() * Math.PI * 2表示生成0-360之间的随机角度width = 12;height = 12;speed = 5;}@Overridepublic void drawMyself(Graphics g){//先保存原方法颜色Color c = g.getColor();//定义炮弹颜色g.setColor(Color.yellow);//绘制炮弹初始位置和大小g.fillOval((int)x,(int)y,width,height);//还原g.setColor(c);//根据自己算法指定移动的路径x += speed * Math.cos(degree);y += speed * Math.sin(degree);//碰到边界反弹if (x > Constant.GAME_WIDTH - this.width || x < 0){degree = Math.PI - degree;}if (y > Constant.GAME_HEIGHT - this.height || y < 40){degree = -degree;}}
}

5.爆炸类

import java.awt.*;/*
*  爆炸类
* */public class Explode {//位置double x,y;static Image[] imgs = new Image[16];int count;static {for (int i = 0;i < 16;i++){imgs[i] = Toolkit.getDefaultToolkit().getImage("images/Explode/e" + (i + 1) + ".gif");imgs[i].getWidth(null);}}public void drawMySelf(Graphics g){if (count < 16){g.drawImage(imgs[count],(int)x,(int)y,null);count++;}}public Explode(){}public Explode(double x, double y) {this.x = x;this.y = y;}
}

6.主程序

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;/*
*
*
* count : 绘画次数
* planeX : 飞机在X轴的初始位置
* planeY : 飞机在Y轴的初始位置
* fj : 飞机图片
* bg : 背景图片
* */public class MyGameFrame extends Frame {Image fj = Toolkit.getDefaultToolkit().getImage("images/fj4.jpg");Image bg = Toolkit.getDefaultToolkit().getImage("images/bg1.jpg");static int count = 0;//构造飞机对象Plane p1 = new Plane(fj,100,100,12,30,45);//构造炮弹对象数组Shell[] shells = new Shell[50];//爆炸Explode explode;Date start = new Date();     //游戏开始的时间Date end;       //游戏结束的时间(飞机死的那一刻)long period = 0;   //玩了多少秒//绘制窗口@Overridepublic void paint(Graphics g){count++;//System.out.println("窗口绘制了" + count + "次");//g当作是一支画笔g.drawImage(bg,0,0,800,800,null);//绘制飞机p1.drawMyself(g);//绘制时间drawTime(g);//绘制炮弹for (int i = 0;i < shells.length;i++){shells[i].drawMyself(g);//碰撞检测boolean peng = shells[i].getRec().intersects(p1.getRec());if (peng){//System.out.println("飞机被击中!!!");p1.live = false;//处理爆炸效果if (explode == null){explode = new Explode(p1.x,p1.y);}explode.drawMySelf(g);}}}//显示时间public void drawTime(Graphics g){Color c = g.getColor();Font f = g.getFont();g.setColor(Color.green);if (p1.live){//绘制坚持时间period = (System.currentTimeMillis()-start.getTime())/1000;g.drawString("坚持 : " + period + "s",30,50);}else {if(end==null) {end = new Date();period = (end.getTime()- start.getTime())/1000;}//绘制最终存活时间g.setColor(Color.red);g.setFont(new Font("微软雅黑",Font.BOLD,30));g.drawString("最终时间:"+period,200,200);}//还原g.setColor(c);g.setFont(f);}//创建窗口public void launchFrame(){this.setTitle("飞机大战--江郎才尽");  //标题setVisible(true);                 //窗口是否可见setLocation(600,300);      //窗口打开位置setSize(800,800);  //窗口大小//添加窗口关闭监听this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);     //正常退出程序}});new PaintThread().start();  //启动重画窗口的线程this.addKeyListener(new KeyMonitor());  //启动键盘监听//初始化创建50个炮弹for (int i = 0;i < shells.length;i++){shells[i] = new Shell();}}/** 定义了一个重画窗口的线程类* 定义成内部类是为了方便直接使用窗口类的相关方法* */class PaintThread extends Thread {@Overridepublic void run() {while (true){repaint();   //使窗口不断重新绘制,内部类可以直接使用外部类的成员//run是内部类,repaint是Frame的成员try {Thread.sleep(50);  //1s=1000ms,1000/50=20次} catch (InterruptedException e) {e.printStackTrace();}}}}//内部类,实现键盘的监听处理class KeyMonitor extends KeyAdapter{@Overridepublic void keyPressed(KeyEvent e){//System.out.println("按下" + e.getKeyCode());p1.addDirection(e);}@Overridepublic void keyReleased(KeyEvent e){//System.out.println("抬起" + e.getKeyCode());p1.minusDirection(e);}}//添加双缓冲去闪烁//双缓冲即在内存中创建一个与屏幕绘制区域一致的对象,先将图形绘制到内存中的这个对象上,// 再一次将这个对象上的图形拷贝到屏幕上,这样就能大大的加快绘图的速度(不用掌握,因为做这个飞机大战用的比较落后的awt技术,了解一下即可)private Image offScreenImage = null;public void update(Graphics g) {if(offScreenImage == null)offScreenImage = this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);//这是游戏窗口的宽度和高度Graphics gOff = offScreenImage.getGraphics();paint(gOff);g.drawImage(offScreenImage, 0, 0, null);}public static void main(String[] args) {MyGameFrame gameFrame = new MyGameFrame();gameFrame.launchFrame();}
}

终于肝完了!!!

飞机大战--java相关推荐

  1. proj Java_proj 一个炫酷的飞机大战java游戏,很好玩的,很酷炫 用了 的图形界面 Games 256万源代码下载- www.pudn.com...

    文件名称: proj下载  收藏√  [ 5  4  3  2  1 ] 所属分类: Games 开发工具: Java 文件大小: 3435 KB 上传时间: 2016-05-11 下载次数: 0 提 ...

  2. 飞机大战——Java小游戏

    飞机大战 文章目录 飞机大战 游戏需求 代码实现 子弹类 英雄机类 小敌机类 大敌机类 小蜜蜂类 飞行物类 接口类 爆炸类 游戏窗口类 游戏需求 所参与角色:英雄机.子弹.小敌机.大敌机.小蜜蜂.天空 ...

  3. 飞机大战Java源代码

    很快,大二这个学期就要完结了,所学的大部分课程都快要结束了,Java课程也是如此.而Java这门课程也有一个惯例就是要做一个课程设计,老师给了我们三个选择,分别是飞机大战.推箱子和学生成绩管理系统.在 ...

  4. 全民飞机大战(java)

    目录 一.需求 二.窗体.面板.背景图的绘制 2.1  工具类 2.2  面板类 2.3  窗体类 2.4  效果图 三.英雄机的出现及移动 3.1  定义飞行父类 3.2  英雄机的出现 3.3  ...

  5. 飞机大战java代码_[源码和文档分享]Java飞机大战游戏设计与实现

    1 概述 1.1 项目简介 本次Java课程设计是做一个飞机大战的游戏,应用Swing编程,完成一个界面简洁流畅.游戏方式简单,玩起来易于上手的桌面游戏.该飞机大战项目运用的主要技术即是Swing编程 ...

  6. 全民飞机大战Java(搬)

    第一步,首先创建一个窗体 package ui; import javax.swing.JFrame; /** * 自定义窗体类的步骤: * 1.写一个类,继承JFrame,在类名后面加extends ...

  7. 飞机大战Java版完整版

    这是一款闯关的射击游戏,人物在不同的关 卡里面会触发不同的技能与对应的特效操作,有三个关卡与四个随机事件,每个关卡里面都会触发不同数量的怪物与能量血瓶,通过打败怪物与 到达特点时间点可通关 ⭐本项目演 ...

  8. 云龙开炮版飞机大战(Java+JavaSwing+关卡+技能物品+宠物+商店界面+可切换音乐界面)

    文章目录 前言 一.主界面展示 二.游戏演示效果 三.部分关卡.商店代码展示 ⭐游戏工具类⭐ ⭐游戏面板类⭐ ⭐商店类⭐ ⭐音乐类⭐ ⭐项目图片⭐ 作者:KJ.JK 前言 基于Java Swing,以 ...

  9. java飞机大战爆炸效果_Java飞机大战游戏设计与实现

    1 概述 1.1 项目简介 本次Java课程设计是做一个飞机大战的游戏,应用Swing编程,完成一个界面简洁流畅.游戏方式简单,玩起来易于上手的桌面游戏.该飞机大战项目运用的主要技术即是Swing编程 ...

最新文章

  1. 时间字符串与当前时间比較
  2. 用系统某一用户的的身份运行某一命令
  3. Linux 安装json神器 jq
  4. Linux定时任务Crontab命令详解
  5. SQL SERVER7应用
  6. 从持续交付看敏捷开发的自相似性(敏捷开发的心跳)
  7. jw player 5去掉share,info,embed页面
  8. jdk String类源码解析
  9. VC++ 只运行一个程序实例
  10. 并联串联混合的电压和电流_如何从本质上判断电压表测量谁的电压?
  11. Springboot
  12. 存储器RAM ROM FLASH介绍
  13. dm数据库 linux版下载,达梦(DM)数据库Linux部署安装
  14. 微信qq表情输入文本 vue
  15. 64位mysql下载百度云_MySQL下载与安装
  16. CLC龍链:致力于打造基于区快链技术的全球跨境支付生态系统
  17. 【Microarchitecture of Intel and AMD CPU】 9 Sandy Bridge and Ivy Bridge pipeline 【9.1~9.3】
  18. 【图像分类】实战——使用ResNet实现猫狗分类(pytorch)
  19. PCL安装和环境配置
  20. Spring配置SessionFactory

热门文章

  1. C 头歌 字符串插入
  2. 01 双重差分与三重差分分析法
  3. leetcode和牛客网刷题
  4. C++10进制转16进制
  5. 时间序列的数据分析(七):数据平稳性
  6. java 判断请求来自手机或电脑
  7. 什么是链表php概念,链表 · PHP知识大纲 · 看云
  8. Revit建模如何一键“生成场地和基础垫层”
  9. lua 中pairs 和 ipairs差别
  10. 新手必备pr 2021快速入门教程「一」初识premiere pro 工作界面