Фазер столкновения двух тел

Я создал игру по поиску сокровищ на фреймворке 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>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
137
1

Ответы 1

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 хорошо с этим поработал. :)

Я сослался на тот же учебник и следовал ему, очевидно, потому что он находится на самом веб-сайте Phaser. И нет, я не смешивал две физические системы. Как видите, Аркада находится в комментариях, я оставил ее там, потому что не знаю, какой из них использовать. И спасибо, что указали на ошибку collideHandler, я ее изменил. Я обновил свой вопрос сообщением об ошибке, если вы можете это проверить.

Samhita Argula 24.10.2018 15:56

Ошибка, которую вы получаете, усиливает то, что я вижу в вашем коде. Ваш рабочий код будет запускать только P2: game.physics.startSystem(Phaser.Physics.P2JS);. Однако затем вы пытаетесь использовать систему (аркаду), которая не запущена: this.game.physics.arcade.overlap. Если вы прокомментируете эту строчку, вы обнаружите, что ваша игра начнется, но вы не сможете собрать сокровище. См. jsfiddle.net/strivinglife/81x50dLb, где я прокомментировал эту строку.

James Skemp 24.10.2018 19:02
jsfiddle.net/strivinglife/0vyutqdj это полностью перешла на аркаду. Сделано во время обеденного перерыва, поэтому можно было бы сделать некоторую очистку / оптимизацию, но это расширяет вышесказанное. Обратите внимание, что переключение на аркаду означает, что вам нужно проделать дополнительную работу, чтобы получить функциональность, подобную P2, в противном случае, если вы переключитесь на P2, вам, возможно, придется реализовать собственное перекрытие. См. github.com/photonstorm/phaser/issues/2804 для отправной точки.
James Skemp 24.10.2018 19:36

Другие вопросы по теме