我希望你顺利。
我目前正在制作游戏,主要是为了学习目的,并且遇到了一些麻烦。我有一个为敌人运行的嘀嗒功能,它可以控制它的移动并检测它是否与舞台的边缘相互作用。如果它到达舞台的边缘,那么角度会改变,然后朝另一个方向移动。一旦发生这种情况,就会发生" 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;
。有没有办法暂停孩子的滴答功能,然后一旦将新的孩子添加到舞台后再开始?这就是我现在所感受到的,但我可能是错的。
非常感谢任何帮助。
谢谢。
答案 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();
}
问题在于现在有更多的敌人在舞台上,但这个初始问题暂时是固定的。