如何使用pixi.js获取带世界变换的PIXI.Graphics实例边界?
嘿,我完全懂你现在的困惑!PIXI.Graphics确实有点“特立独行”,不像普通Sprite那样能直接拿到width/height或者调用getBounds就出结果,这里得注意几个关键细节:
先手动更新包围盒缓存
PIXI.Graphics的绘制内容是动态生成的,它不会在你画完形状后自动计算包围盒。如果是刚创建还没经过渲染循环的实例,你得手动触发包围盒计算,不然getBounds、calculateBounds这些方法返回的结果会是空或者不正确。给你的代码加一行关键调用就行:
var g = new PIXI.Graphics(); g.beginFill(0xFF9900); g.drawRect(-50,-50,100,100); g.endFill(); g.position.x = g.position.y = 300; // 必须先更新本地包围盒,才能拿到正确结果 g.updateLocalBounds(); // 现在就能获取包含世界变换的包围盒了 const worldBounds = g.getBounds(); console.log(worldBounds.x, worldBounds.y, worldBounds.width, worldBounds.height); // 输出:250 250 100 100(因为position是300,矩形左上角偏移-50,所以300-50=250)关于width/height属性
PIXI.Graphics本身没有直接暴露width和height的getter——毕竟它可以绘制任意不规则形状,没法像固定尺寸的Sprite那样直接返回单一的宽高值。你需要从getBounds()返回的Bounds对象里提取width和height,这才是对应图形实际占据的尺寸。calculateBounds()的正确用法
这个方法其实是存在的(Graphics继承自Container),但它属于PIXI内部的计算逻辑,通常你不需要直接调用。updateLocalBounds()或者getBounds()会自动触发它来更新包围盒数据。如果后续你修改了Graphics的绘制内容,记得再次调用updateLocalBounds(),这样getBounds才能拿到最新的包围盒。
简单来说,核心就是:画完图形后,先手动触发包围盒更新,再去获取边界数据,就能解决你遇到的“属性缺失”问题啦!
内容的提问来源于stack exchange,提问作者George Profenza

