2013-12-20 51 views
0

我一直在尝试解决,但它永远不会改变屏幕。我试图使用在render()方法中看到的图形。告诉我,如果渲染方法内部出现问题,我可以放松一下,因为我似乎无法找到问题所在。为什么屏幕不会变色?

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.*; 

import javax.swing.JFrame; 

public class Game extends Canvas implements Runnable { 
private static final long serialVersionUID = 1L; 
public static int width = 300; 
public static int height = width/16*9; 
public static int scale = 3; 

private Thread thread; 
private boolean running = false; 
private JFrame frame; 

public synchronized void start() { 
    thread = new Thread(); 
    thread.start(); 
    running = true; 
} 

public synchronized void stop() { 
    running = false; 
    try{ 
     thread.join(); 
    }catch(InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

public Game() { 
    Dimension size = new Dimension(width * scale, height * scale); 
    setPreferredSize(size); 

    frame = new JFrame(); 
} 

public void run() { 
    while(running) { 
     tick(); 
     render(); 
    } 
} 

void tick() {} 

public void render() { 
    BufferStrategy bs = getBufferStrategy(); 
    if(bs==null){ 
     createBufferStrategy(3); 
     return; 
    } 

    Graphics g = bs.getDrawGraphics(); 
    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    bs.dispose(); 
    bs.show(); 
} 
public static void main(String[] args) { 
    Game game = new Game(); 

    game.frame.setResizable(false); 
    game.frame.setTitle("Rain"); 
    game.frame.add(game); 
    game.frame.pack(); 
    game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    game.frame.setLocationRelativeTo(null); 
    game.frame.setVisible(true); 

    game.start(); 
} 

} 
+1

您在展示()之前将BufferStrategy放置()。那不好。 –

+0

我试过了。似乎没有工作。 – user2469009

+0

您的代码看起来与[此问题]非常相似(http://stackoverflow.com/questions/20547542/bufferstrategy-not-working/20547780#20547780)。我会尝试比较你的代码,因为我认为他们可能使用相同的教程。 – DoubleDouble

回答

1

让我给你一个错误的堆栈跟踪。

你的渲染方法甚至没有在这里被调用。
这是因为你的run方法根本没有被调用。
所有这一切背后的原因是,在线程创建时您没有传递正确的Runnable对象。它创建一个空运行的线程。
在你的启动方法,只需更换

thread = new Thread(); 

thread = new Thread(this); 

,它应该工作。

希望这有助于。请享用。

+0

它工作。感谢:D – user2469009

相关问题