飞机大战--java
菜鸟日记—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相关推荐
- proj Java_proj 一个炫酷的飞机大战java游戏,很好玩的,很酷炫 用了 的图形界面 Games 256万源代码下载- www.pudn.com...
文件名称: proj下载 收藏√ [ 5 4 3 2 1 ] 所属分类: Games 开发工具: Java 文件大小: 3435 KB 上传时间: 2016-05-11 下载次数: 0 提 ...
- 飞机大战——Java小游戏
飞机大战 文章目录 飞机大战 游戏需求 代码实现 子弹类 英雄机类 小敌机类 大敌机类 小蜜蜂类 飞行物类 接口类 爆炸类 游戏窗口类 游戏需求 所参与角色:英雄机.子弹.小敌机.大敌机.小蜜蜂.天空 ...
- 飞机大战Java源代码
很快,大二这个学期就要完结了,所学的大部分课程都快要结束了,Java课程也是如此.而Java这门课程也有一个惯例就是要做一个课程设计,老师给了我们三个选择,分别是飞机大战.推箱子和学生成绩管理系统.在 ...
- 全民飞机大战(java)
目录 一.需求 二.窗体.面板.背景图的绘制 2.1 工具类 2.2 面板类 2.3 窗体类 2.4 效果图 三.英雄机的出现及移动 3.1 定义飞行父类 3.2 英雄机的出现 3.3 ...
- 飞机大战java代码_[源码和文档分享]Java飞机大战游戏设计与实现
1 概述 1.1 项目简介 本次Java课程设计是做一个飞机大战的游戏,应用Swing编程,完成一个界面简洁流畅.游戏方式简单,玩起来易于上手的桌面游戏.该飞机大战项目运用的主要技术即是Swing编程 ...
- 全民飞机大战Java(搬)
第一步,首先创建一个窗体 package ui; import javax.swing.JFrame; /** * 自定义窗体类的步骤: * 1.写一个类,继承JFrame,在类名后面加extends ...
- 飞机大战Java版完整版
这是一款闯关的射击游戏,人物在不同的关 卡里面会触发不同的技能与对应的特效操作,有三个关卡与四个随机事件,每个关卡里面都会触发不同数量的怪物与能量血瓶,通过打败怪物与 到达特点时间点可通关 ⭐本项目演 ...
- 云龙开炮版飞机大战(Java+JavaSwing+关卡+技能物品+宠物+商店界面+可切换音乐界面)
文章目录 前言 一.主界面展示 二.游戏演示效果 三.部分关卡.商店代码展示 ⭐游戏工具类⭐ ⭐游戏面板类⭐ ⭐商店类⭐ ⭐音乐类⭐ ⭐项目图片⭐ 作者:KJ.JK 前言 基于Java Swing,以 ...
- java飞机大战爆炸效果_Java飞机大战游戏设计与实现
1 概述 1.1 项目简介 本次Java课程设计是做一个飞机大战的游戏,应用Swing编程,完成一个界面简洁流畅.游戏方式简单,玩起来易于上手的桌面游戏.该飞机大战项目运用的主要技术即是Swing编程 ...
最新文章
- 时间字符串与当前时间比較
- 用系统某一用户的的身份运行某一命令
- Linux 安装json神器 jq
- Linux定时任务Crontab命令详解
- SQL SERVER7应用
- 从持续交付看敏捷开发的自相似性(敏捷开发的心跳)
- jw player 5去掉share,info,embed页面
- jdk String类源码解析
- VC++ 只运行一个程序实例
- 并联串联混合的电压和电流_如何从本质上判断电压表测量谁的电压?
- Springboot
- 存储器RAM ROM FLASH介绍
- dm数据库 linux版下载,达梦(DM)数据库Linux部署安装
- 微信qq表情输入文本 vue
- 64位mysql下载百度云_MySQL下载与安装
- CLC龍链:致力于打造基于区快链技术的全球跨境支付生态系统
- 【Microarchitecture of Intel and AMD CPU】 9 Sandy Bridge and Ivy Bridge pipeline 【9.1~9.3】
- 【图像分类】实战——使用ResNet实现猫狗分类(pytorch)
- PCL安装和环境配置
- Spring配置SessionFactory