skeletonofanimation.htm
来自「电脑图学(Computer Graphics)是资料结构、演算法与数学的应用」· HTM 代码 · 共 132 行
HTM
132 行
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>动画程式骨架</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="ComputerGraphics.htm">Computer Graphics: 动画程式骨架</a></h1>
这个主题的动画程式骨架主要是使用Java程式为范例,使用多执行绪来进行动画的状态改变,其它的程式语言其实类似,
最后也补充了不使用多执行绪的版本。
<h2> Java的程式骨架 </h2>
<pre>package onlyfun.caterpillar.graphics.animation; <br> <br>import java.awt.*;<br>import javax.swing.JApplet;<br> <br>public class AnimationSkeleton extends JApplet <br> implements Runnable { <br> // 定义多执行绪的方法 <br> public void run() { <br> // 动画回圈 <br> while(true) { <br><br> // 动画的状态改变、缓冲区绘图 <br><br> this.repaint(); // 重绘画面 <br><br> // 执行绪暂停 50 毫秒 <br> try { <br> Thread.sleep(50); <br> } <br> catch(InterruptedException e) { <br> // 例外处理 <br> } <br> } // while结束 <br> } // run()结束 <br> <br> // 改写update(),避免画面不连续 <br> public void update(Graphics g) { <br> this.paint(g); // 单纯呼叫paint() <br> } <br> <br> public void paint(Graphics g) { <br> super.paint(g);<br> // 绘图动作 <br> } <br>} <br></pre>
<br>
在这个骨架中,实作Runnable以使用多执行绪进行动画状态的改变,在这边要养成一个习惯:“将动画状态的改变与绘
图两个工作分开。”这可以让程式的逻辑更为清楚,虽然不使用多执行绪也可以绘制部份的动画(例如画框动画),但上面这个骨架,在额外进行像是缓冲区绘图时
相当方便。 <br>
<br>
其中改写update()的部份是为了避免绘图的闪烁,这是因为Java在呼叫repaint()之后,repaint()会先呼叫
update()清除画面,而update()预设会使用白色背景清除画面,然后再绘上使用者指定的背景,这会造成Java在绘图时的闪烁,改写
update()直接呼叫paint(),让它不重绘画面,让重绘的动作由您控制,以避免闪烁的发生。
<h2> Turbo C 绘图模式 </h2>
<pre>#include <graphics.h> <br>#include <stdlib.h> <br> <br>void modify(); // 改变动画状态 <br>void draw(); // 绘图 <br> <br>int main(void) { <br> // 启动绘图模式 <br> initgraph(&driver, &mode, "c:\\"); <br> <br> // 动画回圈 <br> while(1) { <br> cleardevice(); // 清除荧幕,不一定需要这个函式 <br> draw(); <br> modify(); <br> // 暂停执行 <br> sleep(50); <br> } <br> <br> // 关闭绘图模式 <br> closegraph(); <br> <br> return 0; <br>} <br> <br>void modify() { <br> // 动画状态改变 <br>} <br> <br>void draw() { <br> // 绘图 <br>} <br></pre>
<br>
在Turbo C中,所有的绘图与状态改变都是在while回圈中进行,函式的设计与使用者的互动必须多花一些心思,程式的逻辑性会变得复杂一些。<br>
<br>
<br>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?