2012-08-13 70 views
0

我有3個關於我的動畫項目的問題。帶有MediaTracker的Java動畫小程序,線程和定時器

  1. 是對程序正確的結構(見下文)
  2. 我的第一圖像(從陣列)無法正常運行。有時會彈出,然後消失,然後其他圖像正確顯示。
  3. 如何控制音頻剪輯何時開始播放。它有時聽起來像是一根針正在翻錄一張唱片...?

,對於程序的結構: 是在正確的順序如下:

在INIT:

  1. 設置applet的大小。
  2. 運行帶睡眠時間的計時器任務
  3. 獲取聲音文件。
  4. 從陣列中獲取圖像。
  5. 初始化MediaTracker對象並告訴它「等待所有」圖像。
  6. 播放聲音文件。

IN START(圖形克) 1.繪製小程序並加載陣列

IN START的第一圖像:, 1.檢查空值的螺紋,如果不爲空,啓動它們

在RUN: 1.再次畫出的小程序: 1.使用變量「iPictureNumber」通過同樣使用重繪和方法的Thread.sleep

更新中按順序的圖像進行迭代。


此代碼是另一個程序的更新版本,我沒有使用線程,所以我不知道這是否是正確的結構。 我的目標是使用這種簡單程序的最佳實踐。如果需要,我可以在壓縮文件中提供圖像和聲音。請提前告知,謝謝。 這裏是代碼:

// Java的動畫與圖像陣列和1個聲音文件的項目中使用線程

import java.net.*; 
import java.io.*; 
import java.lang.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.MediaTracker; 
import java.applet.Applet; 
import java.applet.AudioClip; 
import java.util.*; 

public class c_TrainAnimation extends Applet implements Runnable 
    { 
    Image trainAndBush[]; 
    int totalImages = 17, 
    currentImage = 0,    // Set current image array subscript to 0 
    sleepTime = 900; 
    Image imageCurrent; // Set to the matching image in "trainAndBush" Array 
    MediaTracker myImageTracker; 
    Timer myTimer; 
    Thread threadTrainAnimation = new Thread(this); 
    Thread threadSoundFile = new Thread(this); 
    AudioClip mySound; 

    public void init() 
    { 
    setSize(400,400); 

     myTimer = new Timer(true); 
    myTimer.schedule(new TimerTask() 
      { 

       public void run() 
       { repaint();} 

      } // end TimerTask 

       ,0,sleepTime); 

     mySound = getAudioClip(getDocumentBase(), "onpoint.au"); 
     trainAndBush = new Image[ totalImages ]; 

     // Load the array of images into the Applet when it begins executing 
     for(int i = 0; i < trainAndBush.length; i++) 
     {  
      trainAndBush[i] = getImage(getDocumentBase(), 
       "Hill" + (i + 1) + ".jpg");  

     myImageTracker = new MediaTracker(this); 

     // Give the images an ID number to pass to MediaTracker 
     myImageTracker.addImage(trainAndBush[i], i); 

     // Tell MediaTracker to wait until all images are loaded 
      try 
    { 
     myImageTracker.waitForAll(); 
    } 
    catch(Exception e) {} 

     mySound.play(); 

     } // end for loop 
    }  // end init 

    // check threads for null values and then start threads 
    public void start() 
     { 
    if (threadTrainAnimation != null) 
     threadTrainAnimation.start(); 
    if (threadSoundFile != null) 
    threadSoundFile.start(); 
     } 

    // Draw the applet with the first image of the array 
    public void start(Graphics g) 
     { 
    g.drawImage(trainAndBush[0],50,50,300,300, this); 
    currentImage = 0;      
     } 

     // Set "imageCurrent"to appropriate "trainAndBush image" in the array and_ 
     loop through 
    public void run() 
     { 
    int iPictureNumber[] = {0, 1, 2, 3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 
     while(true) 
    { 
      for(int i = 0; i < iPictureNumber.length; i++) 
      { 
     imageCurrent = trainAndBush[iPictureNumber[i]]; 
     repaint(); 
     try 
     { 
     Thread.sleep(sleepTime); 
     } 
     catch(InterruptedException e) {} 

     } // end for loop 
     } // end while statement 
    } // end run 

    public void update(Graphics g) 
     { 
    g.drawImage(imageCurrent, 50, 50, 300, 300, this); 
     } 

    } // end of Applet 

回答

1

我不會用Applet,用JApplet,將解決幾十個問題關閉蝙蝠;)

我可能會使用單獨的RunnablesthreadTrainAnimationthreadSoundFile,但我沒有太多的聲音經驗。但我看到的問題是,您有兩個線程同時訪問代碼的一部分,執行相同的操作。這只是讓事情變得糟糕。

您需要弄清楚如何同步聲音和動畫。

使用java.util.Timer對於您嘗試達到的目標而言不正確,因爲運行threadTrainAnimation,因爲它們通常會執行相同的操作。在這種情況下,我可能只是擺脫它。在未來,你使用javax.swing.Timer,因爲它提供了Event Dispatching Thread

我更好的支持,個人的更好,不會加載我的資源,在init方法,你現在的樣子。這將減慢小應用程序的加載速度並使用戶感到不安。你最好放置一個不錯的「加載」圖像,並使用Thread來執行加載。完成後,使用類似SwingUtilities.invokeLater的動畫來啓動動畫。

請勿覆蓋update方法,而應改寫paint方法。

這也有可能是圖像被改變更快那麼他們可以畫,你可能要考慮一下這個問題,以及 - 這是run方法paint之前可以執行的次數被稱爲

作爲一個建議,我會通過

如果你是認真的動畫,我也想看看

哪些是Java的動畫框架

+0

嗨MadProgrammer,感謝您的所有提示。我必須詳細看看您的每條評論,因爲它們對於我在此計劃中的位置有點高級。我還沒有與Swing合作過。也許你建議的讀數會讓它更清晰。再次感謝! – codechick 2012-08-14 00:05:48

+0

不要忘了規則#1 - 玩得開心:) – MadProgrammer 2012-08-14 00:09:44

+0

它運行時很有趣...; d – codechick 2012-08-14 04:23:48