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

