Phaser 3中用圆形作为物理组对象报错的技术咨询
Phaser 3 自定义圆形激光及复合物理对象问题解决
错误原因分析
你碰到的Uncaught TypeError: child.addToDisplayList is not a function有两个核心问题:
- 错误继承了
Phaser.Physics.Arcade.Body——Phaser中物理体是依附于游戏对象的组件,而非让自定义类直接继承Body类。 - 你创建的
Ellipse未添加到场景显示列表,物理系统处理时找不到必要的显示方法。
正确的圆形激光实现方式
无需继承Body,应让自定义激光类继承游戏对象(比如Phaser.GameObjects.Ellipse),再为其启用Arcade物理体:
export class Laser extends Phaser.GameObjects.Ellipse { constructor(scene: Phaser.Scene, x: number, y: number) { // 宽高一致的椭圆就是圆形 super(scene, x, y, 25, 25, 0x00ff00); // 将图形添加到场景显示列表 scene.add.existing(this); // 启用Arcade物理体 scene.physics.add.existing(this); // 设置物理属性(示例:向上飞行) if (this.body) { (this.body as Phaser.Physics.Arcade.Body).setVelocityY(-300); // 可手动调整碰撞范围(默认与图形一致) // (this.body as Phaser.Physics.Arcade.Body).setCircle(12.5); } } }
多形状组成的物理对象实现
完全可以创建由多个矩形/圆形组合的物理对象,推荐用Phaser.GameObjects.Container组合图形后添加物理体:
示例:复合形状物理对象
export class CompositeObject extends Phaser.GameObjects.Container { constructor(scene: Phaser.Scene, x: number, y: number) { super(scene, x, y); // 向容器添加多个形状 const circle = new Phaser.GameObjects.Ellipse(scene, 0, 0, 20, 20, 0xff0000); const rect = new Phaser.GameObjects.Rectangle(scene, 20, 0, 30, 15, 0x0000ff); this.add([circle, rect]); // 添加到场景显示列表 scene.add.existing(this); // 启用物理体并设置属性 scene.physics.add.existing(this); if (this.body) { const body = this.body as Phaser.Physics.Arcade.Body; body.setSize(50, 20); body.setOffset(-25, -10); body.setVelocityX(100); } } }
若需要更精准的碰撞形状,还可通过setPolygon()、setCircle()等方法手动定义碰撞区域;如果需要每个形状独立碰撞,也可以用物理组管理多个独立物理对象。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

