2

スプライトを拡張するフラッシュの「InvZone」クラスがあります。このクラスは、スプライトの子の配列を作成し、x、y、width、heightプロパティを計算して割り当て、行にそれらをaddChild(引数で指定されている行と子の数)するという考え方です。

スプライト(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スプライトのサイズが一貫して変更されますが、ライブラリの元の背景シンボルは変更されません。宣言をシフトしてADDED_TO_STAGEリスナーを追加しようとしましたが、変更はありません。誰かが手がかり棒で私を殴ってもらえますか?

更新:明確にするために:子のエッジが含まれているスプライトの境界を超えるべきではないと思います-したがって、それはまったく拡張されるべきではありません。Sanchezは症状を修正しましたが、含まれているInvZoneがInvWindowsを拡張および拡張する原因は何ですか?

UPDATE2 with solution:以下のSanchezの提案に基づいて、スケーリングの可能性を確認します-ライブラリのinvZoneに追加されたバックグラウンドスプライトが予期しない方法でスケーリングされ、境界を超えていることに気付きました。ライブラリではなくコードにバックグラウンドスプライトを追加し、h&wのクラスの引数を与え、invZoneの次元を定義させることで、問題は解決しました。

4

1 に答える 1

2

私が理解しているなら、あなたはあなたのInvZoneがコンテンツに基づいて計算されるのではなく、あなたが設定した高さと幅を返すことを望みますか?

この場合、幅と高さのゲッターをオーバーライドして値を返すことができます。

交換:

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;
}
于 2012-08-16T01:20:49.403 に答える