java Repaint()不起作用,我不知道为什么
public static void main(String[] args){
Core game = new Core();
game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
game.frame.setTitle("Multiply");
game.frame.setIconImage(testIcon);
game.frame.add(game);
game.frame.pack();
game.frame.setLocationRelativeTo(null);
game.frame.setResizable(false);
game.frame.setVisible(true);
t1.start();
new Core().run();
}
public Core(){
KeyListener listener = new MyKeyListener();
addKeyListener(listener);
setFocusable(true);
Dimension size = new Dimension(width, height); //variable that sets the size of the window to 1280x720p
setPreferredSize(size); //Sets the size of the window to "size"
frame = new JFrame(); //makes frame into the JFrame window
}
public void run(){
running = true;
loop();
}
public void render(){
repaint();
System.out.println("runnin");
}
private synchronized void loop(){ //Running loop, while the game is open this will always be running
long lastLoopTime = System.nanoTime();
final int TARGET_FPS = 60;
final long OPTIMAL_TIME = 1000000000 / TARGET_FPS;
int fps = 0;
long lastFpsTime = 0;
while(running == true){
long now = System.nanoTime();
long updateLength = now - lastLoopTime;
lastLoopTime = now;
double delta = updateLength / ((double)OPTIMAL_TIME);
lastFpsTime += updateLength;
fps++;
if (lastFpsTime >= 1000000000)
{
System.out.println("(FPS: "+fps+")");
lastFpsTime = 0;
fps = 0;
}
enemyAI();
render();
try {
Thread.sleep( (lastLoopTime-System.nanoTime() + OPTIMAL_TIME)/1000000 );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void enemyAI(){
if(menu != true){
enemyX++;
}
}
@Override
public synchronized void paint(Graphics g) { // Draws top first to bottom last
super.paint(g);
String imagesString = "C:/Users/BigBertha/Desktop/Multiply_Game_Engine/";
Image background = Toolkit.getDefaultToolkit().getImage(imagesString+"Images/Green_Background.png");
Image character = Toolkit.getDefaultToolkit().getImage(imagesString+"Images/Character.png");
Image enemy = Toolkit.getDefaultToolkit().getImage(imagesString+"Images/Enemy.png");
Image inDevText = Toolkit.getDefaultToolkit().getImage(imagesString+"Images/InDevText.png");
Image menuScreen = Toolkit.getDefaultToolkit().getImage(imagesString+"Images/MainMenu.png");
Image menuArrow = Toolkit.getDefaultToolkit().getImage(imagesString+"Images/MainMenuArrow.png");
//Image loadingScreen = Toolkit.getDefaultToolkit().getImage(imagesString+"Images/LoadingScreen.png");
if(menu){
g.drawImage(menuScreen, 0, 0, 1290, 730, this);
if(menuAPos1){ //play
g.drawImage(menuArrow, menuArrowX1, menuArrowY1, 125, 100, this);
loading = true;
}
else if(menuAPos2){
g.drawImage(menuArrow, menuArrowX2, menuArrowY2, 125, 100, this);
}
else if(menuAPos3){
g.drawImage(menuArrow, menuArrowX3, menuArrowY3, 125, 100, this);
}
g.drawImage(inDevText, width - 95, height - 20, 100, 40, this); //removed eventually
}
else if(running){
g.drawImage(background, 0, 0, 1290, 730, this); //draws the black background
g.drawImage(inDevText, width - 95, height - 20, 100, 40, this); //removed eventually
g.drawImage(character, charX, charY, charSizeX, charSizeY, this); //draws the character
g.drawImage(enemy, enemyX, enemyY, enemySizeX, enemySizeY, this);
}
}
我需要loop()
方法才能运行repaint()
,但调用它时它什么也不做。我尝试了许多不同的变体,试图让它发挥作用,但没有任何效果。我一直在考虑使用JOGL,但我需要为学校完成至少相当数量的游戏原型
# 1 楼答案
您使用} (不释放监视器)您可以尝试^{} (释放监视器)
<>但您确实需要考虑是否需要同步整个{{CD2>}方法。如果游戏循环没有足够频繁地等待,可能会导致帧速率问题synchronized
可能导致冻结。由于run
方法从不释放监视器,因此无法输入paint
。代替^{现在还不清楚你从哪里开始
game
的线程,如果你真的开始了一个。。。(这也可能导致您看到的问题“什么都不做”。)new Core().run()
创建第二个不相关的实例,并直接在主线程上调用其run方法。相反,你应该做一些类似new Thread(core).run()
的事情。(这就是t1
吗?)您不应该在
paint
(对Toolkit.getImage
的调用)中加载图像。这样做意味着每帧加载每个文件。您应该在类或实例字段中加载资源一次在Swing程序中,我们通常不重写
public void paint(Graphics)
,而是重写protected void paintComponent(Graphics)
也看到