Я не совсем уверен, что это ответит на ваш вопрос, но это будет слишком долго для простого комментария:
Есть ряд мест, где выпозвонив update()
напрямую.Например, game.time.events.add(Phaser.Time.SECOND, update, this);
и game.time.events.add(Phaser.Time.SECOND * 5, update, this);
.При условии правильной настройки, update
будет автоматически вызван Phaser, и нет необходимости вызывать его самостоятельно.Это, вероятно, вызывает проблемы.
При определении анимаций вы также можете определить, что произойдет, когда они завершатся, или цикл.См. Официальную документацию для onComplete
и onLoop
.См. Также Пример анимационных событий для примера использования.Это было бы лучше, чем, например, ниже:
knight.animations.play('teleport', 7, true);
knight.visibile = false;
game.time.events.add(4000, blinkTele, this);
//canBlink = false;
После этого вы сможете связать их вместе, чтобы сделать то, что вы хотите.
Обновление
Вот краткий рабочий пример использования Phaser 2.4.4:
var game = new Phaser.Game(800, 600, Phaser.AUTO, '', {
preload: preload, create: create, update: update
});
function preload() {
this.load.crossOrigin = 'anonymous';
game.load.image('sky', 'https://jamesskemp.github.io/PhaserTutorials/Official-Making-A-Game/assets/sky.png');
game.load.image('platform', 'https://jamesskemp.github.io/PhaserTutorials/Official-Making-A-Game/assets/platform.png');
game.load.spritesheet('dude', 'https://jamesskemp.github.io/PhaserTutorials/Official-Making-A-Game/assets/dude.png', 32, 48);
}
var platforms;
var player;
var cursors;
var leftAnimation;
var rightAnimation;
var canMove = true;
function create() {
// Enable arcade physics.
game.physics.startSystem(Phaser.Physics.ARCADE);
// Background image.
game.add.sprite(0, 0, 'sky');
// Includes ground and the ledges.
platforms = game.add.group();
// Enable physics for all objects in this group.
platforms.enableBody = true;
// Create the ground.
var ground = platforms.create(0, game.world.height - 64, 'platform');
// Scale the image to fit the width of the game.
ground.scale.setTo(2, 2);
// Ground is solid and doesn't move.
ground.body.immovable = true;
// Create the player.
player = game.add.sprite(32, game.world.height - 150, 'dude');
// Enable physics on the player.
game.physics.arcade.enable(player);
player.body.bounce.y = 0.2;
player.body.gravity.y = 300;
player.body.collideWorldBounds = true;
// Player has walk animations, at 10 frames per second.
leftAnimation = player.animations.add('left', [0, 1, 2, 3], 10);
rightAnimation = player.animations.add('right', [5, 6, 7, 8], 10);
rightAnimation.onComplete.add(animationComplete, this);
leftAnimation.onComplete.add(animationComplete, this);
// Enable keyboard cursor support.
cursors = game.input.keyboard.createCursorKeys();
}
function animationComplete() {
console.log('animation complete, moving to random location');
player.x = game.rnd.integerInRange(10, game.world.width - 10);
canMove = true;
}
function update() {
// The player and platforms should collide.
game.physics.arcade.collide(player, platforms);
// Reset the player's velocity.
player.body.velocity.x = 0;
if (canMove) {
if (cursors.left.isDown) {
canMove = false;
// Move to the left.
player.body.velocity.x = -150;
player.animations.play('left');
} else if (cursors.right.isDown) {
canMove = false;
// Move to the right.
player.body.velocity.x = 150;
player.animations.play('right');
}
}
// Player can jump if they're touching ground.
if (cursors.up.isDown && player.body.touching.down) {
player.body.velocity.y = -350;
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/phaser/2.4.4/phaser.min.js"></script>
К сожалению, неизвестных переменных достаточно, чтобы я не смог воспроизвести ваш пример для проверки своих теорий, но я попытался бы установить переменную, когда вы запустите анимацию телепортации ипроверьте это в update
.Сначала я бы попытался обернуть всю логику движения.
onComplete
сработает только после завершения анимации, чего не произойдет, если запустится другая анимация, такая как ваша последняя else
, где запускается knight.animations.play('stand');
.