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