Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3向精灵添加子元素会影响精灵的维度…非常复杂_Actionscript 3_Flash_Flash Cs5 - Fatal编程技术网

Actionscript 3 AS3向精灵添加子元素会影响精灵的维度…非常复杂

Actionscript 3 AS3向精灵添加子元素会影响精灵的维度…非常复杂,actionscript-3,flash,flash-cs5,Actionscript 3,Flash,Flash Cs5,我在flash中有一个“InvZone”类,它扩展了sprite。其思想是,这个类将创建一个Sprite子元素数组,计算并为它们指定x、y、width和height属性,然后将它们添加到行中(参数中指定了多少行和子元素) 精灵(invZone)及其子对象(invWindow)都在Flash库中。在那里,它们添加了符号以提供背景,并确保其初始起始尺寸不为0 我的问题是-添加子对象的行为似乎抛出了InvZone实例的高度和宽度值。我希望如果子项(行和列合计)以某种方式超过InvZone的初始维度,但

我在flash中有一个“InvZone”类,它扩展了sprite。其思想是,这个类将创建一个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]);
            }
        }
    }       
}   
}
所以最后一行不知怎么地推着包含的精灵-但我不知道这是怎么发生的。高度不是唯一受影响的值-包含的宽度可以用不同的变量吹出。发生这种情况时,所有InvWindow精灵都会一致更改大小,但不会更改库中的原始背景符号。我试着改变声明,在舞台上增加听众,但没有改变。有人能用线索棒打我吗

更新:澄清一下:我认为孩子们的边缘不应该超出包含精灵的边界,所以看起来它根本不应该扩展。桑切斯已经修复了这个症状,但是什么原因导致了InvZone扩展和拉伸了InvWindows


使用解决方案更新2:根据桑切斯的建议,查看可能的缩放效果-我意识到添加到库中invZone的背景精灵以提供一个维度,以意外的方式缩放,打破了边界。通过在代码中而不是在库中添加背景精灵,为其提供h&w类的参数并让其定义invZone的尺寸,问题就解决了。

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

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

替换:

height = 100;
width = 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=新矩形(0,0,600,100);-这将隐藏溢出。当你问“为什么会发生这种情况”时,你的意思是,当你添加一个孩子时,为什么高度或宽度会受到影响?是的,正是@Sanchez157643。InvWindow子项的边界,加上填充,应该包含在包含InvZone精灵的边界内,至少尽可能接近我所知。因此,我不希望InvZone需要展开。如果向InvZone添加子项,则如果子项“伸出”InvZone边界,则会影响InvZone的高度或宽度。
_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;
}