我需要正确更新我的 Phaser 3 文本

I need to update my phaser 3 text properly

所以我希望我的 phaser 文本每秒自动更新,我该怎么做?

我想要的场景

import Phaser from '../lib/phaser.js'

export default class Game extends Phaser.Scene {
  constructor() {
    super('game')
  }

  init() {
    this.energy = 0;
  }

  preload() {
    this.load.spritesheet('wheel', 'assets/imgs/game/wheel.png', {
      frameWidth: 64,
      frameHeight: 64
    });
    this.load.image('islands', 'assets/imgs/game/the islands.png');
    this.load.image('backdrop', 'assets/imgs/game/backdrop.png');
    this.load.spritesheet('waterfall', 'assets/imgs/game/waterfall sprite sheet.png', {
      frameWidth: 128,
      frameHeight: 256
    });
    this.load.spritesheet('sea', 'assets/imgs/game/sea.png', {
      frameWidth: 800,
      frameHeight: 50
    });
  }

  create() {
    this.add.image(400, 300, 'backdrop')

    const Waterfall = this.add.sprite(400, 510, 'waterfall');
    this.anims.create({
      key: 'falldown',
      frames: this.anims.generateFrameNumbers('waterfall', {
        start: 0,
        end: 8
      }),
      frameRate: 10,
      repeat: -1
    });

    Waterfall.anims.play('falldown');

    const sea = this.add.sprite(400, 575, 'sea');
    this.anims.create({
      key: 'move',
      frames: this.anims.generateFrameNumbers('sea', {
        start: 0,
        end: 6
      }),
      frameRate: 6,
      repeat: -1
    });

    sea.anims.play('move');

    this.add.image(400, 500, 'islands')

    const wheel = this.add.sprite(375, 400, 'wheel');
    this.anims.create({
      key: 'turn',
      frames: this.anims.generateFrameNumbers('wheel', {
        start: 0,
        end: 6
      }),
      frameRate: 6,
      repeat: -1
    });

    const wheel1 = this.add.sprite(430, 450, 'wheel');
    this.anims.create({
      key: 'turn',
      frames: this.anims.generateFrameNumbers('wheel', {
        start: 0,
        end: 6
      }),
      frameRate: 6,
      repeat: -1
    });

    const wheel2 = this.add.sprite(375, 500, 'wheel');
    this.anims.create({
      key: 'turn',
      frames: this.anims.generateFrameNumbers('wheel', {
        start: 0,
        end: 6
      }),
      frameRate: 6,
      repeat: -1
    });

    this.energy = this.add.text(25, 50, 'Energy (MW): 0', {
        color: '#000',
        fontSize: 24
      })
      .setInteractive()
      .on('pointerdown', () => {
        this.energy++
          this.energy = `Energy (MW): ${this.energy}`
      })

    wheel2.anims.play('turn');
    wheel1.anims.play('turn');
    wheel.anims.play('turn');


  }

  update() {
    this.energy++
      this.energy = `Energy (MW): ${this.energy}`
  }
}

can some please help me.


this text is very problematic with the text and it stays energy 0 and doesn't change and there is also nothing in console
everything is working but the text update and I'm doing this as a functional script for a school project

您需要将文本变量和能量值分开。

此外,您应该像这样在 constructor 之前创建变量:

energyText: Phaser.GameObjects.Text;
energy: number;

constructor(){
    super('game')
}

init(){
    this.energy = 0;
}

create(){
    this.energyText = this.add.text(25, 50, 'Energy (MW): 0', {
        color: '#000',
        fontSize: 24
    });
}

update(){
    this.energy++;
    this.energyText.setText("Energy (MW): " + this.energy.toString());
}

注意:update 函数被调用 every frame 而不是 every second, 所以如果你想每秒更新变量,你也可以写一些逻辑脚本。

timeElapsed: number;
maxTime: number;

init(){
    this.energy = 0;
    this.timeElapsed = 0;
    this.maxTime = 1;
}

update(time: number, delta: number) // note this parameter, 'delta' is in ms.
{
    let deltaInSecond = delta/1000; // convert it to second
    this.timeElapsed = this.timeElapsed + deltaInSecond;
    
    if(this.timeElapsed >= this.maxTime) // if the time elapsed already more than 1 second, update the energy variable
    {
        this.energy++;
        this.energyText.setText("Energy (MW): " + this.energy.toString());
        this.timeElapsed = 0; // don't forget to reset it to zero again.
    }
}