【问题标题】:Two bodies collision phaser两体碰撞移相器
【发布时间】:2018-10-24 21:53:31
【问题描述】:

我用 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.log("done");
            go = true;
          }
    }

</script>
</body>
</html>

【问题讨论】:

    标签: phaser-framework


    【解决方案1】:

    Phaser 2 有几个不同的物理系统可供使用。在这种情况下,您似乎正在混合其中两个,Arcade 和 P2。

    Part 7 of the official Phaser 2 tutorial 有一个角色和收藏品的示例,以及两者重叠时的交互。

    在您的情况下,您希望启用 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.log("done");
        go = true;
    }
    

    update 实际上每秒运行多次,此时您正在重新定义 game.collideHandler

    相反,您应该在update 之外定义函数,因此它只定义一次。同样,官方教程的第七部分也展示了这一点。 Phaser 的创建者在这方面做得很好。 :)

    【讨论】:

    • 我参考并遵循了相同的教程,显然是因为它在实际的移相器网站上。不,我没有混合 2 个物理系统。如您所见,Arcade 在 cmets 中,我把它放在那里是因为我不知道该使用哪个。并感谢您指出 collideHandler 错误,我更改了它。我更新了我遇到的错误,如果您可以查看的话。
    • 您遇到的错误正在强化我在您的代码中看到的内容。您的运行代码只会启动 P2:game.physics.startSystem(Phaser.Physics.P2JS);。但是,您随后尝试使用未启动的系统(街机):this.game.physics.arcade.overlap。如果您注释掉该行,您会发现您的游戏将开始,但您将无法收集宝藏。请参阅jsfiddle.net/strivinglife/81x50dLb,我已在其中评论了该行。
    • jsfiddle.net/strivinglife/0vyutqdj 是否完全切换到街机。在午休时间完成,因此可以进行一些清理/优化,但它扩展了上述内容。请注意,切换到街机确实意味着您必须做一些额外的工作才能获得类似 P2 的功能,否则如果您切换到 P2,您可能必须实现自己的重叠。请参阅github.com/photonstorm/phaser/issues/2804 了解起点。
    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多