关于java飞机躲炮弹的一些对象说明(带源码)
1.飞机躲炮弹的各种实体类都需要一个画笔将他们画出来
(GameObject)
import java.awt.*;
public void drawSelf(Graphics g){
g.drawImage(image,(int)x,(int)y,null);
}
//里边用到了Graphics 的这个对象
//可以把 g 看成一个画笔,将你需要的飞机等类通过一个画笔画出image ,其中的x,y 设置他们的位置(必须是整形)
public Rectangle getRect(){
return new Rectangle((int)x, (int) y,width,height);
}
//里边用到了Rectangle 的这个对象
//返回实体类的位置和大小,想当于一个无形的方块跟着某个实体,在他身边筑起了篱笆,不能发生重叠,一碰就炸 2.图片单建一个类获取并存储
( GameUtil)
public class GameUtil {
public GameUtil() {
}
//获取图片位置
public static Image getImage(String path){
BufferedImage bi = null;
URL u = GameUtil.class.getClassLoader().getResource(path);
try {
bi = ImageIO.read(u);
} catch (IOException e) {
e.printStackTrace();
}
return bi;
}
}
//BufferedImage 对象用来存储图片
//GameUtil.class.getClassLoader().getResource(path)用来获取url,
其中GameUtil.class是这个类文件;getClassLoader()是启动类加载器用于启动这个类
getResource()是从根目录获取URL的,其中的path是不能以“\”开头的,(并且getResource()很少单独使用,一般与File对象的getfile()连用)
3.关于飞机最重要的是能够根据人机交互移动
plane
主要和键盘的按键读取对象KeyEvent有关
例如定义了一个KeyEvent对象e
e.getKeyCode(KeyEvent.Vk_键盘的按键)是获取键盘的按键 例如:e.getKeyCode(KeyEvent.VK_W)获取w按键 4.关于炮弹是能够反弹的算法
shell 圆周率==180度
Math.random()得到0.0到1.0的任意值
(里边的算法自己思考)比较简单
源码:
Constant
package com.company.game;
public class Constant {
public static final int Game_WIDTH = 500;
public static final int Game_HEIGHT = 500;
}
Explode
package com.company.game;
import java.awt.*;
public class Explode {
double x,y;
static Image[] images = new Image[16];
static {
for (int i = 0; i < 16 ; i++) {
images[i] = GameUtil.getImage("src/images/explode/e" + (i + 1) + ".png");
images[i].getWidth(null);
}
}
int count;
public void draw(Graphics g) {
if (count<=15){
g.drawImage(images[count],(int)x,(int)y,null);
count++;
}
}
public Explode(double x, double y) {
this.x = x;
this.y = y;
}
}
GameObject
package com.company.game;
import java.awt.*;
public class GameObject {
//每个物体都有(宽度、长度、位置的X与Y、速度、图片)
Image image;
double x,y;
int height,width;
int speed;
public void drawSelf(Graphics g){
g.drawImage(image,(int)x,(int)y,null);
}
public GameObject(Image image, double x, double y, int height, int width, int speed) {
// super();
this.image = image;
this.x = x;
this.y = y;
this.height = height;
this.width = width;
this.speed = speed;
}
public GameObject(Image image, double x, double y) {
this.image = image;
this.x = x;
this.y = y;
}
public GameObject() {
}
//返回物体所在的矩形,用于检测是否发生碰撞
public Rectangle getRect(){
return new Rectangle((int)x, (int) y,width,height);
}
}
GameUtil
package com.company.game; import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL; public class GameUtil {
public GameUtil() {
}
//获取图片位置
public static Image getImage(String path){
BufferedImage bi = null;
URL u = GameUtil.class.getClassLoader().getResource(path);
try {
bi = ImageIO.read(u);
} catch (IOException e) {
e.printStackTrace();
}
return bi;
}
}
Plane
package com.company.game; import java.awt.*;
import java.awt.event.KeyEvent; public class Plane extends GameObject{
boolean left,right,up,down;
boolean live = true; //确定飞机移动后的方位
public void drawSelf(Graphics g){
if (live){
g.drawImage(image,(int)x,(int)y,null);
}
if(left && x>=0){
x -= speed;
}
if(right && x<Constant.Game_WIDTH-width){
x += speed;
}
if(up && y>=20){
y = y - speed;
}
if(down && y<Constant.Game_HEIGHT-height){
y += speed;
} } public Plane(Image image, double x, double y) {
super(image, x, y);
this.x = x;
this.y = y;
this.speed = 8;
this.width = image.getWidth(null);
this.height = image.getHeight(null);
} 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; case KeyEvent.VK_A:
left = true;
break;
case KeyEvent.VK_D:
right = true;
break;
case KeyEvent.VK_W:
up = true;
break;
case KeyEvent.VK_S:
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; case KeyEvent.VK_A:
left = false;
break;
case KeyEvent.VK_D:
right = false;
break;
case KeyEvent.VK_W:
up = false;
break;
case KeyEvent.VK_S:
down = false;
break;
}
}
}
Shell
package com.company.game;
import java.awt.*;
public class Shell extends GameObject{
double degree; //弧度
public Shell(){
x = 200;
y = 200;
width = 10;
height = 10;
speed = 3;
degree = Math.random()*Math.PI*2;
}
public void draw(Graphics g){
Color c = g.getColor();
g.setColor(Color.white);
g.fillOval((int)x,(int)y,width,height);//填充
x += speed*Math.cos(degree);
y += speed*Math.sin(degree);
if (x<0||x>Constant.Game_WIDTH-width){
degree = Math.PI - degree;
}
if (y<0||y>Constant.Game_HEIGHT -height){
degree = - degree;
}
}
}
Main
package com.company.game; 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; public class Main extends Frame { Image planeImg = GameUtil.getImage("images/plane.png");
Image bg = GameUtil.getImage("images/bg.png"); Plane plane = new Plane(planeImg,250,Constant.Game_HEIGHT-50);
Shell[] shells = new Shell[10];
Explode explode;
Date startTime = new Date();
Date endTime;
double period; @Override
public void paint(Graphics g) {
super.paintComponents(g); Color c = g.getColor(); g.drawImage(bg,0,0,null);
plane.drawSelf(g); //花50个炮弹
for (int i = 0; i < shells.length; i++) {
shells[i].draw(g);
boolean peng = shells[i].getRect().intersects(plane.getRect());
if (peng){
plane.live = false;
if (explode == null){
explode = new Explode(plane.x,plane.y);
endTime = new Date();
period = (startTime.getTime()-endTime.getTime());
}
explode.draw(g);
} if (!plane.live){
g.setColor(Color.red);
Font font = new Font("楷体",Font.ITALIC,50);
g.setFont(font);
//g.drawString("时间:" + period + "m",(int)plane.x,(int)plane.y);
plane.live = true;
plane = new Plane(planeImg,250,Constant.Game_HEIGHT-50);
plane.drawSelf(g);
}
} g.setColor(c);
} private void launchFrame() {
this.setTitle("飞机躲炮弹");
this.setVisible(true);
this.setSize(Constant.Game_WIDTH,Constant.Game_HEIGHT);
this.setLocation(300,150);
//this.setBackground(Color.black); this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
System.exit(0);
}
}); new PaintThread().start();
addKeyListener(new KeyMonitor()); for (int i = 0; i < shells.length; i++) {
shells[i] = new Shell();
}
} class PaintThread extends Thread {
@Override
public void run() {
super.run();
while (true){
repaint(); try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} class KeyMonitor extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
plane.addDirection(e);
} @Override
public void keyReleased(KeyEvent e) {
super.keyReleased(e);
plane.minusDirection(e);
}
} public static void main(String[] args) {
// write your code here
Main f = new Main();
f.launchFrame();
} 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);
}
}

