动画一次 Phaser

Animate once Phaser

我正在使用 Phaser。这是我的代码:

 // var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { create: create });
var game = new Phaser.Game(1000, 500, Phaser.AUTO, 'phaser-example', {
        preload: preload,
        create: create,
        update: update
    });

var bmd;
var map;
var layer;
var marker;
var currentTile = 0;
var cursors;
var player;
var facing = 'left';
var jumpTimer = 0;
var jumpButtonSpacebar;
var sizeOfPlayer = 0.5;

function preload()
{
    game.load.atlasJSONHash('kisameSprite', 'assets/sprites/kisameSpriteSheet/kisameSpriteSheet.png', 'assets/sprites/kisameSpriteSheet/kisameSpriteSheet.json');
    game.load.image('back', 'assets/images/back.jpg');
}

function create()
{
    game.add.tileSprite(0, 0, 1000, 600, 'back');

    //  Creates a blank tilemap
    map = game.add.tilemap();

    //  This is our tileset - it's just a BitmapData filled with a selection of randomly colored tiles
    //  but you could generate anything here
    bmd = game.make.bitmapData(32 * 25, 32 * 2);

    var colors = Phaser.Color.HSVColorWheel();

    var i = 0;

    for(var y = 0; y < 2; y++)
    {
        for(var x = 0; x < 25; x++)
        {
            bmd.rect(x * 32, y * 32, 32, 32, colors[i].rgba);
            i += 6;
        }
    }

    //  Add a Tileset image to the map
    map.addTilesetImage('tiles', bmd);

    //  Creates a new blank layer and sets the map dimensions.
    //  In this case the map is 40x30 tiles in size and the tiles are 32x32 pixels in size.
    layer = map.create('level1', 50, 50, 32, 32);

    //  Populate some tiles for our player to start on
    map.putTile(30, 2, 10, layer);
    map.putTile(30, 3, 10, layer);
    map.putTile(30, 4, 10, layer);

    map.setCollisionByExclusion([0]);

    //  Create our tile selector at the top of the screen
    createTileSelector();

    player = game.add.sprite(64, 100, 'kisameSprite', 'stance/0.png');
    player.scale.setTo(sizeOfPlayer);
    game.physics.arcade.enable(player);
    game.physics.arcade.gravity.y = 350;

    player.body.bounce.y = 0.1;
    player.body.collideWorldBounds = true;

    player.animations.add('attack', Phaser.Animation.generateFrameNames('attack/', 0, 5, '.png', 1), 10, false, true);
    player.animations.add('left', Phaser.Animation.generateFrameNames('run/', 0, 4, '.png', 1), 10, true, true);
    player.animations.add('idle', Phaser.Animation.generateFrameNames('stance/', 0, 3, '.png', 1), 10, true, true);
    player.animations.add('right', Phaser.Animation.generateFrameNames('run/', 0, 4, '.png', 1), 10, true, true);
    player.animations.add('jump', Phaser.Animation.generateFrameNames('jump/', 0, 3, '.png', 1), 10, false, true);

    cursors = game.input.keyboard.createCursorKeys();
    jumpButtonSpacebar = game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR);

    game.input.addMoveCallback(updateMarker, this);

}

function update()
{
    game.input.keyboard.onDownCallback = somethingWasPressed;

    game.physics.arcade.collide(player, layer);

    player.body.velocity.x = 0;

    if(cursors.left.isDown)
    {
        player.body.velocity.x = -150;

        if(facing != 'left')
        {
            player.scale.setTo(-sizeOfPlayer, sizeOfPlayer);
            player.animations.play('left');
            facing = 'left';
        }
    }
    else if(cursors.right.isDown)
    {
        animateRunRight();
    }
    else
    {
        if(facing != 'idle')
        {
            player.animations.play('idle');

            if(facing == 'left')
            {
                player.frame = 5;
            }
            else
            {
                player.frame = 5;
            }

            facing = 'idle';
        }
    }

    if(jumpHasToOccur())
    {
        player.body.velocity.y = -250;

        player.animations.play('jump');

        game.time.events.add(Phaser.Timer.SECOND * 1.450, function(){player.animations.play('idle');}, this);

        jumpTimer = game.time.now + 750;
    }

}

