0

我试图让我的敌人每秒开火。现在 - 这是每一帧。

在我的敌人对象中,我有一段代码在玩家处于范围内时启动:

this.shotBullet = false;
var object = this;
object.Fire();

这是敌人开火功能:

this.Fire = function(){

    console.debug("Firing | Shot: " + this.shotBullet);

    if(!this.shotBullet){   

        if(this.weapon == "pistol")
            PistolEnemy(this);  

        this.shotBullet = true;

    }

};

还有我的 PistolEnemy 函数:

PistolEnemy = function(operator){

    var user = operator;

    console.debug("user:" + user.tag);

    var bulletDamage = 1;
    var bulletSpeed = 20;

    var b = new Rectangle( user.x + (user.width / 2) - 4, user.y + (user.height / 2) - 4, 8, 8);
    var velocityInstance = new Vector2(0, 0);

    velocityInstance.x = Math.cos(user.rotation) * bulletSpeed;
    velocityInstance.y = Math.sin(user.rotation) * bulletSpeed;


    var bulletInstance = new Bullet(velocityInstance, b, "Enemy", bulletDamage, "blue");

    /*audioPistol.volume = 0.5;
    audioPistol.currentTime = 0;
    audioPistol.play();*/

    user.bullets.push(bulletInstance);
    user.shotBullet = true;

};

我尝试过使用“setInterval”,但效果不佳。大多数时候,它会等待一秒钟,然后喷出大量子弹。

我想要的只是让敌人的子弹每秒启动一次。

谢谢

4

1 回答 1

1
var triggerID = window.setInterval(function(){firing_clock()},1000);

function firing_clock()
{
// this will execute once per second....sort of
}

Mozilla window.setInteral 文档

因此,您应该知道的一件事是,如果您的浏览器繁忙,它将“迟到”。Mozilla 曾经有一个额外的非标准参数详细说明“实际延迟”,但现在不再这样做了 - 但关键是您要求浏览器每秒尝试执行一次操作,但如果它变得繁忙,它将落后或跳过几轮(浏览器处理它的方式因浏览器而异)。

理想情况下,您在这里要做的是将您的敌人对象注册到一个列表中,该列表会通过fire_clock() 将射击命令发送给所有活生生的敌人。这通过仅使用一个全局计时器而不是屏幕上每个对象一个计时器来减少开销。

只用一个硬编码的敌人试试这个,看看它是如何工作的。如果它仍然不起作用,那么这是一个更大的问题,因为我知道没有javascript“保证准确的计时器”。

但它应该可以工作,只要客户端的 CPU 上的事情不会变得太紧张,并且拥有一个用于船舶发射的全局计时器应该可以让你有大量的船舶在没有太多不良影响的情况下开火。

于 2013-03-21T16:40:59.463 回答