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:&nbsp;动画程式骨架</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 &lt;graphics.h&gt; <br>#include &lt;stdlib.h&gt; <br> <br>void modify(); // 改变动画状态 <br>void draw();    // 绘图 <br> <br>int main(void) { <br>    // 启动绘图模式 <br>    initgraph(&amp;driver, &amp;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 + -
显示快捷键?