function somethingWasPressed(keyCode)
{
    if(keyEqualTo(keyCode, "a"))
    {animateAttack();}
}

function keyEqualTo(keyCode, key)
{
    var equalKey = (keyCode.key == key);
    return equalKey;
}

function beIdle()
{
    if(facing != 'idle')
    {
        player.animations.play('idle');

        if(facing == 'left')
        {
            player.frame = 5;
        }
        else
        {
            player.frame = 5;
        }

        facing = 'idle';
    }
}

function animateAttack()
{
    player.animations.play('attack');
}

function animateJump()
{
    player.body.velocity.y = -250;

    player.animations.play('jump');

    game.time.events.add(Phaser.Timer.SECOND * 1.450, function(){player.animations.play('idle');}, this);

    jumpTimer = game.time.now + 750;
}

function animateRunRight()
{
    player.body.velocity.x = 150;

    if(facing != 'right')
    {
        player.scale.setTo(sizeOfPlayer, sizeOfPlayer);
        player.animations.play('right');
        facing = 'right';
    }
}

function animateRunLeft()
{
    player.body.velocity.x = -150;

    if(facing != 'left')
    {
        player.scale.setTo(-sizeOfPlayer, sizeOfPlayer);
        player.animations.play('left');
        facing = 'left';
    }
}

function jumpHasToOccur()
{
    var jumButtonClicked = cursors.up.isDown || jumpButtonSpacebar.isDown;
    var alreadyOnFloor = player.body.onFloor() && game.time.now > jumpTimer;
    return jumButtonClicked && alreadyOnFloor;
}

function pickTile(sprite, pointer)
{

    var x = game.math.snapToFloor(pointer.x, 32, 0);
    var y = game.math.snapToFloor(pointer.y, 32, 0);

    currentTileMarker.x = x;
    currentTileMarker.y = y;

    x /= 32;
    y /= 32;

    currentTile = x + (y * 25);

}

function updateMarker()
{

    marker.x = layer.getTileX(game.input.activePointer.worldX) * 32;
    marker.y = layer.getTileY(game.input.activePointer.worldY) * 32;

    if(game.input.mousePointer.isDown && marker.y > 32)
    {
        map.putTile(currentTile, layer.getTileX(marker.x), layer.getTileY(marker.y), layer);
    }

}

function createTileSelector()
{

    //  Our tile selection window
    var tileSelector = game.add.group();

    var tileSelectorBackground = game.make.graphics();
    tileSelectorBackground.beginFill(0x000000, 0.8);
    tileSelectorBackground.drawRect(0, 0, 800, 66);
    tileSelectorBackground.endFill();

    tileSelector.add(tileSelectorBackground);

    var tileStrip = tileSelector.create(1, 1, bmd);
    tileStrip.inputEnabled = true;
    tileStrip.events.onInputDown.add(pickTile, this);

    //  Our painting marker
    marker = game.add.graphics();
    marker.lineStyle(2, 0x000000, 1);
    marker.drawRect(0, 0, 32, 32);

    //  Our current tile marker
    currentTileMarker = game.add.graphics();
    currentTileMarker.lineStyle(1, 0xffffff, 1);
    currentTileMarker.drawRect(0, 0, 32, 32);

    tileSelector.add(currentTileMarker);

}

当我在键盘上按下 a 时,我希望动画 attack 播放一次,但它会无限播放。我的代码有什么问题?我阅读了文档,正如那边所说,我在创建新动画时使用了 false 标志,但它仍然不起作用。

尝试将您的 animateAttack() 更改为:

function animateAttack()
{
    player.animations.play('attack', 60, false);
}

第一个参数是(就像在你的代码中)要播放的动画,第二个是帧速率(默认为 60),第三个是是否循环播放动画。 documentation 表示如果未提供,将使用 loop 的先前值,因此即使您已将此动画设置为 false,它也可能会卡在 [=14] =] 出于某种原因。