运行效果

闪烁的有点厉害,想解决闪烁的问题,可以搜索关键词:Java JFrame中使用双缓冲解决paint方法闪烁问题

本来是个飞机小游戏,中途突发奇想做了这个。
图片自己找的,为了斜眼笑的透明效果,用ppt修了一下图(设置透明色),存png格式。

用到的图片:

思路比较简单,就是每一次重画窗口的时候计算一次斜眼笑的最新位置。计算方式:无论是x轴方向还是y轴方向,当超过设定边缘的时候,将运动方向翻转。

其中,起始坐标xy两个方向上的运动速度vx,vy刷新次数sleep()均可调。

目录结构

代码

MyGameFrame.java

package cn.sxt.game;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;import javax.swing.JFrame;public class MyGameFrame extends JFrame
{Image bg = GameUtil.getImage("image/bg.jpg");Image plane = GameUtil.getImage("image/plane.png");Image smile = GameUtil.getImage("image/smile.png");//int flagx = 1;//int flagy = 1;// Location lo = new Location();Location[] a = new Location[25];{// System.out.println("初始化一次~!");for (int i = 0; i < 25; i++){a[i] = new Location();a[i].x = 10 * i;a[i].y = 10 * i;}// System.out.println("a[0].x="+a[0].x);}// 计算坐标的函数public Location calculateLocate(Location p, int vx, int vy){System.out.print("之前:");System.out.print("x=" + p.x + "y=" + p.y);if (p.x > 460){System.out.print("[1]");p.flagx = -1;}if (p.y > 460){System.out.print("[2]");p.flagy = -1;}if (p.x < 40){System.out.print("[3]");p.flagx = 1;}if (p.y < 40){System.out.print("[4]");p.flagy = 1;}p.x += p.flagx * vx;p.y += p.flagy * vy;System.out.print("之后:");System.out.println("x=" + p.x + "y=" + p.y);return p;}@Overridepublic void paint(Graphics g)// 自动被调用,g相当于一支画笔{super.paint(g);for (int i = 0; i < 25; i++){a[i] = calculateLocate(a[i], (i + 1) % 6 + 1, (i + 3) % 8 + 1);}// lo = calculateLocate(lo, 3, 7);// System.out.println("a[0].x="+a[0].x+"a[0].y="+a[0].y);g.drawImage(bg, 0, 0, null);// g.drawImage(plane, lo.x, lo.y, null);for (int i = 0; i < 25; i++){g.drawImage(smile, a[i].x, a[i].y, null);}}// 多线程的使用 反复重画窗口,当经常使用一个类时,可以把调用它放入类作为被调用类的内部类,这样方便调用class PaintThread extends Thread{@Overridepublic void run(){// TODO Auto-generated method stubsuper.run();while (true){repaint();try{Thread.sleep(100);} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}}}}// 初始化窗口函数public void launchFrame(){this.setTitle("魔鬼鱼");this.setVisible(true);this.setSize(500, 500);// 窗口大小 这里有何神奇的bug 垮外界屏幕的时候窗口无法缩小this.setLocation(500, 500);// 窗口位置// 匿名内部类 安卓编程到处都是 用来在关闭窗口之后结束程序this.addWindowListener(new WindowAdapter(){@Overridepublic void windowClosing(WindowEvent e){// System.out.println("结束~!");System.exit(0);// 0表示正常结束 负数表示异常结束}});new PaintThread().start();// 启动重画窗口的线程}public static void main(String[] args)// 使用alt / 组合件可以快速补全{MyGameFrame fr = new MyGameFrame();fr.launchFrame();}
}

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;}
}

Location.java(这个类用来存放每个斜眼笑的横坐标、纵坐标、运动方向)

package cn.sxt.game;public class Location
{public int x;public int y;public int flagx = 1;public int flagy = 1;
}

