【问题标题】:Java Graphics/ Basic Game LoopJava 图形/基本游戏循环
【发布时间】:2017-10-03 08:34:23
【问题描述】:

我正在用 java 创建一个 galaga 克隆。我正在尝试了解游戏循环的基础知识,但我有几个问题/疑问。我有一个更新方法可以更改所有游戏对象的位置,我有一个绘制方法可以绘制所述对象的所有更新位置。我应该调用paint() 方法吗?如何重新绘制对象(清除屏幕然后重新绘制所有内容)?另外,以固定速率调用我的 update() 方法的最佳方法是什么?感谢您的任何意见。

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);
}

【问题讨论】:

标签: java graphics


【解决方案1】:

here 找到了非常好的游戏循环代码。以为我会分享此链接以节省人们的时间!

使用具有固定时间步长的循环。代码可以大大简化,因为代码创建了一个弹跳球示例来显示帧插值以实现平滑度以及这种循环的好处。

我使用上面网站上的简化版代码创建了一个pastebin。我将游戏循环分成单独的类,并在代码中添加了更多的 cmets 以显示正在发生的事情。这样可以更轻松地创建自己的游戏,而无需通过整个游戏循环来查看正在发生的事情以及它是如何工作的。

如果对我的 pastebin 版本有任何建议,请告诉我,我会更新它:)

文件夹布局:

src
|
|--app
  |
  |--game
  | |
  | |--logic
  | | .--Game.java
  | |--loop
  |   .--GameLoop.java
  |   .--GamePanel.java
  |
  .--App.java
  .--Window.java

【讨论】:

    【解决方案2】:

    我有一个更新方法可以改变所有游戏对象的位置

    是的,很好

    我有一个绘制方法,可以绘制所述对象的所有更新位置

    啊……不太好

    我应该调用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

    【讨论】:

      猜你喜欢
      • 2014-01-21
      • 2017-02-10
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多