基于Java的动画编程基础(二)

画出每一帧:

剩下的就是将每一帧图象绘出。在上例中调用了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);
}

时间: 2025-01-21 12:26:59

基于Java的动画编程基础(二)的相关文章

基于Java的动画编程基础(一)

基本技术: 在Java中实现动画有很多种办法,但它们实现的基本原理是一样的,即在屏幕上画出一系列的帧来造成运动的感觉. 我们先构造一个程序的框架,再慢慢扩展,使之功能比较齐备. 使用线程: 为了每秒中多次更新屏幕,必须创建一个线程来实现动画的循环,这个循环要跟踪当前帧并响应周期性的屏幕更新要求.实现线程的方法有两种,你可以创建一个类Thread的派生类,或附和在一个Runnable的界面上. 一个容易犯的错误是将动画循环放在paint()中,这样占据了主AWT线程,而主线程将负责所有的绘图和事件

使用IBM WebSphere Application Server执行基于Java的批处理编程

这一期将介绍 http://www.aliyun.com/zixun/aggregation/13387.html">WebSphere Application Server 批处理基础架构如何与企业调度程序相集成. IBM WebSphere Application Server V8.5 和更高版本为基于 Java 的批处理应用程序提供了一个执行平台.除了提供功能丰富的编程模型和高级特性,比如并行处理.跳过记录处理.重试步骤处理和 COBOL 支持,它还为批处理程序提供了企业级 &qu

Java网络编程基础(二) Socket类的使用方法

当客户程序需要与服务器程序通讯的时候,客户程序在客户机创建一个socket对象,Socket类有几个构造函数. 两个常用的构造函数是 Socket(InetAddress addr, int port) 和 Socket(String host, int port),两个构造函数都创建了一个基于Socket的连接服务器端流套接字的流套接字.对于第一个InetAddress子类对象通过addr参数获得服务器主机的IP地址,对于第二个函数host参数包被分配到InetAddress对象中,如果没有I

Linux shell编程基础 二、基础概念

基础概念部分 登陆主机 登陆主机分为本地登陆和远程登陆. 本地登陆:就是直接面对主机,由键盘输入用户密码登陆,使用tty1-tty6,或者图形界面tty7 远程登陆:通过网络连接主机,以虚拟终端的方式登陆,使用ssh 退出登陆 1.使用命令exit 2.使用[Crtl+D]退出 文件 在Linux中,任何东西包括硬件都视为文件.文件可以分为几种: 一般文件:纯文本文件,二进制文件.如果文件具有执行权限,称为执行文件. 目录:包含文件. 设备文件:字符文件,磁盘文件. 内部进程通信文件:socke

java-基于JAVA,身份证阅读器二次开发接口如何调用?

问题描述 基于JAVA,身份证阅读器二次开发接口如何调用? 身份证阅读器已经有了,我现在做了一个网站(JAVA语言开发的),网站后台需要调用身份证信息,录入身份证信息,如何调用这个身份证阅读器的二次开发接口?是身份证阅读器厂商提供二次开发接口吗?还是如何做?没有做过,不知如何下手...求大神帮忙!感激不尽!!!

vo封装-Java web编程基础 在线考试系统源代码

问题描述 Java web编程基础 在线考试系统源代码 一.功能说明 1.学生 学生使用学号和密码登录系统,实现在线答题,提交试卷后可以直接查看测试成绩. 2.教师 教师使用教师号和密码登录系统,可以实现题目表question的维护工作(增删改查). 二.结构说明 采用JSP+JavaBean模式,利用VO实现对象的封装. 三.界面说明 界面设计合理.友好,可操作性强,充分考虑用户的使用需求. 四.数据库说明 三张表: 1.学生表student:记录学生的学号.姓名.密码.测试成绩 2.教师表t

JNI编程基础(二)——Android Studio NDK开发

由于笔者目前的工作是Android开发,所以在JNI开发系列博客中穿插一篇AndroidStudio NDK开发介绍. 随着Android Studio 2.2的推出,Android Studio的NDK开发支持Cmake和ndk-build两种方式,简化了Android Studio上NDK开发流程,提升了开发效率.接下来就介绍下两种开发方式. 1. CMake CMake是一个跨平台的编译(安装)工具,支持通过用较为简单的语言来描述编译(安装)过程,最后输出适配不同平台的makefile货p

Java的Socket网络编程基础知识入门教程_java

一.TCP/IP简介 TCP/IP协议族是互联网使用的协议,也可以用在独立的专用网络中. TCP/IP协议族包括了IP协议.TCP协议和UDP协议. IP协议使用IP地址来分发报文,但它是尽力而为的服务,报文可能丢失.乱序或者 重复发送.TCP和UDP协议在IP协议基础上增加了端口号,从而在两台主机的应用 程序间建立起透明的连接. 不同的是,TCP协议会对IP层的错误进行修复,它通过握手消息在主机间建立连接, 之后通过在消息中加入序列号来恢复消息中的错误.而UDP只是简单地扩展了IP协议, 使它

Java多线程编程基础之线程和多线程

[写在前面] 随着计算机技术的发展,编程模型也越来越复杂多样化.但多线程编程模型 是目前计算机系统架构的最终模型.随着CPU主频的不断攀升,X86架构的硬件已 经成为瓶,在这种架构的CPU主频最高为4G.事实上目前3.6G主频的CPU已经接近了顶峰. 如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能),那么 继续提高CPU性能的方法就是超线程CPU模式.那么,作业系统.应用程序要发挥 CPU的最大性能,就是要改变到以多线程编程模型为主的并行处理系统和并发式 应用程序. 所以,掌握