功能

Java开发的小球躲避小游戏。通过上下左右按键控制小球移动,小球移动的方向包括:横向、纵向、斜向,小球具有初始生命值。小球通过移动来躲避炮弹,当小球碰到炮弹时,产生爆炸的动画效果。

使用双缓冲方式解决闪烁问题。

注释很全面,速度、初始子弹数量都可以通过全局变量修改。适合入门学习使用。

运行效果

目录结构

代码

全部代码都在博客里,整个项目文件已经上传至:CSDN下载

MyGameFrame.java

package cn.sxt.game;import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;import javax.swing.JFrame;public class MyGameFrame extends Frame
{// 双缓冲 解决闪烁问题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);}Image bg = GameUtil.getImage("image/bg.jpg");Image planeImg = GameUtil.getImage("image/plane.png");Plane plane = new Plane(planeImg, 250, 250, Constant.PLANE_SPEED);Shell shell[] = new Shell[Constant.SHELL_NUM];{for (int i = 0; i < Constant.SHELL_NUM; i++){shell[i] = new Shell();}}Explode explode = new Explode(0, 0);Date startTime = new Date();Date endTime;int period;// 持续时间@Overridepublic void paint(Graphics g)// 自动被调用,g相当于一支画笔{super.paint(g);g.drawImage(bg, 0, 0, null);// 画背景plane.drawItSelf(g);// 画飞机// 画炮弹for (int i = 0; i < Constant.SHELL_NUM; i++){shell[i].draw(g);// 检测是否飞机和炮弹相接触boolean touch = shell[i].getRect().intersects(plane.getRect());if (touch){Constant.LIFE--;plane.live = false;explode.x = plane.x;explode.y = plane.y;System.out.println("碰到了!");explode.count %= 16;explode.Draw(g);endTime = new Date();period = (int) (endTime.getTime() - startTime.getTime()) / 1000;// 计算时间差Font f = new Font("宋体", Font.BOLD, 20);g.setFont(f);g.setColor(Color.WHITE);g.drawString("(" + period + "秒)剩余生命值:" + Constant.LIFE, (int) plane.x, (int) plane.y);}}}// 键盘监听class KeyMonitor extends KeyAdapter{@Overridepublic void keyPressed(KeyEvent e)// 按下键{// TODO Auto-generated method stubsuper.keyPressed(e);// 38按向上 40按向下 37按向左 39按向右plane.KeyDown(e);}@Overridepublic void keyReleased(KeyEvent e)// 抬起键{// TODO Auto-generated method stubsuper.keyReleased(e);plane.KeyUp(e);}}// 多线程的使用 反复重画窗口,当经常使用一个类时,可以把调用它放入类作为被调用类的内部类,这样方便调用class PaintThread extends Thread{@Overridepublic void run(){// TODO Auto-generated method stubsuper.run();while (true){repaint();try{Thread.sleep(Constant.SLEEP);} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}}}}// 初始化窗口函数public void launchFrame(){this.setTitle("魔鬼鱼");this.setVisible(true);this.setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);// 窗口大小 这里有何神奇的bug 垮外界屏幕的时候窗口无法缩小this.setLocation(500, 500);// 窗口位置// 匿名内部类 安卓编程到处都是 用来在关闭窗口之后结束程序this.addWindowListener(new WindowAdapter(){@Overridepublic void windowClosing(WindowEvent e){System.exit(0);// 0表示正常结束 负数表示异常结束}});new PaintThread().start();// 启动重画窗口的线程addKeyListener(new KeyMonitor());// 添加键盘监听}public static void main(String[] args)// 使用alt / 组合件可以快速补全{MyGameFrame fr = new MyGameFrame();fr.launchFrame();}
}

Explode.java

package cn.sxt.game;import java.awt.Graphics;
import java.awt.Image;public class Explode
{double x, y;// 爆炸的坐标static Image[] imgs = new Image[16];// 使用static避免图像被反复加载static// 静态初始化块{for (int i = 0; i < 16; i++){imgs[i] = GameUtil.getImage("image/explode/e" + (i + 1) + ".gif");imgs[i].getWidth(null);}}int count;// 当前显示的图片序号public void Draw(Graphics g){if (count <= 15)//轮播16张图片{System.out.println("轮播16张图片");g.drawImage(imgs[count], (int) x, (int) y, null);count++;}}//构造器public Explode(double x, double y){this.x = x;this.y = y;}
}

