2013-08-21 148 views
1

我有以下code.I想一些時間延遲 .The座標必須由10px的每個x方向偏移後顯示在我的小雞陣列的屏幕上的圖像時新 圖像loaded.I想知道什麼額外的代碼段,我可以在這個代碼加有一個動畫在我的框架上,兩個圖像,我有。下面是我的代碼:圖片動畫

import java.awt.Color; 
    import java.awt.Dimension; 
    import java.awt.Frame; 
    import java.awt.Graphics; 
    import java.awt.Image; 
    import java.awt.Toolkit; 


    public class Chicken extends Frame implements Runnable{ 
     Thread animation; 
     long frameDelay = 3000; 
     Image chick[] = new Image[2]; 
     int numFrames = chick.length; 
     Toolkit tk = getToolkit(); 
     public Chicken() 
     { 
      setSize(new Dimension(300,300)); 
      setVisible(true); 
      setBackground(Color.BLACK); 
      animation = new Thread(this); 
      chick[0] = tk.createImage("stand.png"); 
      chick[1] = tk.createImage("walk.png"); 
      animation.start(); 
      //setVisible(false); 

     } 
     public void paint(Graphics g) 
     { 
      g.drawImage(chick[0],100,100,null); 
     } 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      repaint(); 
      try { 
       Thread.sleep(frameDelay); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
     public static void main(String args[]) 
     { 
      Chicken instance = new Chicken(); 
     } 

    } 
+1

雖然有你們的做法一些明顯的問題,你有什麼特別的問題? – MadProgrammer

+0

那麼,對於初學者,我打算在我的applet上顯示第一個圖像,但我的applet似乎沒有顯示任何圖像。 – ghost

+0

我假設你知道你沒有顯示小程序的代碼... – MadProgrammer

回答

1

所以,你遇到的第一個問題是資源問題。

存儲在應用程序中的資源(通常稱爲嵌入式資源)無法像外部資源一樣加載。

chick[0] = tk.createImage("stand.png"); 

期待一個文件"./stand.png"不存在。相反,你需要通過Class#getResource API調用的資源...

chick[0] = tk.createImage(getClass().getResource("/stand.png")); 

將要面臨的第二個問題是,你是壓倒一切的頂層容器paint的事實。這真的不應該這樣做。讓我們從它沒有雙重緩衝的事實開始,並以框架具有位於可視區域內的裝飾物的事實結束。這意味着裝飾將重疊你所繪製的任何表面......不太漂亮......

第三個問題是你沒有告訴圖像它應該移動到哪裏。它是靜態的。

您需要某種x/y值來告訴圖像應該在哪裏繪製。您可以在您調用repaint之前,通過給定的x/y增量修改這些值...

您可能遇到的第四個問題是您正在使用AWT ...這是一種過時的事實。 Swing會爲你解決你的雙緩衝問題...恕我直言,會做出更好的選擇 - 有更多的文檔和Swing現在鋪設在現在的日子上的例子;

雖然我在我的跛足馬...我個人而言,建議在ImageIOToolkit#createImageImageIcon,主要是因爲它支持更多的格式,而且還因爲它會拋出一個Exception時不能讀取由於某種原因,圖像...

我有一個簡單的例子如果是Swing,但我不會發布,因爲我會因爲主題的運行而陷入困境...讓我知道你是否想看到它

更新與Swing例如

這將使用默認的包中嵌入了圖像...

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class ChickenDance { 

    public static void main(String[] args) { 
     new ChickenDance(); 
    } 

    public ChickenDance() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private BufferedImage chicken; 
     private int xPos; 
     private int yPos; 

     private int xDelta = 4; 

     public TestPane() { 
      try { 
       chicken = ImageIO.read(getClass().getResource("/Chicken.png")); 
      } catch (IOException ex) { 
       Logger.getLogger(ChickenDance.class.getName()).log(Level.SEVERE, null, ex); 
      } 

      Timer timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        xPos += xDelta; 
        if (xPos + chicken.getWidth() > getWidth()) { 
         xPos = getWidth() - chicken.getWidth(); 
         xDelta *= -1; 
        } else if (xPos < 0) { 
         xPos = 0; 
         xDelta *= -1; 
        } 
        yPos = (getHeight() - chicken.getHeight())/2; 
        repaint(); 
       } 
      }); 
      if (chicken != null) { 
       timer.start(); 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(400, 400); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (chicken != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       g2d.drawImage(chicken, xPos, yPos, this); 
       g2d.dispose(); 
      } 
     } 
    } 

} 
+1

和第五個問題是當前的動畫幀應保持動畫期間,以便能夠更改圖像 – Katona

+0

@Katona不壞的一點 – MadProgrammer

+0

@MadProgrammer謝謝偉大的答案我一定會喜歡看你的揮杆範例! – ghost