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

Phaser 3中Tilemap与玩家碰撞后整体位移异常问题求助

问题解决方案

核心问题定位

你给Tilemap Layer添加了物理体(this.physics.add.existing(layer)),这会让整个图层变成动态物理对象,玩家碰撞时自然会推动它。Tilemap Layer的碰撞不需要给整个层加物理体,Phaser的瓦片地图系统本身支持基于单块瓦片的碰撞检测。

修正步骤

1. 移除错误的物理体添加代码

删掉这行:

this.physics.add.existing(layer)

2. 保留正确的瓦片碰撞设置

layer.setCollisionBetween(1, 8, true)这行是对的,它会给数组中1-8号瓦片开启碰撞,0号空白瓦片默认无碰撞,完全符合你的场景需求,不需要额外处理空白瓦片。

3. 确认玩家物理体正确性

确保你的player是通过this.physics.add.sprite这类方法创建的动态物理对象,没有错误设置immovable属性。

修正后的完整代码

var room = [
  [1, 2, 2, 3],
  [4, 0, 0, 8],
  [4, 0, 0, 8],
  [5, 6, 6, 7],
];

this.map = this.make.tilemap({ data: room, tileWidth: 64, tileHeight: 64 });
var tiles = this.map.addTilesetImage("wall");
var layer = this.map.createLayer('wallLayer', tiles, 0, 0);
// 仅为指定范围的瓦片开启碰撞
layer.setCollisionBetween(1, 8, true);
// 建立玩家与瓦片层的碰撞器
this.physics.add.collider(layer, this.player);

额外排查点

  • 检查wall瓦片集图像的尺寸是否和tileWidth:64, tileHeight:64完全匹配,避免瓦片渲染错位导致碰撞区域偏移
  • 若相机跟随玩家,确认没有误操作修改Tilemap Layer的位置属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:31:17