|
|
 |
基于Java的动画编程基础第二部分 |
热 ★★★★ |
|
基于Java的动画编程基础第二部分 |
|
作者:闵涛 文章来源:闵涛的学习笔记 点击数:897 更新时间:2009/4/22 23:28:27  |
|
|
画出每一帧:
剩下的就是将每一帧图象绘出。在上例中调用了applet的repaint()来绘出每一帧图象。
生成图形:
现在我们来画一些稍微困难的东西。下例画了一个正弦曲线的组合, 对于每一个x,画一条短的垂直线,所有这些线组成了一个图形,并且每帧变化。
但不幸有些闪动,在以后我们将解释为什么闪以及怎样避免。
public void paint(Graphics g) { Dimension d = size(); int h = d.height / 2; for (int x = 0 ; x < d.width; x++) { int y1 = (int)((1.0 + Math.sin((x - frame)*0.05))*h); int y2 = (int)((1.0 + math.sin((x + frame)*0.05))*h); g.DrawLine(x, y1, x, y2); } } 避免闪烁:
上例中的闪烁有两个原因:绘制每一帧花费的时间太长(因为重绘时要求的计算量大),二是在每次调用pait()前整个背景被清除,当在进行下一帧的计算时,用户看到的是背景。
清除背景和绘制图形间的短暂时间被用户看见,就是闪烁。在有些平台如PC机上闪烁比在X Window上明显,这是因为X Window的图象被缓存过,使得闪烁的时间比较短。
有两种办法可以明显地减弱闪烁:重载update()或使用双缓冲。
重载update()?
当AWT接收到一个applet的重绘请求时,它就调用applet的update()。
缺省地,update()清除applet的背景,然后调用paint()。重载update(),将以前在paint()中的绘图代码包含在update()中,从而避免每次重绘时将整个区域清除。
既然背景不在自动清除,我们需要自己在update()中完成。我们在绘制新的线之前独自将竖线擦除,完全消除了闪烁。
public void paint(Graphics g) { update(g); }
public void update(Graphics g) {
Color bg = getBackground(); Dimension d = size(); int h = d.height / 2; for (int x = 0; x < d.width; x++) { int y1 = (int)((1.0 + Math.sin((x - frame)*0.05))*h); int y2 = (int)((1.0 + Math.sin((x + frame)*0.05))*h); if (y1 > y2) { int t = y1; y1 = y2; y2 = t; } g.setColor(bg); g.drawLine(x, 0, x, y1); g.drawLine(x, y2, x, d.height); g.setColor(Color.black); g.drawLine(x, y1, x, y2); }
没有相关教程
|
|
| 教程录入:mintao 责任编辑:mintao |
|
|
上一篇教程: 基于Java的动画编程基础第一部分 下一篇教程: Java线程控制的图像分割与合成 |
|
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网] |
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| |
|
|
|
|
|
 |
同类栏目 |
 |
 |
赞助链接 |
 |
|
500 - 内部服务器错误。
|
|
|
|
|
|