2012-08-16 88 views
2

我在Flash中有一个'InvZone'类来扩展精灵。这个想法是这个类将创建一个Sprite子元素的数组,并为它们计算和分配x,y,width和height属性,然后在行中添加它们(在参数中指定多少行和子元素)。AS3将子项添加到精灵影响精灵尺寸......很有趣

精灵(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 

所以最后一行是某种推挤包含Sprite的 - 但我很茫然,以这是怎么发生的。高度不是唯一受影响的值 - 包含的宽度可以用不同的变量吹出。发生这种情况时,所有InvWindow精灵都会一致地改变大小,但不会改变库中的原始背景符号。我试过转移声明并添加了ADDED_TO_STAGE监听器,但没有任何改变。有人可以用线索棒打我吗?

更新:澄清:我不认为儿童的边缘应该超过含有精灵的边界 - 所以AFAIK它不应该扩展。桑切斯已经修复了症状,但是包含InvZone扩展和扩展InvWindows的原因是什么?

UPDATE2与解决方案:代理下面桑切斯的建议,看看,看看有什么可以被缩放 - 我认识的背景精灵加入到invZone在图书馆给它一个维度是缩放以意想不到的方式,打破了界限。通过在代码中而不是在库中添加背景精灵,给它提供h类的参数并让它定义invZone的尺寸,问题就消失了。

回答

2

如果我明白了,你希望你的InvZone返回由你设置的高度和宽度,而不是根据内容计算出的beining?

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

替换:

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; 
} 
+0

喜Sanchez157643 - 感谢您的答复。这确实会限制包含的精灵,但是当窗口现在尺寸合适时,背景精灵现在已经缩小,所以窗口仍然溢出背景。我认为首先创建invWindows布局涉及的数学有些问题,但我无法将它放在手指上。我可以用你的新值改变背景符号的大小,但我很想知道它为什么会发生。 – BSBWebTeam 2012-08-16 01:50:42

+0

已更新,以澄清剩余的查询并通知@ Sanchez157643 – BSBWebTeam 2012-08-16 05:27:50

+0

this.scrollrect = new Rectangle(0,0,600,100); - 这将隐藏溢出。 – 2012-08-16 10:29:19