解决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
相关产品推荐
相关产品推荐