【Java/JFrame/多线程】小球碰到边缘的回弹效果相关推荐

  1. java JFrame 桌宠 下部

    承接上文:java JFrame 桌宠 上部 DeskCreeper.java import javax.print.attribute.standard.DialogOwner; import ja ...

  2. 《Java程序设计》实验报告——Java的多线程机制

    浙江理工大学 <Java程序设计>  实验报告  20 19-20 20学年第 1学期      学  院 信息学院 班  级 计算机科学与技术18(3) 姓  名 申屠志刚 学  号 2 ...

  3. 【Java】多线程(以java webcam实现视频功能为例)

    [Java]多线程(以实现视频功能为例) 文章目录 [Java]多线程(以实现视频功能为例) step1:如何实现视频 step2:为什么关不掉?(需要多线程的原因) step3:实现 打开视频 启动 ...

  4. java面试题成都_成都汇智动力-java面试——多线程面试题

    原标题:成都汇智动力-java面试--多线程面试题 1.多线程有什么用?发挥多核CPU的优势 防止阻塞 便于建模 2.创建线程的方式继承Thread类 实现Runnable接口 至于哪个好,不用说肯定 ...

  5. Java使用多线程和GUI实现购买火车票<集合>

    文章目录 绪: 样例 DEMO--购票项目 项目要求 实现步骤 一.[车次.txt][Person类][Ticket类] 1.[车次.txt] 2.[Person类] 3.[Ticket类] 二.主窗 ...

  6. 基于Java+JFrame开发的单机版开心农场游戏源码,Java开发的单机电脑版开心农场游戏源代码

    单机版开心农场项目 介绍 使用 Java+JFrame 等相关知识开发一个单机电脑版的开心农场 软件架构 使用java中JFrame类相关知识进行可视化开发 使用javase阶段知识进行项目开发 本项 ...

  7. Oracle字符串转BooIean,利用Java的多线程技术实现数据库的访问.pdf

    利用Java的多线程技术实现数据库的访问.pdf 第 卷第 期 计算机应用 22 12 Voi .22 , No . 12 年 月 2002 12 Computer Appiications Dec ...

  8. Java 并发/多线程教程(四)-并发模型

    本系列译自jakob jenkov的Java并发多线程教程(本章节部分内容参考http://ifeve.com/并发编程模型),个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 并发系统可以有多 ...

  9. LeetCode1117. Building H2O --Java解法--多线程保证执行顺序--AtomicInteger

    此文首发于我的个人博客:LeetCode 1117. Building H2O --Java解法–多线程保证执行顺序–AtomicInteger - zhang0peter的个人博客 LeetCode ...

最新文章

  1. Hadoop学习笔记:MapReduce框架详解
  2. Linux系统下MBR分区表的备份与恢复
  3. li变成行内块级元素之后,每一个li之间会有间隙,这是为什么?
  4. 对称加密和不对称加密原理
  5. Creating UIImage with renderingMode in Swift
  6. java 使用vsphere 创建虚拟机‘_Java数组的创建及使用
  7. 关于js返回上一页的实现方法
  8. 《Effective Debugging:软件和系统调试的66个有效方法》一第2条:在网上确切地查询你所遇到的问题,以寻求解决问题的灵感...
  9. SQL语言概况(4.1)
  10. 开发基于CXF的 RESTful WebService web 项目 webservice发布
  11. android theme.appcompat.light,Theme.AppCompat.Light的解决方法
  12. 四川省内二本计算机公立好的大学排名,盘点四川省最好的几所二本大学
  13. qt html转pdf 怎么取消页码,更改或删除QPrintPreviewWidg中的页码
  14. JS函数式编程——来源freecodecamp
  15. 计算机网络双绞线实验报告
  16. CRM上线之路 走上了CRM实施顾问-第100天上班 -第21周
  17. 【学习小结】树上的概率、期望问题,树上高斯消元
  18. FPS能重塑英雄联盟的辉煌吗?Valorant公测半年有什么优势和不足?
  19. 移动机器人传感器——GNSS
  20. java计算机毕业设计奇妙店铺电子商务网站源码+系统+数据库+lw文档+mybatis+运行部署

热门文章

  1. 电视机当计算机屏幕,电视机可以当电脑显示器吗
  2. php self 内存,php导致内存溢出
  3. mysql协议重传_TCP协议详解
  4. 中国剩余定理(CRT)扩展中国剩余定理(exCRT)
  5. 直接将自身代码注入傀儡进程
  6. 4.IDA-导航(跳转到地址、导航按钮、栈帧、调用约定、局部变量布局、IDA的栈视图)
  7. 利用WinPcap技术捕获数据包
  8. 关于 ADB 实现的说明
  9. Redis 缓存常见问题:缓存一致性的解决方案
  10. twisted.internet.error.TimeoutError错误的解决方法