28640发布于 今天 02:47

本篇文章目的

画出坦克的实心圆

让坦克圆动起来

双缓冲解决闪烁问题

一、画出代表坦克的实心圆

我们需要画出一个圆,那么可以使用fillOval方法

fillOval(int x,int y ,int width ,int height)

参数的X 和 Y是矩形框的左上角的坐标,width和height是宽和高。

而我们重写paint方法进行画出坦克的圆

@Override

public void paint(Graphics g) {

//获取默认的颜色Color

Color c = g.getColor();

//将坦克颜色为红色

g.setColor(Color.red);

//画一个圆

g.fillOval(50,50,30,30);

//将原颜色填充回

g.setColor(c);

}

当然也可以在lauchFrame方法里添加背景填充色,显得更外显眼一些

//添加设置背景颜色

this.setBackground(Color.GREEN);

二、让坦克动起来

我们使用fillOval方法画出了圆的实现,那么怎么让这个圆改变位置?

//画一个圆

g.fillOval(50,50,30,30);

我们发现x和y的做标都是50,他们是固定的!

若改变成变量的方式?是不是也是一样可以呢?

int x = 50;//坦克的x坐标

int y = 50;//坦克的y坐标

@Override

public void paint(Graphics g) {

//获取默认的颜色Color

Color c = g.getColor();

//将坦克颜色为红色

g.setColor(Color.red);

//画一个圆

g.fillOval(x,y,30,30);

//将原颜色填充回

g.setColor(c);

}

若我们每次原有的基础上进行改动,是不是就动起来了?

我们采用repaint重绘方法,每隔多少毫秒刷新最新的圆点信息坐标

