2009-12-16 6 views
0

J'ai la fonction suivante pour configurer des cartes dans une partie. J'ai créé un tableau pour contenir le type de cartes, et un autre tableau pour maintenir la position des cartes.Actionscript 3: portée de tableau dans une classe de document

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]); 
     } 

Donc, si je veux mettre le numéro de carte « 3 » en position « 5 » Je viens d'écrire:

setPlayerCard(3,5); 

Le problème que je vois est que chaque fois que je voudrais placer une carte, je crée deux tableaux à chaque fois. Je voudrais rendre les tableaux "globaux" (c'est-à-dire les créer dans mon constructeur dans ma classe de document) et les réutiliser dans la fonction "setPlayerCard" mais je reçois des erreurs quand j'essaye de le faire.

Des suggestions?

Répondre

1

Ceci est un cas parfait pour un modèle de données de classe statique Singleton. Vous pouvez obtenir l'instance de Singleton dans toute l'application car il s'agit d'une classe statique et elle peut contenir les deux tableaux sans duplication.

pixelbreaker a un bel exemple de base Singleton AS3 que vous pouvez construire à partir.

+0

Bonne idée! Je travaille actuellement à l'implémentation de la classe Singleton. Ma question est ... après avoir regardé une documentation sur la façon d'implémenter la classe Singleton, je suis un peu incertain de la façon de référencer les objets de la liste d'affichage entre les deux classes. Par exemple, les tableaux que je souhaite créer sont basés sur un MovieClip que j'ai ajouté à la liste d'affichage de l'autre classe. Classe 1: Ajouter un MovieClip à la liste d'affichage, par exemple appeler « foo » Singleton Créer un tableau des éléments à l'intérieur « foo » Résultat: Obtenir une erreur à l'intérieur de la classe singleton pour le référencement « foo » qui est à l'intérieur du autre classe. – redconservatory

0

J'ai essayé d'utiliser la classe Singleton, mais depuis que je devais faire référence MovieClips qui étaient déjà sur la liste d'affichage, j'ai opté pour une autre solution de « Actionscript 3 Astuce du jour »:

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

Je suppose que je devrais aussi ajouter que j'ai choisi cette méthode car myArray_1 et myArray_2 ne changeront pas du tout (c'est-à-dire resteront statiques). – redconservatory

+0

Vous pourriez avoir accompli la même fonctionnalité ci-dessus en utilisant le modèle Singleton, mais cela fonctionne bien aussi. – Aaron

+0

Je ne pouvais pas trouver un exemple de comment utiliser le singleton avec un tableau (j'ai vu beaucoup d'exemples avec des chaînes et des entiers?). Aussi, il me semblait que je devais passer un argument au singleton (puisque le tableau a été créé en fonction d'un autre élément de la liste d'affichage?) – redconservatory

1

Il est un peu difficile de répondre avec précision sans savoir comment vous créez les variables et quelles erreurs vous obtenez. Pouvez-vous poster toute la classe et les erreurs?

Je peux, cependant, vous recommandons que vous faites pas utiliser le motif Singleton. Ce n'est pas un cas parfait pour un Singleton. Le pattern Singleton n'a pas sa place dans la POO, c'est la programmation procédurale enveloppée comme OO, mais c'est un argument pour ailleurs.

Ceci est, cependant, un cas parfait pour les variables de niveau classe. Ce qui suit est un exemple simple. Il y a quelques déclarations de variables manquantes (numCards), car je ne sais pas où vous les créez et les définissez.

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]); 
     } 
    } 
} 

De cette façon, vous créez seulement et alimenter les tableaux une fois et vous pouvez y accéder depuis partout dans la classe cardgame. Ils ne sont pas globaux mais sont dans le cadre de la méthode setPlayerCard.

Vous pouvez obtenir des erreurs car les objets peuvent ne pas être instanciés lorsque le constructeur de la classe de document est appelé, mais cela peut être contourné.

Quelle est la nécessité pour la variable d'être publique et statique? Statique signifie que la variable est sur la classe et non sur les instances de la classe. Ainsi, chaque instance de "CardGame" partagera la même variable statique. Je présume, parce que c'est la classe de document, que vous n'en aurez pas plus d'une instance. Donc, il n'y a pas de raison à cela.

La seule autre raison, parce que vous l'a déclaré publique, est de rendre la variable accessible depuis l'extérieur de la classe par CardGame.cardPositions.Ceci est une mauvaise pratique car vous ne devez pas autoriser d'autres objets à manipuler directement les données internes d'une classe. Cela casse l'encapsulation. Comme il s'agit de la classe Document et du haut de la hiérarchie, vous devez transmettre une copie des données à l'objet qui en a besoin et attendre qu'un événement récupère les données mises à jour. De cette façon, vous pouvez nettoyer les données avant de les utiliser et vous ne faites pas confiance à d'autres objets pour respecter vos données.

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

Questions connexes