我在 Flash 中有一个扩展 sprite 的“InvZone”类。这个想法是,这个类将创建一个 Sprite 子元素数组,计算并分配 x、y、width 和 height 属性给它们,然后按行添加它们(在参数中指定了多少行和子元素)。
精灵 (invZone) 及其子对象 (invWindow) 都在 Flash 库中。在那里,它们添加了符号以提供背景并确保它们的初始起始尺寸不为 0。
我的问题是 - 添加子项的行为似乎丢弃了 InvZone 实例的高度和宽度值。我希望如果孩子(行和列的总数)以某种方式超过了 InvZone 的初始尺寸,但我的代码应该阻止这种情况(除非我在某些问题上是代码盲)。
这是课程代码:
package pnc.gui {
import flash.display.Sprite;
import pnc.gui.InvWindow;
public class InvZone extends Sprite {
public const PADDING_X:int = 5
public const PADDING_Y:int = 5
public var invWindowArray = new Array();
public var invArray = new Array();
private var windows:int;
private var rows:int;
public function InvZone(inputX:int, inputY:int, inputHeight:int, inputWidth:int, inputWindows:int, inputRows:int) {
//normally these would set by args, but today we'll set them by hand
height = 100;
width = 600;
x=0;
y=0;
windows = 16
rows = 3
init()
}
private function init() {
var windowsPerRow:int = Math.ceil(windows/rows);
var rowHeight:Number = (height - (2*PADDING_Y))/rows;
var columnFullWidth:Number = (width - (2*PADDING_X))/windowsPerRow
for (var i = 0; i<windows; i++) {
var currentRow:int = Math.floor(i/windowsPerRow)
var invWindow:InvWindow = new InvWindow();
invWindowArray.push(invWindow);
invWindowArray[i].x = (columnFullWidth * (i%windowsPerRow)) + PADDING_X;
//trace("X:"+invWindowArray[i].x)
invWindowArray[i].y = (rowHeight * currentRow) + PADDING_Y;
//trace("Y:"+invWindowArray[i].y)
invWindowArray[i].height = rowHeight - PADDING_Y;
//trace("HEIGHT:"+invWindowArray[i].height)
invWindowArray[i].width = columnFullWidth - PADDING_X;
//trace("WIDTH:"+invWindowArray[i].width)
trace(" ContainingSpriteHeight: " + height + " rowHeight: " + rowHeight + " currentRow: " + currentRow);
if (invWindowArray[i]) {
addChild(invWindowArray[i]);
}
}
}
}
}
这是跟踪:
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 0
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 0
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 0
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 0
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 0
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 0
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 1
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 1
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 1
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 1
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 1
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 1
ContainingSpriteHeight: 100 rowHeight: 30 currentRow: 2
ContainingSpriteHeight: 128.55 rowHeight: 30 currentRow: 2
ContainingSpriteHeight: 128.55 rowHeight: 30 currentRow: 2
ContainingSpriteHeight: 128.55 rowHeight: 30 currentRow: 2
所以最后一行以某种方式推动了包含的精灵 - 但我不知道这是如何发生的。高度不是唯一受影响的值 - 包含的宽度可以用不同的变量放大。发生这种情况时,所有 InvWindow sprite 会一致地更改大小,但不会更改库中的原始背景符号。我尝试转移声明并添加 ADDED_TO_STAGE 侦听器,但没有任何变化。有人可以用线索棒打我吗?
更新:澄清:我不认为孩子的边缘应该超过包含精灵的边界 - 所以AFAIK它根本不应该扩展。Sanchez 已经修复了这个症状,但是包含 InvZone 扩展和拉伸 InvWindows 的原因是什么?
带有解决方案的 UPDATE2:根据 Sanchez 在下面的建议采取行动,看看可能会发生什么缩放 - 我意识到添加到库中的 invZone 以赋予它一个维度的背景精灵正在以意想不到的方式缩放,打破了界限。通过在代码中而不是在库中添加背景精灵,为其提供 h & w 类的参数并让它定义 invZone 的尺寸,问题就消失了。