2013-08-19 1 views
0

자바에서 스윙을 사용하여 2D 플랫폼 작성자로 작업 중이며 현재 게임용 프레임 워크를 개발 중입니다. reapaint()를 테스트하고 함수를 그리지 만 작동하지 않고 우둔한 경우입니다.화면에 아무것도 칠하지 않는 이유는 무엇입니까?

Window.java

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class Window extends JFrame { 

public Window() { 

    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    this.setSize(1000, 1000); 
    this.setVisible(true); 
    this.setTitle("Infiltrator"); 
    this.setLocationRelativeTo(null); 
    this.setContentPane(new Framework()); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() 
    { 
    @Override 
    public void run() 
    { new Window(); } 
    } 
              ); 

} 





} 

Panel.java

import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JPanel; 

public abstract class Panel extends JPanel { 

public Panel() { 

this.setDoubleBuffered(true); 
this.setFocusable(true); 

/* 
* 
if(false) 
{ 
    BufferedImage blankCursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB); 
    Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(blankCursorImg, new Point(0, 0), null); 
    this.setCursor(blankCursor); 
} 
* 
*/ 
} 

public static void Draw(Graphics2D g2d) { 

} 

@Override 
public void paintComponent(Graphics g) 
{ 
Graphics2D g2d = (Graphics2D)g;   
super.paintComponent(g2d);   
Framework.Draw(g2d);  
} 

} 

Framework.java이

import java.awt.Color; 
import java.awt.Graphics2D; 

import javax.swing.JFrame; 

public class Framework extends Panel { 

private static long beginTime, takenTime, sleepTime; 
private static long secInNano = 1000000000L; 
private static long secInMilli = 1000000L; 
private static long fps = 60L; 
private static long fpsTime = secInNano/fps; 

public static enum GameState {STARTING, MAINMENU, PLAYING, OVER}; 
public static GameState gameState; 

public Framework() 
{ 
    super(); 

    Thread gameThread = new Thread() { 
     @Override 
     public void run(){ 
      mainLoop(); 
     } 
    }; 

    gameState = GameState.STARTING; 

    gameThread.start(); 
} 

private void mainLoop() { 

    while (gameState != GameState.OVER) { 

     beginTime = System.nanoTime(); 

     switch (gameState) { 
      case STARTING: 
       LoadandInit(); 
       break; 
      case MAINMENU: 
       MainMenu.Update(); 
       break; 
      case PLAYING: 

       break; 
      default: 
       System.out.println("Ok, somebody messed up."); 
       break; 

     } 

     repaint(); 

     takenTime = System.nanoTime() - beginTime; 
     sleepTime = (fpsTime - takenTime)/secInMilli; 
     if (sleepTime < 10) 
      sleepTime = 10; 

     try { 
      Thread.sleep(sleepTime); 
     } catch (InterruptedException ex) { } 


    } 


} 



private static void LoadandInit() { 

    gameState = GameState.MAINMENU; 
} 


public static void Draw(Graphics2D g2d) { 

     g2d.setColor(Color.BLACK); 
     g2d.drawString("DEARP", 0, 0); 
} 

}

+0

무슨 일이 일어나고 있는지 이해하기에는 너무 많은 정적 방법/변수가 있습니다. 정적 사용은 대개 디자인 문제를 의미합니다. 기본 사항은 [사용자 정의 페인팅] (http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html)에서 스윙 튜토리얼을 시작하는 것이 좋습니다. – camickr

+0

그것은 무한 루프에 빠지나요? 'paintComponent' 구현에서'super.paingComponent()'를 제거해보십시오. – Antoniossss

+2

@Antoniossss, super.paintComponent()를 호출하여 패널 배경을 그려야합니다. 루프가 발생하지 않습니다. – camickr

답변

2

하지만 프레임 워크는 paintCompontents을 무시하지 않습니다 당신은이 책의 웹 사이트에이 장의 초안을 읽을 수 있습니다. 그것은 Panel에 의해 호출되는 정적 Draw 메서드를 가지고 있지만 패널의 인스턴스를 생성하지 않습니다.

그리기 방법을 paintComponent()로 변환하고 패널 클래스를 삭제할 수 있습니다.

또한 Framework의 생성자에서 스레드를 시작하면 안됩니다. 이로 인해 run 메소드는 멤버 변수에 대한 잘못된 값을 볼 수 있습니다. 스레드를 시작하는 새로운 시작 메소드를 작성하십시오.

+4

'paintComponent()':-)를 쓰길 바란다. –

-1

내가의 제 2 장을 추천 할 것 : 여기 내 코드입니다 Java의 킬러 게임 프로그래밍 . 당신은 당신의 창에 프레임 워크의 인스턴스를 추가하는

http://fivedots.coe.psu.ac.th/~ad/jg/ch1/index.html

+1

링크가 답이 아닙니다. 기껏해야, 이것은 의견입니다. – cHao

+0

좋지 않은 행위는 처벌받지 않을 것 같습니다. 이 장은 27 페이지 길이로 요약 할 수는 없습니다. – Michael

+0

이것이 의견으로 게시 된 경우, 나는 그것을 upvote 줄. 하지만 [답변이 아닙니다] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). – cHao

관련 문제