2014-01-05 86 views
0

我是Java的新手,我正在嘗試做一個簡單的蛇遊戲,但paint方法只會被調用一次,永遠不會再次運行,即使線程仍在運行。我嘗試了另一個修復這個網站,使用另一個類,但沒有奏效。重畫不能在線程中工作

public class Snake extends JPanel implements Runnable { 

boolean gamerunning = true; 
    int snake_x = 50, snake_y = 50, snake_dir = 2; //for snake_dir 1=up 2=right 3=down 4=left 
    int[] snake_xt, snake_yt; 

    public static void main(String args[]) { 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600,600); 
     frame.setVisible(true); 
     frame.add(new Snake()); 

     (new Thread(new Snake())).start(); 
     System.out.println("Running"); 
    } 

    @Override 
    public void run() { 
     try { 
      while (gamerunning) { 
       Thread.sleep(500); 
       System.out.println(snake_x); 
       tick(); 
       repaint(); 
      } 
     } catch (InterruptedException e) {} 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     System.out.println("painting"); 
     g.setColor(Color.black); 
     g.fillRect(snake_x, snake_y, 10,10); 
    } 

    public void tick() { 
     System.out.println("tick"); 
     switch(snake_dir) { 
      case 1: 
       snake_y -= 10; 
       break; 
      case 2: 
       snake_x += 10; 
       break; 
      case 3: 
       snake_y += 10; 
       break; 
      case 4: 
       snake_x -= 10; 
       break; 
     } 
    } 
} 
+1

對這種類型的模型很熟悉。在更新其依賴的值時,組件可能正在被繪製過程中...... – MadProgrammer

+0

您的設置不正確:必須在EDT上訪問擺動組件**的屬性 - 該規則適用於自定義屬性(如snake_x/y)與「普通」屬性(如背景)相同。從另一個線程調用tick()違反了規則。 – kleopatra

回答

1

你的問題是:你沒有添加相同的蛇你正在繪製!

frame.add(new Snake()); 

(new Thread(new Snake())).start(); 

每一行都會創建一個新的Snake,第一個被繪製,第二個被移動。

嘗試

Snake s = new Snake(); 
frame.add(s); 

(new Thread(s)).start(); 

代替。

+3

即使它在此修復程序後正常工作,仍然是解決方案的誤導性方法。這裏應該使用一個Swing'Timer'。 –

+0

好吧,還有很多其他問題,例如空的catch塊,方向的幻數,使用int []而不是Point,...但是由於OP是java的新手,它可能不是一個壞東西想法,做一些很好的舊嘗試和錯誤。 –

+1

我留下了評論,希望引起OP的興趣:) –