- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 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/
我是一名优秀的程序员,十分优秀!