炸弹


参考代码:https://blog.csdn.net/weixin_42148490/article/details/82695381
关于java飞机躲炮弹的一些对象说明(带源码)的更多相关文章
- 点菜网---Java开源生鲜电商平台-系统架构图(源码可下载)
点菜网---Java开源生鲜电商平台-系统架构图(源码可下载) 1.点菜网-生鲜电商平台的价值与定位. 生鲜电商平台是一家致力于打造全国餐饮行业智能化.便利化.平台化与透明化服务的创新型移动互联网平台 ...
- Java中的容器(集合)之HashMap源码解析
1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是 ...
- Java并发包中Semaphore的工作原理、源码分析及使用示例
1. 信号量Semaphore的介绍 我们以一个停车场运作为例来说明信号量的作用.假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦.以后 ...
- 转!!Java学习之自动装箱和自动拆箱源码分析
自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|fal ...
- java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码
java 动态代理深度学习, 一.相关类及其方法: java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定 ...
- Java显式锁学习总结之六:Condition源码分析
概述 先来回顾一下java中的等待/通知机制 我们有时会遇到这样的场景:线程A执行到某个点的时候,因为某个条件condition不满足,需要线程A暂停:等到线程B修改了条件condition,使con ...
- 【Java并发编程】21、线程池ThreadPoolExecutor源码解析
一.前言 JUC这部分还有线程池这一块没有分析,需要抓紧时间分析,下面开始ThreadPoolExecutor,其是线程池的基础,分析完了这个类会简化之后的分析,线程池可以解决两个不同问题:由于减少了 ...
- 【转】java comparator 升序、降序、倒序从源码角度理解
原文链接:https://blog.csdn.net/u013066244/article/details/78997869 环境jdk:1.7+ 前言之前我写过关于comparator的理解,但是都 ...
- java并发编程的艺术(三)---lock源码
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
随机推荐
- Sqoop 简介与安装
一.Sqoop 简介 Sqoop是一个常用的数据迁移工具,主要用于在不同存储系统之间实现数据的导入与导出: 导入数据:从MySQL,Oracle等关系型数据库中导入数据到HDFS.Hive.HBase ...
- spring boot 2.x 系列 —— spring boot 整合 servlet 3.0
文章目录 一.说明 1.1 项目结构说明 1.2 项目依赖 二.采用spring 注册方式整合 servlet 2.1 新建过滤器.监听器和servlet 2.2 注册过滤器.监听器和servlet ...
- 09、MySQL—列属性
列属性又称之为字段属性,在mysql中一共有6个属性:null,默认值,列描述,主键,唯一键和自动增长 1.Null属性 NULL属性:代表字段为空 如果对应的值为YES表示该字段可以为NULL 注意 ...
- leetcode的Hot100系列--136. 只出现一次的数字
因为之前刚写了461号题目,这个题目与那个很相似, 461号题目用异或来算两个不一样的部分, 那这个题目需要排除一样的部分,并找到不一样的部分. 那么可以再利用一下异或的特性: 1.相同为0,所以,a ...
- java基础类型源码解析之HashMap
终于来到比较复杂的HashMap,由于内部的变量,内部类,方法都比较多,没法像ArrayList那样直接平铺开来说,因此准备从几个具体的角度来切入. 桶结构 HashMap的每个存储位置,又叫做一个桶 ...
- HDU 1828:Picture(扫描线+线段树 矩形周长并)
题目链接 题意 给出n个矩形,求周长并. 思路 学了区间并,比较容易想到周长并. 我是对x方向和y方向分别做两次扫描线.应该记录一个pre变量,记录上一次扫描的时候的长度,对于每次遇到扫描线统计答案的 ...
- HDU 5616:Jam's balance(背包DP)
http://acm.hdu.edu.cn/showproblem.php?pid=5616 题意:有n个物品,每个重量为w[i],有一个天平,你可以把物品放在天平的左边或者右边,接下来m个询问,问是 ...
- django基础知识之视图:
视图 视图接受Web请求并且返回Web响应 视图就是一个python函数,被定义在views.py中 响应可以是一张网页的HTML内容,一个重定向,一个404错误等等 响应处理过程如下图:
- 2. 软件数据流图(DFD)
数据流图,简称DFD,是SA方法中用于表示系统逻辑模型的一种工具,它以图形的方式描绘数据在系统中流动和处理的过程,由于它只反映系统必须完成的逻辑功能,所以它是一种功能模型. 下图是一个飞机机票预订系统 ...
- Java编程思想:擦除的神秘之处
import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; public class Test ...