繁体   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