gpt4 book ai didi

javascript - 如何在 Phaser 3 中每分钟运行一个函数?

转载 作者:行者123 更新时间:2023-12-05 01:35:44 25 4
gpt4 key购买 nike

我正在用 JavaScript 制作游戏,但在类能量提升中,我想每分钟创建一次能量提升。问题是它是在类的update方法中调用的,而这个是在主更新的每一帧调用的,所以一旦运行,就不会再停止,一直循环。我怎样才能让它停止并重新开始?

我正在尝试像这样获得秒数:

方法创建加电:

let time = new Date.getSeconds();
if (time >=59) {create power up}

power up类的方法更新:

this.createpowerup();

现在在主类中,我从我拥有的类中调用所有更新方法:

update() {
this.player_spaceship_object.update();
this.enemy_spaceship_object.update();
this.power_up_object.update();
this.movebackground();
}

所以每一帧它都会调用它们,但问题是当 power up 以 0 结束时,它会产生很多 power ups 直到它开始 1,开始 1 有几毫秒,如何在循环中做到这一点?

通电类:

class Power_ups extends Phaser.GameObjects.Sprite {
constructor(scene) {
super(scene, scene.player_spaceship.x, scene.player_spaceship.y, "power_up");
//this.hi();
}
hi() {
setInterval(this.hola,5000);
}
hola() {
console.log("hola");
}
update() {
this.hi();
}
}

主类,这是进入页面后运行的类:

class Scene2 extends Phaser.Scene {
constructor() {
super("Scene2");
}
create() {
this.scoreText;
this.timedEvent;
this.background = this.add.tileSprite(0,0,globalThis.config.width,globalThis.config.height,"space");
this.background.setOrigin(0,0);
this.player_spaceship = this.physics.add.sprite(globalThis.config.width/2-50,globalThis.config.height/2,"player_spaceship");
this.player_spaceship_object = new Player_spaceship(this);
this.enemy_spaceship_group = this.physics.add.group();
this.enemy_spaceship_object = new Enemy_spaceship(this);
this.physics.add.collider(this.player_spaceship,this.enemy_spaceship_group,this.collision_player_enemy,null,this);
this.power_up;
this.power_up_object = new Power_ups(this);
this.power_up_object.createpowerUp();

}
collision_player_enemy(player, enemy) { //parameters tells the function the objects that will collide
this.player_spaceship_object.damage();
this.enemy_spaceship_object.resetShip(enemy);
}
movebackground(bool = "") {
this.background.tilePositionY = (bool === true) ? this.background.tilePositionY += 1 : this.background.tilePositionY -= 1;
}
update() {
this.player_spaceship_object.update();
this.enemy_spaceship_object.update();
this.power_up_object.update();
this.movebackground();
}
}

最佳答案

Phaser 3 有多种选择。

首先,您当然可以向场景中的内置 update() 功能添加一些逻辑。但是,如果这样做,您将需要手动跟踪上次添加 Prop 的时间以及需要添加另一个 Prop 的时间。

例如,您可以在场景中添加一个属性来跟踪下一次应该添加 powerup 的时间,然后如果当前时间等于或晚于该时间,则创建一个 powerup,然后更新属性值(当前时间 + 1 分钟)。

更简单的方法可能是使用 Phaser 3 的内置定时器功能。

在您的场景中,添加一个属性来跟踪 TimerEvent ,因为这将允许您稍后暂停或停止它。

接下来,在场景的 create() 中创建计时器事件。

TypeScript 示例:

export default class MainGame extends Phaser.Scene {
// Store the timer so we can access it later.
private triggerTimer: Phaser.Time.TimerEvent;

public create(): void {
// ...
this.triggerTimer = this.time.addEvent({
callback: this.timerEvent,
callbackScope: this,
delay: 60000, // 1000 = 1 second
loop: true
});
// ...
}

public timerEvent(): void {
console.log('timerEvent');
// Create your new object here.
}
}

无论哪种方式,在您的游戏 Sprite 中,您都应该删除 update() 中触发 hi() 的功能,因为这会有效地导致您的 Sprite 创建新的计时器场景(以及每个 Sprite )更新的时间。

如果您希望事件在 Sprite 创建后 x 秒触发,您应该在 构造函数 中定义计时器(通过 setInterval 或 Phaser 计时器)。

关于javascript - 如何在 Phaser 3 中每分钟运行一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62725455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com