2013-04-19 2 views
0

Я пытаюсь нарисовать новое изображение того же изображения на экране после каждых 10 секундного интервала задержки. Я пытался понять это сам, и я тоже искал вещи, но не могу найти ничего, что поможет.Как получить новые изображения после задержки?

Моя особая проблема в том, что я не знаю, как нарисовать новое изображение, используя исходное изображение. Я хочу сделать так, чтобы каждые 10 секунд появилось новое изображение и начинало следовать за его идентификационным массивом, который затем следует за его собственными координатами xy (IDx [0] = x; IDx [0] = y;)

Простой g .drawImage в Graphics для каждого нового изображения исключается, потому что мне нужно, чтобы он рисовал новые изображения/боты, пока условие не будет выполнено для их остановки. Но цель та же, что и в автоматическом режиме.

Мое окно:

package pack; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Window extends JPanel implements Runnable { 

    public static final int GAME_WIDTH = 512; 
    public static final int GAME_HEIGHT = GAME_WIDTH * 3/4; 
    public static final int SCALE = 2; 

    public static Image Player = Controls.Player; 
    public static Image BB = ImageLoader.BB; 
    public static Image Grass = ImageLoader.Grass; 

    public static boolean painting = true; 

    public static boolean Start = true; 
    public static boolean Menu; 

    public static boolean ONhs; 
    public static boolean OFFhs; 

    public void paint(Graphics g) { 
     super.paintComponent(g); 

     g.setColor(Color.GREEN); 
     g.drawString("UPS: " + Integer.toString(UPS.ups), 100, 120); 
     g.drawString("FPS: " + Integer.toString(UPS.fps), 100, 130); 

     // // MENU //// 
     if (Menu) { 
      Image Grass = ImageLoader.Grass; 
      Image onHoverStart = ImageLoader.onHoverStart; 
      Image offHoverStart = ImageLoader.offHoverStart; 

      g.drawImage(Grass, GAME_WIDTH * SCALE/4, GAME_HEIGHT * SCALE/6, null); 

      if (ONhs) { 
       g.drawImage(onHoverStart, 400, 250, null); 
      } else { 
       g.drawImage(offHoverStart, 400, 250, null); 
      } 
     } 

     // // STARTED // // 
     if (Start) { 
      Image Player = Controls.Player; 
      Image BB = ImageLoader.BB; 

      g.drawImage(BB, PlayerData.BBDirectionx, PlayerData.BBDirectiony, null); 

      g.drawImage(ImageLoader.Bot[0], Mob.BotxSELF - 32, Mob.BotySELF - 25, null); 
      g.drawImage(ImageLoader.Bot[1], Mob.BotxSELF - 32, Mob.BotySELF - 25, null); 

      g.drawImage(Player, Controls.Playerx - 45, Controls.Playery + 5, null); 
     } 
    } 

    @Override 
    public void run() { 
     while (painting) { 
      UPS.fpstick = UPS.fpstick + 1; 
      repaint(); 
      try { 
       Thread.sleep(12); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 

    public static void draw(Graphics g) { 
     g.drawImage(ImageLoader.Bot[0], 32, 25, null); 

    } 

    public Window() { 

     JFrame jf = new JFrame(); 
     JPanel panel = new JPanel(new BorderLayout()); 

     Controls c = new Controls("Window using Controls for Listener"); 

     panel.add(this); 

     this.setPreferredSize(new Dimension(GAME_WIDTH * SCALE, GAME_HEIGHT * SCALE)); 
     this.setMinimumSize(new Dimension(GAME_WIDTH * SCALE, GAME_HEIGHT * SCALE)); 
     this.setMaximumSize(new Dimension(GAME_WIDTH * SCALE, GAME_HEIGHT * SCALE)); 
     this.setBackground(Color.DARK_GRAY); 

     jf.setContentPane(panel); 
     jf.pack(); 

      jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setSize(GAME_WIDTH * SCALE, GAME_HEIGHT * SCALE); 
     jf.setVisible(true); 
     jf.setResizable(false); 

     jf.addKeyListener(c); 
     jf.addMouseListener(c); 
     jf.addMouseMotionListener(c); 

    } 

} 

Помощь очень ценится!

ответ

1

Всегда вызывайте super.XXX() метода, который вы переопределяете. Вы должны быть переопределение paintComponent():

//public void paint(Graphics g) { 
public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

Не используйте Thread.sleep() для анимации. Вместо этого вы должны использовать Swing Timer.

Простой g.drawImage в графике для каждого нового изображения исключается, потому что это нужно сделать новые изображения/ботами

Вы можете использовать один и тот же BufferedImage. При срабатывании таймера вы обновляете изображение. Затем метод paintComponent() просто рисует обновленное изображение.

+0

К сожалению, я не сменил paint() на paintComponent() после замены некоторого материала. Большинство ошибок есть из теста. Я попробую еще кое-что и опубликую свое решение. .. если я нахожу это ^^ –

0

У вас уже есть структуры, необходимые для рисования в отдельном, почему бы вам не использовать их? Это слишком похоже на домашнюю работу ...

Смежные вопросы