2013-04-19 1 views
0

나는 매 10 초 지연 간격 후에 동일한 이미지의 새로운 이미지를 화면에 페인트하려고합니다. 나는 나 자신을 알아 내려고 노력해 왔고 나는 또한 사물을 보았지만 도움이되는 것을 찾을 수 없었다.지연된 후에 새 이미지를 얻으려면 어떻게해야합니까?

내 구체적인 문제는 원본 이미지를 사용하여 새 이미지를 페인트하는 방법을 모르겠다는 것입니다. 10 초마다 새로운 이미지가 나타나야하고, ID 배열 다음에 ID 배열 (IDx [0] = x; IDx [0] = y;)을 따르는 ID 배열을 시작하려고합니다.

일반 g 새로운 이미지/봇을 그릴 때마다 그래픽 이미지의 .drawImage가 없어지는 것을 막을 수 있습니다. 그러나 목표는 자동적 인 방식으로 동일합니다.

내 창 :

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을 사용해야합니다. 나는 새로운 이미지/봇

같은 BufferedImage를 사용할 수 있습니다을 그릴 필요하기 때문에

모든 새로운 이미지에 대한 그래픽에서 일반 g.drawImage

을 배제한다. 타이머가 작동하면 이미지를 업데이트합니다. 그런 다음 paintComponent() 메서드는 업데이트 된 이미지를 페인트합니다.

+0

죄송합니다. 일부 물건을 교체 한 후에 paint()를 paintComponent()로 변경하지 않았습니다. 대부분의 실수는 테스트 물건에서 비롯됩니다. 나는 더 많은 것들을 시도하고 내 솔루션을 게시 할 것입니다. .. 나는 그것을 찾는다. ^^ –

0

당신은 이미 별도의 thred을 그리는 데 필요한 구조를 가지고 있습니다. 왜 사용하지 않으시겠습니까? 이것은 내게 너무 숙제처럼 보입니다 ...

관련 문제