【问题标题】:AS3 adding children to sprite affecting sprite dimensions...wierdlyAS3将孩子添加到影响精灵尺寸的精灵......奇怪
【发布时间】:2012-08-16 00:47:45
【问题描述】:

我在 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 的 InvZone 扩展和拉伸 InvWindows 的原因是什么?

带有解决方案的 UPDATE2: 根据 Sanchez 在下面的建议,看看可能会发生什么缩放 - 我意识到添加到库中的 invZone 以赋予其维度的背景精灵正在以意想不到的方式缩放,打破界限。通过在代码中而不是在库中添加背景精灵,为其提供 h & w 类的参数并让它定义 invZone 的尺寸,问题就消失了。

【问题讨论】:

    标签: actionscript-3 flash flash-cs5


    【解决方案1】:

    如果我理解,您希望您的 InvZone 返回您设置的高度和宽度,而不是根据内容计算?

    在这种情况下,您可以覆盖宽度和高度的 getter 以返回您的值。

    替换:

    height = 100;
    width = 600;
    

    与:

    _h = 100;
    _w = 600;
    

    并添加:

    private var _w;
    private var _h;
    
    
    override public function get height():Number 
    {
       return _h;
    }
    
    override public function set height(value:Number):void 
    {
       super.height = value;
    }
    
    override public function get width():Number 
    {
       return _w;
    }
    
    override public function set width(value:Number):void 
    {
       super.width = value;
    }
    

    【讨论】:

    • 嗨 Sanchez157643 - 感谢您的回复。这确实限制了包含的精灵,但是当窗口现在大小都合适时,背景精灵现在已经缩小了,所以窗口仍然溢出背景。我认为首先创建 invWindows 的布局所涉及的数学有问题,但我不能指望它。我可以用你的新值改变背景符号的大小,但我很想知道为什么会这样。
    • this.scrollrect = new Rectangle(0, 0, 600, 100); - 这将隐藏溢出。
    • 当您问“为什么会这样”时,您的意思是,为什么添加孩子时高度或宽度会受到影响?
    • 是的,正是@Sanchez157643。 InvWindow 孩子的边界,加上填充,应该包含在包含 InvZone sprite 的边界内,至少在我能说的范围内。所以我不认为 InvZone 需要扩展。
    • 如果您将孩子添加到 InvZone,如果孩子“伸出” InvZone 边界,则会影响 InvZone 的高度或宽度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多