如何使用 Phaser 3 在我的无尽奔跑者中显示滑动动画

How to display a sliding animation in my endless runner using Phaser 3

我正在尝试使用 Phaser 3 制作无尽的 运行ner 游戏。我已经让他 运行 并跳跃,但我不知道如何让他滑动(我想因为动画 运行 在更新功能中持续 运行ning)有没有办法让他滑动几秒钟然后 return 开始播放。请非常需要和接受任何建议或答案。谢谢。

如果您使用arcade physics-engine,您可以使用setAccelerationX,然后播放器可以滑动,当按键没有被按下时。精灵“幻灯片”的数量取决于您设置的 dragDocumentation (在文档的这一页上,您可以找到 accelerationdrag 和其他使用的方法 and/or 属性的更多信息)

这里有一个小演示,展示了这个:

var config = {
    type: Phaser.AUTO,
    width: 400,
    height: 160,
    physics: {
        default: 'arcade',
        arcade: {
            gravity: { y: 100 },
        }
    },
    scene: {
        create,
        update
    }
}; 

var cursors;
var player;
var playerStateText;

function create () {
    cursors = this.input.keyboard.createCursorKeys();
    playerStateText = this.add.text(10,10, 'Playerstate: ???', {color: '#ffffff'});
    
    let ground = this.add.rectangle(-40, 120, 480, 50, 0xBAF0FF).setOrigin(0);
    player = this.add.rectangle(20, 20, 30, 30, 0xcccccc).setOrigin(0);
    
    ground = this.physics.add.existing(ground);
    ground.body.setImmovable(true);
    ground.body.allowGravity = false;
    
    player = this.physics.add.existing(player);
    
    // Just to be sure that the player doesn't get too fast
    player.body.setMaxSpeed(160); 
    
    // Tweak this value to define how far/long the player should slide
    player.body.setDrag(120, 0);
    
    this.physics.add.collider(player, ground);      
}

function update (){
    let currentState = 'Playerstate: running';
    if (cursors.left.isDown){
        player.body.setAccelerationX(-160);
    } else if (cursors.right.isDown) {
        player.body.setAccelerationX(160);
    }
    else {
        player.body.setAccelerationX(0);
        if(Math.abs(player.body.velocity.x) > 3) {
           currentState = 'Playerstate: sliding';
        } else if(Math.abs(player.body.velocity.y) > 3) {
           currentState = 'Playerstate: falling';
        } else {
           currentState = 'Playerstate: stopped';
        }
    }
    
    if(player.x > 400){
       player.x = -20;
    }
    
    if(player.x < -20){
       player.x = 400;
    }
    
    playerStateText.setText(currentState);
}

new Phaser.Game(config);
<script src="//cdn.jsdelivr.net/npm/phaser@3.55.2/dist/phaser.js"></script>

然后您可以根据当前玩家的动作、速度或其他属性设置正确的动画。

更新:

如果您只想显示不同的动画,而不需要任何特殊的交互或功能,您可以像本例中解释的那样链接动画:http://phaser.io/examples/v3/view/animation/chained-animation

只需链接 运行Slide 动画,然后它们将始终以正确的顺序播放,而不会改变您的代码。如果你想在滑动过程中改变速度,那就更麻烦了。

你可以checkout/useevents of animation,这样你就可以对动画进行操作了:开始,停止、完成等等....

例如:如果玩家在着陆后滑动,它可能看起来像这样:

  player.on(Phaser.Animations.Events.ANIMATION_COMPLETE_KEY + 'jump', function (anims) {
       player.chain([ 'slide', 'run' ]);
   }, this);

简单地说,也许你可以使用“let som=true; if(som==true){runnerfunction()}”,当滑动按钮将被使用时“som=false”