簡體   English   中英

動作3:文檔類中的數組作用域

[英]Actionscript 3: Array Scope in a Document Class

我具有以下功能來在游戲中設置紙牌。 我創建了一個數組來保存卡的種類,並創建另一個數組來保存卡的位置。

private function setPlayerCard(cardNumber:int, cardPos:int):void{
            for (var i:int = 1; i < _CardGridInstance.numChildren+1; i++) {
                var _position:MovieClip = MovieClip(_CardGridInstance.getChildByName("Position_" + i));
                cardPositions[i] = _position;
                cardPositions[i].pos_name.text = "position" + i;
                cardPositions[i].id = ["pos"+i];
            }


            for (var j:int = 1; j < numCards+1; j++) {
                var _c:Class = getDefinitionByName("Card_" + j) as Class;
                var _cardInstance:MovieClip = new _c();
                cards[j] = _cardInstance;
            }
            cards[cardNumber].x = _CardGridInstance.x + cardPositions[cardPos].x - 1;
            cards[cardNumber].y = _CardGridInstance.y + cardPositions[cardPos].y;
            addChild(cards[cardNumber]);
        }

因此,如果我要將卡號“ 3”設置在位置“ 5”,則只需輸入:

setPlayerCard(3,5);

我看到的問題是,每次我想放置一張卡時,每次都會創建兩個陣列。 我想將數組設置為“全局”(即在我的文檔類的構造函數中創建它)並在函數“ setPlayerCard”中重用它,但是當我嘗試這樣做時會出錯。

有什么建議么?

對於Singleton靜態類數據模型,這是一個完美的案例。 您可以從整個應用程序中獲取Singleton的實例,因為它是靜態類,並且可以包含兩個數組而無需重復。

pixelbreaker有一個不錯的基本Singleton AS3示例,您可以從中構建。

在不知道如何創建變量以及遇到什么錯誤的情況下,很難准確回答。 您可以張貼整個課程和所有錯誤嗎?

use the Singleton pattern. 我可以,但是,建議您使用Singleton模式。 對於Singleton來說,這不是一個完美的案例。 Singleton模式在OOP中沒有位置,它像OO一樣包裝在過程編程中,但這是其他地方的一個論點。

但是,對於類級別的變量來說,這是一個完美的案例。 以下是一個簡單的示例。 雖然有一些缺少的變量聲明(numCards),但我不知道您要在哪里創建和設置它們。

package{
    import flash.display.Sprite;
    public class CardGame extends Sprite{

       private var cardPositions:Array = new Array();
       private var cards:Array = new Array();

       public function CardGame(){
           for var i:uint = 1; i <= _CardGridInstance.numChildren; i++) {
                var position:MovieClip = MovieClip(_CardGridInstance.getChildByName("Position_" + i));
                cardPositions[i] = position;
                cardPositions[i].pos_name.text = "position" + i;
                cardPositions[i].id = ["pos"+i];
            }
            for(i = 1; i <= numCards; i++) {
                var c:Class = getDefinitionByName("Card_" + i) as Class;
                var cardInstance:MovieClip = new c();
                cards[i] = cardInstance;
            }
        }

        private function setPlayerCard(cardNumber:uint, cardPos:uint):void{
            cards[cardNumber].x = _CardGridInstance.x + cardPositions[cardPos].x - 1;
            cards[cardNumber].y = _CardGridInstance.y + cardPositions[cardPos].y;
            addChild(cards[cardNumber]);
        }
    }
}

這樣,您只需創建和填充一次數組,就可以從CardGame類中的任何位置訪問它們。 它們不是全局的,但在setPlayerCard方法的范圍內。

由於可能在調用Document Class的構造函數時未實例化對象,因此可能會出現錯誤,但是可以解決。

變量必須是公共的和靜態的?

靜態表示變量在類上,而不在類的實例上。 因此,每個“ CardGame”實例將共享相同的靜態變量。 我想,因為這是文檔類,所以您最多只能有一個實例。 因此沒有理由。

唯一的其他原因(因為您將其聲明為公共)是通過CardGame.cardPositions從Class外部訪問變量。 這是一種不好的做法,因為您不應允許其他對象直接操縱Classs內部數據。 這破壞了封裝。 由於這是文檔類,並且是層次結構的頂部,因此您應該將數據副本傳遞給需要它的任何對象,然后等待事件來檢索更新的數據。 這樣,您可以在使用數據之前對其進行清理,而不僅僅是盲目地信任其他對象以尊重您的數據。

http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

我嘗試使用Singleton類,但是由於必須引用顯示列表中已經存在的MovieClip,因此我選擇了與“ Actionscript 3 Day of the Day”不同的解決方案:

http://www.kirupa.com/forum/showthread.php?p=2110830#post2110830

package {

public class ClassName {
       public static var myArray_1:Object = new Object;
       public static var myArray_2:Object = new Object;
public function ClassName() {
       //constructor
       Whatever();
       DoStuffWithWhatever();
}

private function Whatever() {
     // put stuff into the array here

}
private function DoStuffWithWhatever():void {
    // do stuff with the array values here.
}

   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM