如何限制玩家activity?

How to limit player activity?

我有一个简单的游戏,玩家可以射击一些子弹。但是,我想让玩家每 x 秒只能发射一颗子弹。我该怎么做?

我试图通过计算子弹之间的平均时间来做到这一点,并说如果平均时间少于一秒,请不要让 space 条(射击控制)起作用。但是,我不知道如何让 space 条不起作用,这意味着玩家可能暂时不开枪,然后一次射出很多子弹。

拍摄方法大概是这样的:

public void keyPressed(KeyEvent e) {
    if (!keysDown.contains(e.getKeyCode()))
        keysDown.add(new Integer(e.getKeyCode()));

这会将键值的整数添加到数组中,然后在此处读取:

if (keysDown.contains(KeyEvent.VK_SPACE)) {
        b = new Bullets(x);
        bullCount.add(b);
        System.out.println(bullCount.get(0).getY());
        System.out.println ("There are " + bullCount.size() + "bullets alive.");
        //elapsed = System.nanoTime() - start;
        //if ((elapsed / bulletCount) < 1000000000) {


       //this is where I would say 'no more bullets shot until 
       //average time in   nanoseconds is more than 1 second!' but I don't know how


        //}

创建一个全局变量即:long lastShot
当用户射击时,在允许他射击之前检查是否 (System.currentTimeMilis()-lastShot>5000)
如果可以拍摄,就把lastShot = System.currentTimeMilis();存起来,然后进行实拍。
不行就别让他开枪。
这是一个伪代码示例:

class SomeClass {
   private long lastShot;

   public void userPressedShot() {
       if (System.currentTimeMillis()-lastShot>5000) {
            lastShot = System.currentTimeMillis();
            doTheRealShot(); 
       }       
       // Ignored till 5000 miliseconds from last shot
   }

}

对于此解决方案,我假设您使用 Player 对象。 很简单:

1.: 将类型为 long 且值为 0 的字段 lastShot 添加到您的 class.

2.: 每当玩家射击时,将 lastShot 设置为 System.currentTimeMillis()

3.: 现在,在你让他射击之前,检查 System.currentTimeMillis()-lastShot 是否小于你的子弹延迟秒数。

这将是一个必须插入播放器的 MWE class: 只需调用方法 player.shoot() 让他开枪 - 或者不开枪,如果不可能的话。

private long lastShot = 0;
//return value is for you to check if the shot happened
public boolean shoot(){
    //Did the last shot happen less than 1 second (1000 milliseconds) ago
    if(System.currentTimeMillis()-lastShot <= 1000){
        //If yes: return false, the shot can not happen
        return false;
    }else{
        lastShot = System.currentTimeMillis();
        //If no: insert your shooting code here to be executed

        //return true, the shot happened
        return true;
    }
}

一个矫枉过正的选择是使用 Guava 的 RateLimiter

final RateLimiter rateLimiter = RateLimiter.create(2.0); // rate is "2 permits per second"
while(true) {
     rateLimiter.acquire();
     shootSomething();
}

尝试使用每秒重置子弹计数的计时器:

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    public void run() {
        bullCount.clear();
    }
}, 0, 1000); // 0 is the delay in milliseconds before it starts and 1000 is the time in milliseconds between successive task executions

然后当玩家想要射击时,您只需要查看 bullCount 的大小