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

Phaser.js方块无法正常堆叠:多方块出现穿透问题求助

解决Phaser 3方块堆叠互相穿透的问题

问题出在你只修改了方块的显示尺寸,但物理碰撞体的大小还是原始图片的尺寸,两个方块时可能刚好碰撞体还能覆盖到,数量多了就会出现穿透。

直接修改代码里的尺寸设置部分,让物理体和显示尺寸同步:

var config = {
    type: Phaser.AUTO,
    width: 320,
    height: 640,
    physics: {
        default: "arcade",
        arcade: {
            gravity: { y: 300 },
            debug: true,
        },
    },
    scene: {
        preload: preload,
        create: create,
        update: update,
    },
};
var platform, blockGroup;
var game = new Phaser.Game(config);

function preload() {
    this.load.image("ground", "assets/platform.png");
    this.load.image("block", "assets/block.png");
}

function create() {
    platform = this.physics.add.staticGroup();
    platform.create(400, 610, "ground").setScale(2).refreshBody();

    blockGroup = this.physics.add.group();

    const blockSize = 50;
    const blockCount = 5;
    // 获取原始图片尺寸,计算缩放比例
    const originalWidth = this.textures.get("block").getSourceImage().width;
    const scale = blockSize / originalWidth;

    for (let i = 0; i < blockCount; i++) {
        const block = this.physics.add.sprite(100, i * 100, "block");
        block.setCollideWorldBounds(true);
        block.setBounce(0);
        
        // 用setScale修改尺寸并刷新物理体
        block.setScale(scale);
        block.refreshBody();
        
        blockGroup.add(block);
    }

    this.physics.add.collider(blockGroup);
    this.physics.add.collider(blockGroup, platform);
}

function update() {}

关键修改点:

  • 替换displayWidth/displayHeight为setScale,确保显示尺寸和物理体尺寸匹配
  • 调用refreshBody()更新物理碰撞体的大小
  • 统一全局blockGroup变量的赋值(原代码的const会导致全局变量未被正确赋值)

如果你不想用缩放,也可以直接设置物理体大小:

// 替换setScale和refreshBody的代码块
block.displayWidth = blockSize;
block.displayHeight = blockSize;
block.body.setSize(blockSize, blockSize);

这样同样能让碰撞体与显示尺寸一致,解决穿透问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:16:03