2014-06-28 60 views
0

嗯,我很(剛剛開始幾個月前)編程新手,我正在學習java。如何在java中使用定時器移動精靈?

反正我怎樣使用定時器使精靈的舉動說:

private Timer timer = new Timer(5000,this); 

和雪碧這樣的:

private JLabel player = new JLabel(new ImageIcon("Sprites/apple.png")); 

有了這樣的構造:

public timing() 
{ 
    Container c = getContentPane(); 
    c.setLayout(null); 
    setVisible(true); 
    setSize(1280,720); 
    player.setBounds(x,y,100,100); //Use this for moving! 
    c.add(player); 

    timer.start(); 
    addKeyListener(
     new KeyAdapter(){ 

     public void keyPressed(KeyEvent e){ 
       String key = e.getKeyText(e.getKeyCode()); 
       if(key.equals("Down")) 
       { 
        What Do I put Here? 
       }}}); 


} 

所以每一秒,精靈

player 

會像

x+=5 and y+=5 

移動。當我使用

public void paint(Graphics g) 
{ 
    super.paint(g); 
    player.setBounds(x,y,100,400); 
} 

(我很抱歉,我只是一個孩子學習JAVA)

+0

你應該搜索這個網站的'Swing Timer Animation',這就是你應該做的。有幾個很容易找到的好例子。 –

+0

查看[Motion Using the Keyboard](http://tips4java.wordpress.com/2013/06/09/motion-using-the-keyboard/)瞭解一些示例。 'KeyboardAnimation'就是使用Timer的例子,但你應該首先了解其他的學習基礎。 – camickr

+0

讓我說明: 當我按下向下鍵時,我想讓精靈使用定時器移動。 like: 我按下向下鍵 Sprite移動5秒 – AkihiroSato

回答

0

我假設你想要什麼要做的是當你按下「向下」你想啓動一個計時器。

你可以做的是:

if(key.equals("Down")) 
{ 
    long start=System.currentTimeMillis(); 
    while(start%5000==0) 
     repaint(); 
} 

什麼重繪()所做的就是調用paint()方法。因此: 你應該做的是在paint()方法中繪製圖像。 當你調用repaint()時,你調用paint(),所以你需要做的是在paint()方法中將x和y增加5。

結果:每次重繪()時,都會擦除該組件中的所有內容,然後重新繪製,但使用此x + 5 y + 5座標給出圖像移動的效果。

希望這會有所幫助,祝你好運!

0

在你的paint()方法中,創建一個Ellipse2D對象並使用fill方法渲染「player」。

爲簡化起見,假定 「玩家」 是一個圓

class DrawSurface extends JComponent{ 
public void paint(Graphics g){ 

    Graphics2D g = (Graphics2D) g; 
    x_pos += 5; 
    Shape player = new Ellipse2D.Float(x_pos, 0, 30, 30); 
    g.setColor(Color.RED); 
    g.fill(player); 

} 
} 

在你的按鍵方法,添加以下

public void keyPressed(KeyEvent e){ 
      String key = e.getKeyText(e.getKeyCode()); 
      if(key.equals("Down")){ 
      DrawSurface canvas = new DrawSurface(); 
      ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(3); 
      executor.scheduleAtFixedRate(canvas.paint(), 0L, 30L, TimeUnit.MILLISECONDS); 
      } 
} 

scheduleAtFixedRate在每30個時間單位執行paint()方法反覆