feat: 添加获取渲染边界的功能,计算所有精灵图的覆盖区域,确保返回的边界值有效且最小化。

This commit is contained in:
lixiangwuxian 2025-05-10 14:41:43 +08:00
parent c492839691
commit ba9126d54a

View File

@ -587,6 +587,67 @@ func (b *NamedSpriteBoard) RenderToImage() *image.RGBA {
return img return img
} }
func (b *NamedSpriteBoard) GetRenderBounds() (minX, minY, maxX, maxY int) {
// 计算所有精灵图覆盖的最大区域
// 初始化为最大/最小可能值,以便于后续比较
initialized := false
// 遍历所有精灵计算边界
currentGroup := b.indexHead
for currentGroup != nil {
currentNode := currentGroup.Head
for currentNode != nil {
sprite := currentNode.Sprite
if sprite.Image != nil {
srcBounds := sprite.Image.Bounds()
spriteMinX := sprite.Position.X
spriteMinY := sprite.Position.Y
spriteMaxX := sprite.Position.X + srcBounds.Dx()
spriteMaxY := sprite.Position.Y + srcBounds.Dy()
// 首次初始化边界值或更新边界
if !initialized {
minX, minY = spriteMinX, spriteMinY
maxX, maxY = spriteMaxX, spriteMaxY
initialized = true
} else {
// 更新边界值
if spriteMinX < minX {
minX = spriteMinX
}
if spriteMinY < minY {
minY = spriteMinY
}
if spriteMaxX > maxX {
maxX = spriteMaxX
}
if spriteMaxY > maxY {
maxY = spriteMaxY
}
}
}
currentNode = currentNode.Next
}
currentGroup = currentGroup.Next
}
// 如果没有精灵图,则使用默认大小
if !initialized {
minX, minY = 0, 0
maxX, maxY = 1, 1
}
// 确保有最小尺寸
if maxX <= minX {
maxX = minX + 1
}
if maxY <= minY {
maxY = minY + 1
}
return minX, minY, maxX, maxY
}
// SaveToPng 将精灵板渲染为图像并保存到文件 // SaveToPng 将精灵板渲染为图像并保存到文件
func (b *NamedSpriteBoard) SaveToPng(filename string) error { func (b *NamedSpriteBoard) SaveToPng(filename string) error {
// 渲染图像 // 渲染图像