Я создал игру по поиску сокровищ на фреймворке Phaser. У меня есть плеер и сокровища. Но когда игрок сталкивается с сокровищем, игра не останавливается, как предполагалось.
Я пробовал использовать несколько синтаксисов с разных сайтов. game.physics.arcade.overlap() кажется правильной функцией с правильным синтаксисом.
Это ошибка, которую я получаю для обработчика столкновений: PhysicsType error
Я хочу, чтобы игра остановилась с сообщением о выигрыше и вышла из игры.
<!DOCTYPE html>
<html lang = "en">
<html>
<head>
<meta charset = "UTF-8" />
<title>TreasureHunter</title>
<link rel = "stylesheet" href = "index.css">
<script src = "js/phaser.min.js"> </script>
</head>
<body>
<script type = "text/javascript">
var game = new Phaser.Game(640,640,Phaser.AUTO,'',{preload: preload, create: create , update: update});
var player;
var cursors;
var go = false;
var static;
function preload()
{
game.load.image('background', 'assets/background.png');
game.load.spritesheet('dude', 'assets/dude.png',32,48);
game.load.image('treasure', 'assets/treasure.png');
}
function create()
{
// game.physics.startSystem(Phaser.Physics.ARCADE);
game.physics.startSystem(Phaser.Physics.P2JS);
game.add.sprite(0,0, 'background');
// player
player = game.add.sprite(0,0,'dude',5);
game.physics.p2.enable(player);
goal = game.add.sprite(615,280, 'treasure');
game.physics.p2.enable(goal);
goal.body.static = true;
player.animations.add('left',[0,1,2,3],10,true);
player.animations.add('right',[5,6,7,8],10,true);
cursors = game.input.keyboard.createCursorKeys();
}
function update()
{
if (go)
{
return;
}
player.body.velocity.x = 0;
player.body.velocity.y = 0;
if (cursors.left.isDown)
{
player.body.velocity.x = -150;
player.animations.play('left');
}
else if (cursors.right.isDown)
{
player.body.velocity.x = 450;
player.animations.play('right');
}
else if (cursors.up.isDown)
{
player.body.velocity.y = -150;
player.animations.play('up');
}
else if (cursors.down.isDown)
{
player.body.velocity.y = 450;
player.animations.play('down');
}
else {
player.animations.stop();
player.frame = 4;
}
// Checks for treasure and calls goal funcn
this.game.physics.arcade.overlap(this.player, this.goal, this.collideHandler, null, this);
game.collideHandler = function(player,goal)
{
goal.destroy();
console.info("done");
go = true;
}
}
</script>
</body>
</html>





Phaser 2 имеет несколько различных физических систем, которые можно использовать. В этом случае похоже, что вы смешиваете два из них, Arcade и P2.
Часть 7 официального руководства по Phaser 2 имеет пример наличия персонажа и предмета коллекционирования, а также взаимодействия, когда они пересекаются.
В вашем случае вы хотите включить game.physics.startSystem(Phaser.Physics.ARCADE); вместо game.physics.startSystem(Phaser.Physics.P2JS);. Вы также хотите включить аркадную физику для отдельных спрайтов, например game.physics.arcade.enable(player);.
Я настоятельно рекомендую сначала следовать и настраивать официальное руководство, приведенное выше, для последовательного обучения; это неплохо.
Глядя на свой код, вы также сталкиваетесь с еще одной важной проблемой.
В вашем update у вас есть этот код:
game.collideHandler = function(player,goal)
{
goal.destroy();
console.info("done");
go = true;
}
update на самом деле запускается много раз в секунду, и в этот момент вы переопределяете game.collideHandler.
Вместо этого вы должны определить функцию вне update, чтобы она определялась только один раз. Опять же, седьмая часть официального руководства также демонстрирует это. Создатель Phaser хорошо с этим поработал. :)
Ошибка, которую вы получаете, усиливает то, что я вижу в вашем коде. Ваш рабочий код будет запускать только P2: game.physics.startSystem(Phaser.Physics.P2JS);. Однако затем вы пытаетесь использовать систему (аркаду), которая не запущена: this.game.physics.arcade.overlap. Если вы прокомментируете эту строчку, вы обнаружите, что ваша игра начнется, но вы не сможете собрать сокровище. См. jsfiddle.net/strivinglife/81x50dLb, где я прокомментировал эту строку.
Я сослался на тот же учебник и следовал ему, очевидно, потому что он находится на самом веб-сайте Phaser. И нет, я не смешивал две физические системы. Как видите, Аркада находится в комментариях, я оставил ее там, потому что не знаю, какой из них использовать. И спасибо, что указали на ошибку collideHandler, я ее изменил. Я обновил свой вопрос сообщением об ошибке, если вы можете это проверить.