2013-08-19 3 views
0

Я работаю над 2D-платформером, используя swing в java, и в настоящее время я разрабатываю рамки для игры. Я тестирую функции reapaint() и draw, но они не работают, и я не знаю. Вот мой код:Почему ничего не рисует на моем экране?

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

Слишком много статических методов/переменных для меня, чтобы понять, что происходит. Использование static обычно означает проблему проектирования. Я предлагаю вам начать с учебника Swing по [Custom Painting] (http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html) для основ. – camickr

+0

Он попадает в бесконечный цикл? попробуйте удалить 'super.paingComponent()' из вашей реализации 'paintComponent'. – Antoniossss

+2

@Antoniossss, вы всегда должны ссылаться на super.paintComponent(), чтобы убедиться, что фон панели окрашен. Это не вызовет цикл. – camickr

ответ

2

Вы хотите добавить экземпляр Framework для вашего окна, но рамки не отменяет paintCompontents. Он имеет статический метод Draw, который вызывается Panel, но вы никогда не создаете экземпляр панели.

Вы можете преобразовать метод Draw для paintComponent() и удалить класс Panel.

Также вы не должны начинать свою нить внутри конструктора для Framework. Это может привести к тому, что метод run увидит неправильные значения для переменных-членов. Создайте новый метод запуска, который запускает поток.

+4

Надеюсь, вы хотели написать 'paintComponent()' :-) –

-1

Я бы рекомендовал главе 2 Программирование игры Killer в Java , Вы можете прочитать черновик главы на сайте книги:

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

+1

Ссылки не являются ответами. В лучшем случае это комментарий. – cHao

+0

Ничего хорошего не осталось безнаказанным. Глава длиной 27 страниц, я не могу суммировать это в ответе. – Michael

+0

Если бы это было опубликовано как комментарий, я бы его повысил. Но [это не ответ] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). – cHao