Java动画编程基础第二部分

原创 2001年05月05日 01:20:00

画出每一帧:

剩下的就是将每一帧图象绘出。在上例中调用了applet的repaint()

来绘出每一帧图象。

public void paint(Graphics g) {

g.setColor(Color.black);

g.drawString("Frame " + frame, 0, 30);

}

生成图形:

现在我们来画一些稍微困难的东西。下例画了一个正弦曲线的组合,

对于每一个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);

}

}

COM编程入门:第二部分 深入COM服务器

原文地址:点击打开链接 本文为刚刚接触COM的程序员提供编程指南,解释COM服务器内幕以及如何用C++编写自己的接口。继上一篇COM编程入门之后,本文将讨论有关COM服务器的内容,解释编写自己的...
  • ilyvmz
  • ilyvmz
  • 2012年12月01日 14:27
  • 310

COM编程入门第二部分——深入COM服务器

本文为刚刚接触COM的程序员提供编程指南,解释COM服务器内幕以及如何用C++编写自己的接口。继上一篇COM编程入门之后,本文将讨论有关 COM服务器的内容,解释编写自己的COM接口和COM服务器所需...
  • mao0514
  • mao0514
  • 2013年09月30日 08:20
  • 1673

JDBC编程基础 第二部分

5.2. JDBC 和Java应用程序/r对于一个普通的Java应用程序(例如全部用Java代码而不是不可靠的applet )JDBC将从本地的类路径里面获得驱动,并且允许应用程序自由存取文件,远程服...
  • navyforce
  • navyforce
  • 2005年06月17日 12:43
  • 842

2017年网易校招笔试编程题第二题

1、题目 未曾将题目抄下,大致提议如下: 给定n个正整数组成的数列,找出取这n个正整数中的一部分数字求和所不能得到的最小数。【输入】第一行:一个正整数n,为数列整整数的个数 ...
  • liu_005
  • liu_005
  • 2016年08月06日 22:44
  • 1176

Java动画编程基础第一部分

基本技术:在Java中实现动画有很多种办法,但它们实现的基本原理是一样的,即在屏幕上画出一系列的帧来造成运动的感觉。我们先构造一个程序的框架,再慢慢扩展,使之功能比较齐备。使用线程:为了每秒中多次更新...
  • wxyxl
  • wxyxl
  • 2001年05月05日 01:20
  • 916

Java动画编程基础第四部分

  • zgqtxwd
  • zgqtxwd
  • 2008年04月25日 21:10
  • 139

Java动画编程基础第三部分

双缓冲技术:另一种减小帧之间的闪烁的方法是使用双缓冲,它在许多动画applet中被使用。主要原理是创建一个后台图象,将一帧画入图象,然后调用drawImage()将整个图象一次画到屏幕上去。好处是大部...
  • wxyxl
  • wxyxl
  • 2001年05月05日 01:21
  • 752

Core Animation动画学习2——自定义CALayer的动画

CALayer的动画效果
  • realank
  • realank
  • 2015年10月07日 14:09
  • 258

黑马程序员------50道JAVA基础编程练习题

------- android培训、java培训、期待与您交流! ---------- 50道JAVA基础编程练习题 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对...
  • a768818702
  • a768818702
  • 2015年11月06日 14:18
  • 7311

java基础问题(第二部分)

31、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的? SessionBean: Stateless Session Bean 的生命周期是由容器决定的...
  • Ranbiony
  • Ranbiony
  • 2008年05月31日 16:36
  • 409
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java动画编程基础第二部分
举报原因:
原因补充:

(最多只允许输入30个字)