【问题标题】:Phaser - How to properly implement Arcade Physics Collisions with Phaser.jsPhaser - 如何使用 Phaser.js 正确实现 Arcade 物理碰撞
【发布时间】:2015-09-11 05:57:53
【问题描述】:

我在网上浏览了一些教程并查看了文档,但这似乎让我更加困惑。

问题:

所有精灵都在这段代码中初始化了它们的物理特性:

// Store all Sprites in an Array for easy access
var x64_guys = [Player, Dave, EvilDave];

// Sprite physics properties. Give the little guys some life.
hal.physics.arcade.enable(x64_guys, Phaser.Physics.ARCADE);

for(var j=0; j<x64_guys.length;j++){
    x64_guys[j].body.collideWorldBounds = true;
    x64_guys[j].body.bounce.x = true;
    x64_guys[j].body.bounce.y = true;
}

其中hal 等于new Phaser.Game(window.innerWidth, window.innerHeight, Phaser.AUTO, "stage", { preload: preload, create: create, update: update });

现在我假设这可以很好地初始化这样的物理?

如果是这样,那么我对如何检测 PlayerEvilDave 碰撞以及在碰撞时启动功能(例如 Player 死亡或 EvilDave 受伤)感到相当困惑。 (字符为 64x64 像素)

如果有人可以帮助我,我将不胜感激。

【问题讨论】:

    标签: javascript 2d phaser-framework collision


    【解决方案1】:

    PlayerEvilDave 等是 Sprite 的实例吗?您没有显示代码,因此很难确定。

    启用物理的调用应该是这样的:

    hal.physics.arcade.enable(x64_guys);

    虽然我会完全放弃使用“hal”的做法,而是使用“this”。您不需要将常量作为第二个参数,因为无论如何您都直接在 Arcade Physics 管理器上启用。

    以上所有代码都发生在 create 函数中吗?如果没有,应该是。

    这也是错误的:body.bounce.x = true; Bounce 是一个 Phaser.Point 对象,而不是布尔值,因此它期望为其分配一个值。如果要启用 100% 完全反射弹跳,请将其设置为 1:body.bounce.x = 1;

    要检查PlayerEvilDave 之间的冲突,您需要将其添加到您的update 函数中:

    function update() {
    
        // object1, object2, collideCallback, processCallback, callbackContext
        game.physics.arcade.collide(Player, EvilDave, collisionHandler, null, this);
    
    }
    
    function collisionHandler (obj1, obj2) {
    
        //  The two sprites are colliding
        game.stage.backgroundColor = '#992d2d';
    
    }
    

    您可以在网站上的 Sprite 与 Sprite 示例中查看完整代码。非常值得仔细查看。

    【讨论】:

    • 我想过将hal重构为this.game。另外我相信我从碰撞教程中得到了body.bounce.x = true,或者我相信,不完全确定。是的,现在可以了,感谢您的帮助!另外:问题 - 这是来自 htmldev 论坛的“丰富”吗?
    • JS Fiddle 中的代码(CORS 显然不允许使用图像):jsfiddle.net/Lgxhzxmu
    • 是的,它是来自 html5gamedevs 的“丰富”。我建议不使用“hal”的原因是,为了采取正确的方法,您应该尝试完全不使用对游戏变量的全局引用。尽管示例这样做只是为了速度/可破解性,但在结构合理的项目中,您会使用可用的状态级别变量(this.physics、this.math 等)
    • 哦我知道了,我暂时在全局范围内使用它来调试和查看控制台中的道具! :)
    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多