JavaScript - 计时器启动

时间:2013-03-21 16:25:44

标签: javascript timer setinterval timing

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

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

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”,但它并没有很好地运作。大多数时候,它会等待一秒钟,然后喷出一堆子弹。

我希望每一秒都能让敌人的子弹开始。

由于

1 个答案:

答案 0 :(得分:1)

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

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

Mozilla window.setInteral doc

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

理想情况下,你在这里做的是用一个列表注册你的敌人对象,即燃烧时钟()可以通过向所有现场敌人发射射击命令。这通过仅使用一个全局计时器而不是屏幕上每个对象的一个​​计时器来减少开销。

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

但它应该可以工作,只要在客户的CPU上没有太强烈的事情,并且有一个全球定时器用于发射船只应该允许你有很多船只开火而没有太多不良影响。 / p>