private class PaintThread implements Runnable {

@Override

public void run() {

while (true) {

repaint();//重绘方法

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

//定义窗口方法

public void lauchFrame() {

//省略其他关键性代码.....

//添加设置背景颜色

this.setBackground(Color.GREEN);

//使用线程重绘最新圆点信息坐标

new Thread(new PaintThread()).start();

}

@Override

public void paint(Graphics g) {

//省略其他关键性代码.....

//刷新圆点位置

x += 5;//x坐标

y += 5;//y坐标

}

这时我们在main方法运行起来就发现每个100毫秒就会移动圆点位置了

为什么使用线程重面,而不是每按下一个键进行一次重画?

线程重画更均匀,更能控制重画的速度。

按键重画不能解决子弹自动飞行的问题。

三、双缓冲解决闪烁问题

我们的显示器一般都是多少hz、多少hz的刷新率,而刷新速度太快,paint方法还没完成,没跟上导致会出现闪烁的问题

那么怎么解决呢?

1.逐条显示

2.将所有东西画在虚拟图片上,一次性显示出来

Image offScreenImage = null;//虚拟图片

@Override

public void update(Graphics g){

if(offScreenImage == null){

//若为null,则创建一张图片

offScreenImage = this.createImage(800,600);

}

//获取到虚拟图片的画笔

Graphics gOffScreen = offScreenImage.getGraphics();

//使用虚拟图片的画笔画圆

paint(gOffScreen);

//将虚拟图片画下来

g.drawImage(offScreenImage,0,0,null);

}

但是运行起来会发现,圆动起来后慢慢变成了一条线

这是怎么回事呢?

因为当我们不重写update方法时,它会自己用背景颜色刷一遍,刷完再画

而为什么会一条线呢,因为背景没刷,之前画出来的圆还在那

所以我们用虚拟图片的画笔画出一个方框出来代替之前的背景

@Override

public void update(Graphics g){

if(offScreenImage == null){

//若为null,则创建一张图片

offScreenImage = this.createImage(800,600);

}

//获取到虚拟图片的画笔

Graphics gOffScreen = offScreenImage.getGraphics();

//默认黑色,所以需要与效果背景一致获取原色

Color c = gOffScreen.getColor();

gOffScreen.setColor(Color.green);//与原背景色一致

//使用画笔画出一个实现的方框代替原画的背景效果

gOffScreen.fillRect(0,0,800,600);

gOffScreen.setColor(c);//设置原回来

//使用虚拟图片的画笔画圆

paint(gOffScreen);

//将虚拟图片画下来

g.drawImage(offScreenImage,0,0,null);

}

这时再运行就即可

参考资料

java 坦克重叠_【Java】我所知道坦克大战(单机版)之画出坦克的实心圆、让圆动起来、双缓冲解决闪烁问题...相关推荐

  1. java 坦克大战画坦克_【JAVA语言程序设计基础篇】--JAVA实现坦克大战游戏--画出坦克(二)...

    坦克类: //坦克父类 可以设置坦克出现位置(x,y) class Tank { int x = 0; int y = 0; public Tank (int x,int y){ this.x = x ...

  2. java闪烁_java双缓冲解决屏幕闪烁

    今天做实验,发现了屏幕闪烁问题,网上找到解决方法,在此谢谢原作者 转自http://blog.sina.com.cn/s/blog_611ca6300100ezfx.html Java的强大特性让其在 ...

  3. java画好看坦克_坦克大战第一节——画出自己的坦克(新手篇)

    刚刚开始学习java,对java不是很熟悉,但是自己的兴趣挺喜欢java.现在自己在自学java做一个小游戏,坦克大战. 自己现在完成了画出自己的坦克和坦克的移动方向.希望各位大神指导一下我这个刚刚学 ...

  4. tankwar java_TankWar 单机(JAVA版) 版本0.3 画出坦克

    其实就是通过自定义的panel  重写里面的paint方法  使用Graphics类画一个圆 然后把自定的panel添加到窗口中 由于想到tank不能只画一个  所以我们封装一个tank类  里面有一 ...

  5. java取负数_[Java] 告别“CV 工程师”码出高效!(基础篇)

    作为一名资深的 CV 工程师,某天,当我再一次日常看见满屏的报错信息与键盘上已经磨的泛白的 Ctrl.C.V 这三个按键时,我顿悟了. 百度谷歌复制粘贴虽然很香,但是总是依靠前人种树,终会有一天失去乘 ...

  6. java 坦克大战画坦克_Java坦克大战部分:画出界面,敌人坦克,我的坦克,不出界,键盘事件【诗书画唱】...

    含很多自己写的个理解和注释,想出的解决,建议,提示,注意事项等方法: package tankeGame; import java.awt.Color; import java.awt.Graphic ...

  7. java控制语句练习题_[Java初探实例篇02]__流程控制语句知识相关的实例练习

    本例就流程控制语句的应用方面,通过三个练习题来深入学习和巩固下学习的流程控制语句方面的知识,设计到,if条件判断语句,switch多分支语句,for循环语句及其嵌套多层使用,while循环语句. 练习 ...

  8. java 文本压缩_[Java基础]Java使用GZIP进行文本压缩

    import java.io.IOException; import java.util.zip.GZIPOutputStream; import org.apache.commons.io.outp ...

  9. java private 对象_[Java笔记]类的所有构造器都是private权限,就一定没有办法实例化它的对象了么?...

    笔者以前学过C++语言.众所周知,C++也是一门面向对象程序设计语言.还记得当时在大学的时候,老师讲过这样的话:类的构造函数不应该设置成private权限,这样的话还怎么去实例化类的对象?当时也信以为 ...

最新文章

  1. 案例分析 陆金所_平安陆金所介绍-关于陆金所-平安陆金所
  2. 北理通信男找工作的经历及心得
  3. C++STL源代码学习(之slist篇)
  4. zepto点击事件兼容pc和mobile
  5. iqc工作职责和工作内容_猎头如何辨识工作职责和工作业绩?
  6. 十三、流程控制之if语句
  7. Qt之Q_GLOBAL_STATIC创建全局静态对象
  8. 【直播提醒】荷小鱼:K12 在线教育应用的开发实践
  9. centOS7 安装redis-3.2.6
  10. 学习《css世界》笔记之loading三点动画效果
  11. python unicode error_关于GAE中运行python出现unicode decode error
  12. 高性能服务器模型分类
  13. Nginx的主要函数调用关系分析
  14. 人工智能TensorFlow工作笔记004---还记得标准差嘛_标准差的由来
  15. layer 子页面提交 刷新父页面 table
  16. 2022最新短视频API解析接口源码
  17. AD使用技巧 内附AD18下载地址
  18. “爱心助农”成绩单公布,淘宝何以成为最大舞台?
  19. 柯美文件服务器,柯尼卡美能达复印机共享SMB文件扫描
  20. EBU5502 Database Coursework Specifications

热门文章

  1. 仿链家地图找房_我在深圳的第一个家 是在有着6000套房的工业区里
  2. M1支持Windows arm_新款Macbook air,史上最强M1芯片,能买吗?有哪些注意的
  3. Unity网络--HLAPI(1):服务器客户端变量同步,脏标识以及定制特性SyncVar
  4. Android:进度条加载
  5. python是基于什么原理_Python基于class()实现面向对象原理详解
  6. mysql做四则运算_MySQL字符串进行四则运算以及比较
  7. Tile-Based架构下的性能调校
  8. 在ubuntu上启动一个vue项目
  9. POJ 3621 Sightseeing Cows [最优比率环]
  10. [转载] 杜拉拉升职记——43 偷听者