[英]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.