1

我正在尝试创建一个街机平台,在该平台上,我的角色在跑步时会散发出一些小的灰尘颗粒。但我仍然可以让它看起来不错,我是粒子发射器的超级新手,有太多的变量要改变,我有点迷茫,也找不到任何关于 Phaser 粒子发射器的教程,只有一些例子。我什至从 Phaser 购买了 ParticleStorm,但仍然无法使其正常工作。

这是粒子代码和Player.ts类中的字符。

this.game = game;
game.physics.arcade.enable(this);

this.body.gravity.y = Player.GRAVITY;
this.body.velocity.x = 0;
this.body.maxVelocity = 500;

// Allow finger inputs on iOS/Android
this.inputEnabled = true;
this.events.onInputDown.add(this.handleInputDown, this);

// Setup keyboard cursors
this.cursors = this.game.input.keyboard.createCursorKeys();

this.animations.add('running', [5, 6, 7, 8], 20, true);

this.dustEmitter = this.game.add.emitter(0, 0, 5);
this.dustEmitter.makeParticles('dust');
this.dustEmitter.setAlpha(0.9, 1, 200);
this.dustEmitter.setScale(0.3, 1, 0.3, 1, 100, Phaser.Easing.Circular.Out);
// this.dustEmitter.minParticleScale = 0.8;
// this.dustEmitter.maxParticleScale = 1;
// this.dustEmitter.minRotation = -360;
// this.dustEmitter.maxRotation = 360;
this.dustEmitter.setXSpeed(0, 0);
this.dustEmitter.setYSpeed(0, 0);
this.dustEmitter.enableBody = true;
this.dustEmitter.gravity.set(-100, -100);

this.dustEmitter.start(false, 300, 25, -1);

然后在我的播放器代码上的 update() 函数中,我根据播放器的位置更新发射器位置:

if (this.playerState === PlayerState.RUNNING) {
    this.dustEmitter.visible = true;

    this.dustEmitter.emitX = this.x;
    this.dustEmitter.emitY = this.y + (this.height / 2);
} else {
    this.dustEmitter.visible = false;
}

我尝试了很多东西,更改变量,甚至尝试使用phaser-particle-editor网站来玩这些值,但我什至无法在我的 Phaser 游戏中复制它,即使我在网站中输入了相同的确切值。

最好的方法是什么?根据玩家的位置更新发射器位置好吗?还是我应该做点别的?我认为主要的想法或我的想法是......粒子实际上不应该跟随玩家,而是留在他们最初出现的地方。一旦玩家开始移动,灰尘就会跟随玩家的 X 和 Y 重生。但是我如何使用粒子发射器来实现这一点?

提前致谢。

4

1 回答 1

1

你提到你运行这段代码

if (this.playerState === PlayerState.RUNNING) {
    this.dustEmitter.visible = true;

    this.dustEmitter.emitX = this.x;
    this.dustEmitter.emitY = this.y + (this.height / 2);
} else {
    this.dustEmitter.visible = false;
}

在播放器更新循环中。这意味着即使您正确设置了一次发射器的位置,只要它正在运行(根据PlayerState)它就会随着播放器一起移动,因为update()每帧调用一次。您可以做的是引入一个定时事件,该事件会引发一个布尔值,然后您可以使用它来检查是否更新发射器位置。这些方面的东西:

class Player extends Phaser.Sprite {
    // ...

    private shouldUpdateEmitterPosition: boolean;

    constructor() {
        // ...

        this.game.time.events.loop(2000, () => this.shouldUpdateEmitterPosition = true, this);
    }

    public update() {
        if (this.shouldUpdateEmitterPosition && this.playerState === PlayerState.RUNNING) {
            this.dustEmitter.visible = true;

            this.dustEmitter.emitX = this.x;
            this.dustEmitter.emitY = this.y + (this.height / 2);

            this.shouldUpdateEmitterPosition = false;   
        } else {
            this.dustEmitter.visible = false;
        }
    }
}
于 2018-02-16T11:19:52.373 回答