2009-12-16 7 views
0

게임에 카드를 설정하는 다음 기능이 있습니다. 나는 종류의 카드를 보관할 하나의 배열을 만들고 카드의 위치를 ​​잡을 다른 배열을 만들었습니다. 내가 카드 번호를 설정하려면Actionscript 3 : 문서 클래스의 배열 범위

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"함수에서 재사용하고 싶습니다. 그렇게하려고하면 오류가 발생합니다.

제안 사항?

답변

1

이것은 싱글 톤 정적 클래스 데이터 모델의 완벽한 경우입니다. 정적 클래스이므로 응용 프로그램 전체에서 Singleton 인스턴스를 가져올 수 있으며 중복되지 않은 두 배열을 포함 할 수 있습니다.

pixelbreaker에는 빌드 할 수있는 멋진 기본 Singleton AS3 예제가 있습니다.

+0

좋은 아이디어! 지금 Singleton 클래스를 구현하려고합니다. 내 질문은 ... Singleton 클래스를 구현하는 방법에 대한 몇 가지 문서를 살펴본 후 두 클래스간에 표시 목록 개체를 참조하는 방법에 대해 조금 확신하지 못합니다. 예를 들어, 만들고 싶은 배열은 다른 클래스의 표시 목록에 추가 한 MovieClip을 기반으로합니다. 클래스 1 : 표시 목록에 MovieClip을 추가하고 "foo"라고합니다. Singleton "foo"안에있는 항목의 배열을 만듭니다. 결과 : 싱글 톤 클래스 내부에서 "foo"를 참조하는 오류를 가져옵니다. 다른 클래스. – redconservatory

0

나는 싱글 톤 클래스를 사용하여 시도,하지만 난이 표시 목록에 이미 있었다 무비 클립을 참조하도록했기 때문에, 나는 "오늘의 액션 스크립트 3 팁"에서 다른 솔루션을 선택했다 :

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. 
} 

    } 
} 
+0

myArray_1 및 myArray_2가 전혀 변경되지 않으므로 (정적 인 상태로 유지됨)이 메서드를 선택했다고 덧붙여 야합니다. – redconservatory

+0

Singleton 패턴을 사용하여 위와 동일한 기능을 수행 할 수 있지만 잘 작동합니다. – Aaron

+0

배열과 함께 Singleton을 사용하는 방법의 예제를 찾을 수 없습니다 (문자열과 정수로 많은 예제를 보았습니까?). 또한 배열이 Display List의 다른 항목을 기반으로 만들어 졌기 때문에 Singleton에 인수를 전달해야 할 필요가있는 것처럼 보였습니다. – redconservatory

1

어떻게 변수를 작성하고 어떤 오류가 발생하는지 알지 못하면 정확하게 대답하기가 어렵습니다. 수업 전체와 오류를 게시 할 수 있습니까?

그러나 이 아닌은 싱글 톤 패턴을 사용하는 것이 좋습니다. 이것은 싱글 톤에 대한 완벽한 사례는 아닙니다. 싱글 톤 패턴은 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 메소드의 범위 내에 있습니다.

문서 클래스의 생성자가 호출 될 때 개체가 인스턴스화되지 않을 수도 있으므로 오류가 발생할 수 있지만 해결할 수 있습니다.

변수를 공개 및 정적으로해야하는 이유는 무엇입니까?

정적은 변수가 클래스의 인스턴스가 아니라 클래스에 있음을 의미합니다. 따라서 모든 "CardGame"인스턴스는 동일한 정적 변수를 공유합니다. 이것은 Document Class이므로 하나 이상의 인스턴스를 가질 수 없다고 생각합니다. 그래서 그럴 이유가 없습니다.

다른 이유는 public으로 선언했기 때문에 변수가 CardGame.cardPositions를 통해 클래스 외부에서 액세스 할 수있게 만드는 것입니다.이것은 다른 객체가 Classes 내부 데이터를 직접 조작하도록 허용하면 안되기 때문에 바람직하지 않습니다. 캡슐화가 깨졌습니다. 이 클래스는 문서 클래스와 계층 구조의 최상위이므로 데이터를 필요로하는 객체에 데이터 사본을 전달하고 업데이트 된 데이터를 검색하기 위해 이벤트를 기다려야합니다. 그렇게하면 데이터를 사용하기 전에 데이터를 살균 할 수 있으며 데이터를 존중하기 위해 다른 객체를 맹목적으로 신뢰하는 것이 아닙니다.

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