GameObject.java

package cn.sxt.game;import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;//包含游戏中物体的常用属性,物体继承于这个类即可
public class GameObject
{Image img; //图像路径名称double x,y; //位置坐标int speed;    //速度int width,height;   //宽高//画出自己public void drawItSelf(Graphics g){g.drawImage(img, (int)x, (int)y, null);}//矩形用于做碰撞检测 返回物体所在矩形public Rectangle getRect(){return new Rectangle((int)x,(int)y,width,height);}//构造器public GameObject(Image img, double x, double y, int speed, int width, int height){super();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){super();this.img = img;this.x = x;this.y = y;}//无参构造器public GameObject(){super();}
}

GameUtil.java

package cn.sxt.game;import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;import javax.imageio.ImageIO;public class GameUtil
{private GameUtil()// 工具类最好将构造器私有化{}// 返回指定路径文件的图片对象public static Image getImage(String path){BufferedImage bi = null;try{URL u = GameUtil.class.getClassLoader().getResource(path);bi = ImageIO.read(u);} catch (IOException e){e.printStackTrace();}return bi;}
}

Constant.java(类似于全局变量)

package cn.sxt.game;//用于存储常量
public class Constant
{public static final int GAME_WIDTH = 500;public static final int GAME_HEIGHT = 500;public static final int SHELL_NUM = 40;public static final int PLANE_SPEED = 5;public static final int SHELL_SPEED = 3;public static final int SLEEP = 50;public static int LIFE = 1000;
}

Plane.java (plane就是斜眼笑的图片)

