国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java動畫編程基礎

2019-11-18 10:42:23
字體:
來源:轉載
供稿:網友

  基本技術:
  在java中實現動畫有很多種辦法,但它們實現的基本原理是一樣的,即在
  屏幕上畫出一系列的幀來造成運動的感覺。
  我們先構造一個程序的框架,再慢慢擴展,使之功能比較齊備。
  
  使用線程:
  為了每秒中多次更新屏幕,必須創建一個線程來實現動畫的循環,這個循環
  要跟蹤當前幀并響應周期性的屏幕更新要求。實現線程的方法有兩種,你可以創建
  一個類Thread的派生類,或附和在一個Runnable的界面上。
  一個輕易犯的錯誤是將動畫循環放在paint()中,這樣占據了主AWT線程,而
  主線程將負責所有的繪圖和事件處理。
  一個框架applet如下:
  
  public
  class Animator1 extends java.applet.Applet implements Runnable {
  int frame;
  int delay;
  Thread animator;
  
  public void init() {
  String str = getParameter("fps");
  int fps = (str != null) ? Integer.parseInt(str) : 10;
  delay = (fps > 0) ? (1000 / fps) : 100;
  }
  
  public vois start() {
  animator = new Thread(this);
  animator.start();
  }
  
  public void run() {
  while (Thread.currentThread() == animator) {
  repaint();
  
  try {
  Thread.sleep(delay);
  } catch (InterruptedException e) {
  break;
  }
  
  frame++;
  }
  }
  
  public void stop() {
  animator = null;
  }
  }
  
  在你的Html文件中這樣引用:
  
  
  
  上面的參數fps表示每秒的幀數
  
  保持恒定的幀速度:
  上例中,applet只是在每兩幀之間休眠一個固定的時間,但這有些缺點,有時
  你會等很長時間,為了每秒顯示十幀圖象,不應該休眠100毫秒,因為在運行
  當中也耗費了時間。
  這里有一個簡單的補救方法:
  public void run() {
  long tm = System.currentTimeMillis();
  while (Thread.currentThread() == animator) {
  repaint();
  
  try {
  tm += delay;
  Thread.sleep(Math.max(0,tm -
  System.currentTimeMillis()));
  } catch (InterruptedException e) {
  break;
  }
  
  frame++;
  }
  }
  
  畫出每一幀:
  
  剩下的就是將每一幀圖象繪出。在上例中調用了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的圖象被緩存過,使得閃爍
  
  的時間比較短。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄂尔多斯市| 陕西省| 无棣县| 呼图壁县| 大余县| 海南省| 武夷山市| 二连浩特市| 乌鲁木齐县| 桐城市| 长丰县| 闻喜县| 宝坻区| 凯里市| 盘锦市| 合山市| 乡宁县| 资阳市| 化隆| 常州市| 玉门市| 新民市| 永丰县| 高安市| 夏津县| 通城县| 资兴市| 禹州市| 永靖县| 东安县| 神农架林区| 蓬安县| 崇义县| 克什克腾旗| 宿松县| 新乡市| 贵阳市| 贵德县| 灵山县| 项城市| 科技|