0

我对用 Java 创建游戏有些陌生,但是我当前的设置是,绘制方法上的 FPS 仅受系统限制。所以,我的 FPS 往往在 300 到 450 之间。为了标准化对象的移动速度,我一直将增量除以 FPS,以便它在一秒的时间范围内增加该总量。

我有以下代码。根据 FPS,我想做map.addEntity()的不是每秒调用 300 或 400 次;而是让我可以选择,例如,以 10 RPS 左右的速度发射弹丸。我怎样才能做到这一点?

public void mousePressed(MouseEvent e) {
     if (gameStarted)
        shootProjectile = true;
  }
public void paint(Graphics g) {
if (shootProjectile)
           map.addEntity(new Projectile("projectile.png", x, y, 0, projectileSpeed));
}
4

2 回答 2

2

我一直在将增量除以 FPS

不要那样做!使用 aTimer或 aswingTimer以恒定速率更新所有内容。例如,您可以执行以下操作:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

public class Test {   
    public static void main(String[] args) throws InterruptedException {
        Timer timer = new Timer(10,new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                updateProjectilePositions();
            }

        });
        timer.start(); 
    }

    private static void updateProjectilePositions() {
        // TODO Auto-generated method stub
    }
}

请注意,如果您使用 swing Timer,您的弹丸更新将发生在摆动线程上。如果更新挂起,您的 GUI 也会挂起。

你也不应该map.addEntity在里面打电话,paint()因为paint()只做一件事和一件事:画一切。您可以解决这个问题,但是将更新位置之类的代码与渲染对象的代码混合起来最终会咬到您。

于 2013-01-20T05:32:23.247 回答
2

你永远不应该使用 FPS 作为你的量化器,否则你的游戏将在不同的机器上以不同的速度运行,甚至根据帧丢失或峰值在同一台机器上运行。

你可以做两种不同的事情:

  • 在每帧更新之间使用增量时间并按比例更新您的游戏逻辑
  • 使用一个累加器,在其中添加时间增量,然后每隔固定量触发一次逻辑更新(这样您就不需要按比例做事,因为您的逻辑更新将被修复)
于 2013-01-20T05:34:48.120 回答