是否可以暂停特定孩子的滴答功能?

时间:2014-07-01 12:16:03

标签: javascript html5-canvas easeljs

我希望你顺利。

我目前正在制作游戏,主要是为了学习目的,并且遇到了一些麻烦。我有一个为敌人运行的嘀嗒功能,它可以控制它的移动并检测它是否与舞台的边缘相互作用。如果它到达舞台的边缘,那么角度会改变,然后朝另一个方向移动。一旦发生这种情况,就会发生" bounceRate"减少,一旦bounceRate达到0,它就会消失,生命就会消失。

然而,一旦第一个敌人被移除,生命开始不断减少,而不仅仅是一次。我已经设法"暂停"一旦敌人弹跳率达到0,敌人的蜱虫功能就会在第一个被移除后第二个孩子出现在舞台上。

以下是相关代码:

全球滴答功能

function tick(event) {
    stage.update(event);
    for (enemy in enemyCamp) {
        var e = enemyCamp[enemy];
        e.tick(event);
    }
}

敌人的勾选功能

enemy.tick = function(event) {
    if (!this.paused) {
        this.x += this.vX;
        this.y += this.vY;
        if (this.bounceRate <= 0) {
            if (this.x > canvasWidth || this.x < 0 || this.y > canvasHeight || this.y < 0) {
                var bounced = false;
                if(!bounced) {
                    bounced = true;
                    this.paused = true;
                    this.bouncedEnemy();
                }
            }
        } else {
            if (this.x > canvasWidth + 20) {
                this.angle = 180 - randomIntFromInterval(-90, 90);
                this.updateEnemy();
            }
            if (this.x < 20) {
                this.angle = 180 - randomIntFromInterval(90, 270);
                this.updateEnemy();
            }
            if (this.y > canvasHeight + 20) {
                this.angle = 360 - Math.floor(Math.random() * 180);
                this.updateEnemy();
            } 
            if (this.y < 20) {
                this.angle = 360 - randomIntFromInterval(180, 360);
                this.updateEnemy();
            }
        }
    }
    stage.update(event);
}

到达舞台边缘时更新敌人

enemy.updateEnemy = function() {
    this.bounceRate--;
    this.direction = this.angle * Math.PI / 180;
    this.rotation = this.angle;
    this.vX = Math.cos(this.direction) * this.speed;
    this.vY = Math.sin(this.direction) * this.speed;
}

敌人已经&#34;反弹&#34;

enemy.bouncedEnemy = function() {
    lives--;
    this.active = false;
    displayLives.text = "Lives " + Number(lives).toString();
    var displayedEnemys = enemyCamp.getNumChildren();
    enemyPen.removeChild(this);
    if ((displayedEnemys < level) || (displayedEnemys <= 0)) {
        spawnEnemy();
    }
    stage.update();
}

产生敌人

function spawnEnemy() {
    if (level > 1) {
        var w = 0;
        for (w;w<level;w++) {
            spawnRate++;
            enemyCamp[spawnRate] = new Enemy();
            enemyPen.addChild(enemyCamp[spawnRate]); //Enemy pen is a container
        }
    } else {
        spawnRate++;
        enemyCamp[spawnRate] = new Enemy();
        enemyPen.addChild(enemyCamp[spawnRate]);
    }
    stage.update();
}

目前,滴答功能运行一次,然后一旦孩子从舞台上移除后停止运行。一旦敌人被创建,就会调用this.paused = false;。有没有办法暂停孩子的滴答功能,然后一旦将新的孩子添加到舞台后再开始?这就是我现在所感受到的,但我可能是错的。

非常感谢任何帮助。

谢谢。

1 个答案:

答案 0 :(得分:0)

我设法解决了我遇到的问题。在检查我的代码时,我注意到了一些事情。

首先,我将我的敌人Tick逻辑(计算弹跳等)移动到主刻度函数

function tick(event) {
    stage.update(event);
    for (enemy in enemyBeach) {
        var t = enemyBeach[enemy];
        e.tick(event);
        e.paused = false;
        if (!e.paused) {
            if (e.x > canvasWidth + 20) {
                e.angle = 180 - randomIntFromInterval(-90, 90);
                e.updateEnemy();
            }
            if (e.x < 20) {
                e.angle = 180 - randomIntFromInterval(90, 270);
                e.updateEnemy();
            }
            if (e.y > canvasHeight + 20) {
                e.angle = 360 - Math.floor(Math.random() * 180);
                e.updateEnemy();
            } 
            if (e.y < 20) {
                e.angle = 360 - randomIntFromInterval(180, 360);
                e.updateEnemy();
            }
            if (e.bounceRate <= 0) {
                if (e.x > canvasWidth + 20 || e.x < -20 || e.y > canvasHeight + 20 || e.y < -20) {
                    var bounced = false;
                    if(!bounced) {
                        bounced = true;
                        e.paused = true;
                        e.bouncedEnemy();
                    }
                }
            }
        }
    }
}

这在一定程度上起作用,但生命仍然比预期更快下降,所以我在弹跳功能中添加了以下内容。 if (this.active)。现在生命只下降了一个,但此后敌人没有产卵。我注意到在我的弹跳功能中,我在移除一个之前计算屏幕上的敌人总数。所以以下如果没有正确计算

if ((displayedEnemys < level) || (displayedEnemys <= 0)) {
    spawnEnemy();
}

问题在于现在有更多的敌人在舞台上,但这个初始问题暂时是固定的。