자바에서 스윙을 사용하여 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);
}
}
무슨 일이 일어나고 있는지 이해하기에는 너무 많은 정적 방법/변수가 있습니다. 정적 사용은 대개 디자인 문제를 의미합니다. 기본 사항은 [사용자 정의 페인팅] (http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html)에서 스윙 튜토리얼을 시작하는 것이 좋습니다. – camickr
그것은 무한 루프에 빠지나요? 'paintComponent' 구현에서'super.paingComponent()'를 제거해보십시오. – Antoniossss
@Antoniossss, super.paintComponent()를 호출하여 패널 배경을 그려야합니다. 루프가 발생하지 않습니다. – camickr