package cn.sxt.game;import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;public class Plane extends GameObject // Plane类继承 GameObject类
{public boolean up, down, left, right;boolean live = true;public void drawItSelf(Graphics g){//if (live)//{if (up)y -= speed;if (down)y += speed;if (left)x -= speed;if (right)x += speed;g.drawImage(img, (int) x, (int) y, null);//} else//{// System.out.println("碰到了额");//}}public void KeyDown(KeyEvent e){switch (e.getKeyCode()){case 38:up = true;System.out.println(e.getKeyCode() + "按向上");break;case 40:down = true;System.out.println(e.getKeyCode() + "按向下");break;case 37:left = true;System.out.println(e.getKeyCode() + "按向左");break;case 39:right = true;System.out.println(e.getKeyCode() + "按向右");break;default:System.out.println(e.getKeyCode() + "按无效键");}}public void KeyUp(KeyEvent e){up = down = left = right = false;System.out.println(e.getKeyCode() + "按键抬起");}public Plane(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);// 获得图片高度}
}

Shell.java(子弹)

package cn.sxt.game;import java.awt.Color;
import java.awt.Graphics;//子弹
public class Shell extends GameObject
{double degree;// 角度int xflag = 1;int yflag = 1;public Shell(){// 坐标x = 100;y = 100;// 长宽width = 10;height = 10;// 速度speed = Constant.SHELL_SPEED;// 角度生成degree = Math.random() * Math.PI * 2;// 产生一个0~2π之间的随机数}// 画炮弹public void draw(Graphics g){Color c = g.getColor();// 保存之前的颜色g.setColor(Color.yellow);g.fillOval((int) x, (int) y, width, height);// 填充炮弹if (x <= 20 || x >= Constant.GAME_WIDTH - 20){xflag *= -1;}if (y <= 20 || y >= Constant.GAME_HEIGHT - 20){yflag *= -1;}x += speed * Math.cos(degree) * xflag;y += speed * Math.sin(degree) * yflag;g.setColor(c);// 用完之后把颜色还原}
}

【Java小游戏】小球躲避游戏 图片轮播爆炸效果、边缘反弹、计时功能相关推荐

  1. java轮播添加图片_给网站首页添加图片轮播的效果

    网站的首页有图片轮播的效果,可以很好的起到广告的作用也可以起到推荐优秀内容的作用. 可是一般的建站程序,首页的幻灯片效果都很一般不是很好看,有的时候就需要我们自己改一下代码. 太复杂的代码自己改不好, ...

  2. html原生js实现图片轮播,原生JS实现图片轮播切换效果

    原生JS实现图片轮播切换效果 2019-01-06 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了原生JS实现图片轮播切换效果,编程之家小编觉得挺不错的,现在分 ...

  3. layui下的图片轮播图效果代码收藏

    以下展示在layui table表格列表中展示图片集,并使用layui图片轮播效果. <script> layui.use(['table', 'tree', 'layer','jquer ...

  4. php图片轮换功能,微信小程swiper组件实现图片轮播切换功能教程

    本文主要介绍了微信小程使用swiper组件实现图片轮播切换显示功能,涉及swiper组件相关属性使用技巧,希望能帮助到大家. 1.效果展示 2.关键代码 index.wxml: swiper组件属性说 ...

  5. Android之——史上最简单图片轮播广告效果实现

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48049913 如今的Android开发需求越来越来多,实现效果越来越酷炫,很多An ...

  6. 使用jQuery快速高效制作网页交互特效 第五章 上机练习四 制作广告图片轮播切换效果

    轮播应有的功能大致都有,分享给一些在学的朋友参考学习. <!DOCTYPE html> <html> <head lang="en"><m ...

  7. JS图片轮播切换效果实现

    效果演示地址:http://6689.one/WebEffects/pictureplay.html 实现代码如下: </pre> <pre name="code" ...

  8. 小清新的jQuery ck-slide 图片轮播

    ck_slide 是一款小清新的jQuery 幻灯片插件,它非常小巧,压缩后仅 3KB,基本功能可以满足.它支持淡入淡出/左右滚动.箭头/圆点控制.自动播放. 在线实例 默认(淡入淡出) 左右滚动 自 ...

  9. TouchSlide (图片轮播的效果)

    http://www.superslide2.com/TouchSlide/howToUse.html 在渠道工作系统的主页中使用了,并且(1/2/3/4)有不同的样式,具体可以参考官网案例.

最新文章

  1. 爬虫python爬取页面请求_Python网络爬虫第三弹《爬取get请求的页面数据》
  2. 图像处理(十二)图像融合(1)Seamless cloning泊松克隆-Siggraph 2004
  3. find文件,tar打包和打包压缩
  4. 解决Windows 2003中不允许的父路径Active Server Pages错误'ASP 0131'的方法
  5. Android之RxJava(一)
  6. RTX5 | 时间延时
  7. STM32工作笔记0036---C语言复习--寄存器地址名称映射
  8. keyshot分辨率多少合适_投影仪分辨率和画质,你想知道的都在这里!
  9. 苹果iOS开发深入浅出Cocoa之类与对象
  10. 【Java_Spring】控制反转IOC(Inversion of Control)
  11. 消耗报表数据库呈现了流动变乱的回滚段破损(三)
  12. VS2005+WDK+DriverStudio
  13. 每次打开office2016相应应用都要配置进度的解决方法
  14. 卸载控制面板(Control Panel)存在的重复程序(CrowdStrike)
  15. mysql主键和候选键有什么区别?
  16. 医疗研讨会直播怎么做
  17. Error(错误)、Exception(异常)之间区别
  18. 台式计算机内存是什么问题,如何解决台式机上内存不足的问题
  19. ORA-00054: 资源正忙 解决办法
  20. java 计算均值和标准差_java计算方差、标准差(均方差)实例代码

热门文章

  1. UVA208Firetruck 消防车(图的路径搜索)
  2. python爬虫-利用代理ip访问网页(urllib)
  3. java泛型 例子_关于 Java 泛型的一些有趣的例子
  4. 25.智能指针.rs
  5. 异步socket优雅的关闭-CancelIO和SO_LINGER
  6. cocos2d-x游戏实例(10)-塔防游戏(修改地图图素,地图整体缩放)
  7. PHP、Node、Ruby和Python应用,漏洞修复
  8. MySQL(一)SQL执行流程与MySQL架构
  9. 如何构建一套高性能、高可用性、低成本的视频处理系统?
  10. 基于Huffman算法和LZ77算法的文件压缩的改进方向