2014-03-30 2 views
0

안녕하세요 여러분, 저는 Java 게임 프로그래밍을 처음 접했고 지금은 Runnable 인터페이스로 작업하고 있습니다. 어떤 이유로 든 run() 메서드가 호출되지 않고 왜 확실하지 않습니다. 거기에 많은 System.out.println 문을 넣으려고했지만 인쇄되지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다! 당신은 스레드 생성자 (GamePanel에 하나 인의)의 Runnable 통과해야"Run"메서드가 작동하지 않습니다.

animator = new Thread(new GamePanel()); 

:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

import javax.swing.JPanel; 


public class GamePanel extends JPanel implements Runnable 
{ 
private final int WIDTH = 160; 
private final int HEIGHT = WIDTH/12 *9; 
private final int RATIO = 3; 

private Thread animator; 
private volatile boolean running; 
private volatile boolean gameOver; 

private double FPS = 60D; 
private double period = 1000/FPS; 

private Image dbImage; 
private Graphics dbg; 

public GamePanel() 
{ 
    setPreferredSize(new Dimension(WIDTH *3, HEIGHT*3)); 
    setBackground(Color.WHITE); 
    setFocusable(true); 
    requestFocus(); 
    terminate(); 
} 

public void addNotify() 
{ 
    super.addNotify(); 
    startGame(); 
} 

public void startGame() 
{ 
    System.out.println("Thread started"); 
    animator = new Thread(); 
    animator.start(); 
} 

public void stopGame() 
{ 
    System.out.println("Thread stopped"); 
    running = false; 
} 

public void run() 
{ 
    long beforeTime, timeDiff, sleepTime; 
    beforeTime = System.currentTimeMillis(); 
    System.out.println(beforeTime); 

    running = true; 
    while (running) 
    { 
     System.out.println("Running"); 
     gameUpdate(); 
     gameRender(); 
     paintScreen(); 

     timeDiff = System.currentTimeMillis() - beforeTime; 
     sleepTime = (long) period - timeDiff; 

     if(sleepTime <= 0) 
      sleepTime = 5; 

     try 
     { 
      Thread.sleep(sleepTime); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
     beforeTime = System.currentTimeMillis(); 
    } 
    System.exit(0); 
} 

public void gameRender() 
{ 
    if (dbImage == null) 
    { 
     dbImage = createImage(WIDTH, HEIGHT); 
    } 
    else 
     dbg = dbImage.getGraphics(); 

    dbg.setColor(Color.WHITE); 
    dbg.fillRect(0, 0, WIDTH, HEIGHT); 
} 

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    g.drawImage(dbImage, 0, 0, null); 
} 

public void gameUpdate() 
{ 

} 

private void paintScreen() 
{ 
    Graphics g; 
    try 
    { 
     g = this.getGraphics(); 
     if (g!= null && dbImage!= null) 
      g.drawImage(dbImage, 0, 0, null); 
     Toolkit.getDefaultToolkit().sync(); 
     g.dispose(); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Error: " + e.getMessage()); 
    } 
} 

public void terminate() 
{ 
    addKeyListener (new KeyAdapter() 
    { 
     public void keyPressed(KeyEvent e) 
     { 
      int keyCode = e.getKeyCode(); 
      if (keyCode == KeyEvent.VK_ESCAPE) 
      { 
       stopGame(); 
      } 
     } 
    }); 
} 


} 


import javax.swing.JFrame; 


public class GameFrame extends JFrame 
{ 
private final int WIDTH = 160; 
private final int HEIGHT = WIDTH/12*9; 
private final int RATIO = 3; 

public GameFrame() 
{ 
    setTitle("User Input Game"); 
    setSize(WIDTH*3,HEIGHT*3); 
    setLocationRelativeTo(null); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setResizable(false); 
    GamePanel mainPanel = new GamePanel(); 
    add(mainPanel); 
} 
} 




public class Main 
{ 

public static void main(String[] args) 
{ 
    new GameFrame().setVisible(true); 
} 

} 
+2

왜이 방법을 사용해야한다고 생각합니까? 누구에 의해? –

답변

1

당신은 당신의 startGame() 메소드를 변경해야합니다. 스레드는 시작할 때 실행 파일을 실행합니다.

+0

감사합니다. – MattKos

0

어디에서나 기본 방법이없는 것 같습니다. 이 클래스 또는 외부 클래스에서 GamePanel의 인스턴스를 만들고이를 Thread 클래스에 인수로 전달하는 기본 메서드가 필요합니다. 좋아요 :

public class Test 
{ 
    public static void main(String[] args) 
    { 
    Thread t = new Thread(new GamePanel()).start(); 
    } 
} 
+0

게시글에이 방법을 포함시키는 것을 잊었습니다. 방금 JFrame 클래스와 main 메소드를 추가했습니다. – MattKos

+0

이제 GameFrame 클래스에서 add (mainPanel) 행 바로 다음에 코드를 추가해야합니다. 그러면 스레드가 시작됩니다. – Alan

관련 문제