2013-08-21 6 views
1

У меня есть следующие code.I хотят, чтобы отобразить изображения в моем цыпленка массива на экране после того, как некоторого время задержки .The координаты должны быть сдвинуты на 10px каждый х направлении когда новый изображение loaded.I хотел бы знать, какие дополнительные фрагменты кода я могу добавить в этот код, чтобы иметь анимацию на моей раме с двумя изображениями я имею .Below мой код:изображения анимации не отображается получением

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

Ну, для начинающих я намерен отображать первое изображение на своем апплете, но мой апплет, похоже, не показывает никакого изображения. – 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, которое сообщает изображению, где оно должно быть нарисовано. Вы изменили бы эти значения на заданную x/y-дельта внутри вашего потока до того, как вы позвонили repaint ...

Четвертая проблема, которая может возникнуть, заключается в том, что вы используете AWT ... который отчасти устарел. Swing решит вашу проблему с двойной буферизацией для вас ... ИМХО, сделало бы лучший выбор - есть много больше документации и примеров в Swing, которые укладываются в наши дни;)

Пока я нахожусь на моем хворостаном коне ... Я, лично, рекомендую ImageIO над Toolkit#createImage или ImageIcon, в основном потому, что она поддерживает больше форматов, но и потому, что он будет бросать Exception, когда изображение не может быть прочитан по какой-то причине ...

у меня есть простой пример если 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

и 5-й проблема заключается в том, что текущий анимационный кадр должен поддерживаться во время анимации, чтобы иметь возможность изменять изображения. – Katona

+0

@ Katona Неплохая точка – MadProgrammer

+0

@MadProgrammer Thanx для отличного ответа и я определенно хотел бы посмотреть ваш пример качания !! – ghost