You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决Phaser中玩家与平台碰撞后平台速度异常的问题

修复平台碰撞后速度异常的问题

我来帮你搞定这个问题!你遇到的核心问题是平台没有设置为「不可移动」状态,导致玩家碰撞时的重力会干扰平台的稳定速度。下面是具体的修复步骤和原理:

1. 给平台添加immovable属性

在创建平台(包括初始平台和后续生成的新平台)时,设置body.immovable = true。这个属性的作用是:平台自身可以通过velocity保持移动,但不会被其他碰撞物体的力影响速度——完美符合你需要平台稳定移动的需求。

修改你的平台创建代码:

// 初始平台创建
var ledge = platforms.create(100, 500, 'ground');
ledge.scale.setTo(0.5, 0.5);
ledge.body.immovable = true; // 新增这一行,锁定平台不受碰撞力影响
ledge.body.velocity.y = -20; // 单独给这个平台设置速度

// 后续生成新平台的代码
var ledge = platforms.create(x, game.world.height, 'ground');
ledge.scale.setTo(0.5,0.5);
ledge.body.immovable = true; // 新平台同样设置
ledge.body.velocity.y = -20; // 单独设置速度

2. 优化速度设置逻辑

你之前用platforms.addAll('body.velocity.y', -20)会给所有平台重复设置速度,其实只需要给新创建的单个平台设置速度就够了,避免不必要的性能消耗。

3. 添加玩家与平台的碰撞检测

你当前的代码里没有处理玩家和平台的碰撞,这会导致玩家可能直接穿过平台。在update函数里补上这行:

function update() {
    // ... 其他代码 ...
    // 让玩家和平台产生碰撞交互
    game.physics.arcade.collide(player.character, platforms);
    player.move();
}

完整修改后的关键代码片段

function create() {
    game.physics.startSystem(Phaser.Physics.ARCADE);
    roofGroup = game.add.group();
    roofGroup.enableBody = true;
    var roof = roofGroup.create(0,0, 'ground');
    roof.scale.setTo(2,1);
    roof.body.immovable = true;

    platforms = game.add.group();
    platforms.enableBody = true;
    var ledge = platforms.create(100, 500, 'ground');
    ledge.scale.setTo(0.5, 0.5);
    ledge.body.immovable = true;
    ledge.body.velocity.y = -20;
    platforms.allowGravity = false;

    // ... 玩家创建等其他代码 ...
}

function update() {
    if(platforms.countLiving() < 4) {
        var x = Math.floor((Math.random() * game.world.width) + 1);
        var ledge = platforms.create(x, game.world.height, 'ground');
        ledge.scale.setTo(0.5,0.5);
        ledge.body.immovable = true;
        ledge.body.velocity.y = -20;
        platforms.allowGravity = false;
    }

    game.physics.arcade.collide(platforms, roofGroup, killPlatform, null, this);
    game.physics.arcade.collide(player.character, platforms); // 新增玩家与平台碰撞
    player.move();
}

为什么之前会出问题?

在Phaser的Arcade物理引擎中,如果不设置immovable,两个带物理体的对象碰撞时会计算动量交换。你的玩家有向下的重力,碰撞平台时会把向下的力传递给平台,导致平台速度被拉成负值——这就是你看到的异常现象。

这样修改后,平台就能稳定保持向上的速度,同时玩家可以正常站在平台上移动啦!

内容的提问来源于stack exchange,提问作者Moddaman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:56:27