2017-05-05 55 views
0

我正在用java创建一个galaga克隆。我想了解游戏循环的基础知识,并且有几个问题/问题。我有一个更新方法可以改变所有游戏对象的位置,我有一个绘制方法可以绘制所有对象的所有更新位置。我是否应该调用paint()方法?如何重新绘制对象(清除屏幕然后再绘制一切)?另外,以固定速率调用update()方法的最佳方式是什么?感谢您的任何意见。Java图形/基本游戏循环

public Galaga() throws IOException 
{ 
    //set the background 
    setBackground(Color.BLACK); 

    //create a controller 
    c = new Controller(); 
    addKeyListener(c); 
    setFocusable(true); 

    //create a player 
    player = new Ship(40,50); 
    running = true; 

} 


public void paint(Graphics g) 
{ 
    super.paint(g); 
} 

//game loop 
public void run() 
{ 
    while(running) 
    { 
     draw(getGraphics()); 
     if(c.right()) 
      player.move(1, 0); 
    } 
} 

//update logic 
public void update() 
{ 

} 

//renders all objects 
public void draw(Graphics g) 
{ 
    player.draw(g); 
} 
+1

你叫'重绘()'或切换到[活跃渲染(https://docs.oracle.com /javase/tutorial/extra/fullscreen/rendering.html) –

+0

如果你只是想了解Swing,你在做什么是好的。但是,如果你真的打算制作游戏,[Swing可能不适合你。](https://pavelfatin.com/low-latency-painting-in-awt-and-swing/)是[更好的游戏选项]。(https://www.lwjgl.org/) – markspace

回答

0

我必须改变所有的游戏的位置更新方法的对象

是的,好

和我有吸引所有的更新位置的抽签方法的物体

啊......不太好

我是否应该调用paint()方法?

不,你不应该这样做,事实上,你也不应该打电话给getGraphics,这不是绘画是如何完成的。

您通常会呼叫repaint触发新的涂料循环。

看一看Painting in AWT and SwingPerforming Custom Painting绘画在Swing中如何工作 - 我假设你正在使用基于Swing的方法,你使用

此外,要小心,Swing是单线程的 - 见Concurrency in Swing欲了解更多详情和How to use Swing Timers更多简单的解决方案。

如果您仍然想使用Thread,请注意,由于任何原因(无法控制),随时都可能出现此绘画,因此您需要了解更新状态时出现脏污的风险

如果你想在油漆/更新周期更多的控制,那么你应该看看BufferStrategy and BufferCapabilities