0

あるクラスから別のクラスに配列を取得しようとしていますが、静的変数またはグローバル変数を使用できません。

私のクラスJeu.asには、ゲームマップを表す3つの配列(t_map1、t_map2、t_map3)があります。t_mapは、それらのマップの1つと、それを変更できる場所を含むことができる配列です。マップの使用(フォームt_map)を自分のキャラクター(Perso.as)に持っていき、どこを歩くことができるかを知ることができます。

問題は、t_mapをJeu.asからPerso.asに移動する方法がわからないことです...静的変数を使用しようとしましたが(他の回答に見られるように)、マップが必要なため機能しません変化する...

perso.asクラスに配列を含めることができる変数を作成するにはどうすればよいですか?

要するに、私は自分のjeu.asからperso.asの他の変数にt_map値を持ってきたいのです。

4

2 に答える 2

0

本当に必要なのは、両方のインスタンスに同じ配列への参照を与えるか、PersoにJeauへの参照を与えることです。静的変数は、この状況に固有の変数が機能しなくなるようなものがない場合でも、非常に悪い考えです。

依存性注入を使用するソリューションは次のようになります。

package model {
   public class Jeau extends EventDispatcher {

      protected var _tMap1:Array = new Array();
      protected var _tMap2:Array = new Array();
      protected var _tMap3:Array = new Array();
      //consider using more descriptive variable names
      //or an array of arrays (one map in each index)
      public function get tMap1():Array {
         return _tMap1;
      }
      public function set tMap1(value:Array):void {
         if (value != _tMap1) {
            _tMap1 = value;
            dispatchEvent(new Event('tMap1Changed'));
         }
      }
      public function get tMap2():Array {
         return _tMap2;
      }
      public function set tMap2(value:Array):void {
         if (value != _tMap2) {
            _tMap2 = value;
            dispatchEvent(new Event('tMap2Changed'));
         }
      }
      public function get tMap3():Array {
         return _tMap3;
      }
      public function set tMap3(value:Array):void {
         if (value != _tMap3) {
            _tMap3 = value;
            dispatchEvent(new Event('tMap3Changed'));
         }
      }
      protected function somethingThatChangesMap1(index:int, value:String):void {
         _tMap1[index] = value;
         dispatchEvent(new Event('tMap1Changed'));
      }
   }
}

これはViewクラスだと思いますが、詳細はあまり説明していません。モデルクラスから出てくるイベントをリッスンし、それらの配列にあるものに基づいてビューを更新します。インスタンス全体を取得することで、これらのイベントをリッスンすることができます。それ以外の場合は、変更を伝達するために他のメカニズムを使用する必要があります(Roで使用されるイベントバスなど、ここにbotLegsにリンクの説明を入力します)。

package view {
   class Perso extends MovieClip {
       protected var jeau:Jeau;
       public function get jeau():Jeau {
          return _jeau;
       }
       public function set jeau(value:Jeau):void {
          if (value != _jeau) {
             _jeau = value;
             _jeau.addEventListener('map1Changed', doMap1Stuff);
             _jeau.addEventListener('map2Changed', doMap2Stuff);
             _jeau.addEventListener('map3Changed', doMap3Stuff);
             doMap1Stuff();
             doMap2Stuff();
             doMap3Stuff();
          }
       }
       protected function doMap1Stuff(e:Event=null) {
          //do actions depending on the state of map1 here
       }
       protected function doMap2Stuff(e:Event=null) {
          //do actions depending on the state of map2 here
       }
       protected function doMap3Stuff(e:Event=null) {
          //do actions depending on the state of map3 here
       }

   }
}

これは、3番目のクラスを使用して最初の2つを組み合わせる方法の単なる例です。私は必ずしもこのように正確に行うとは限りません:

package control {
   public class MainGame {
      protected var jeau:Jeau;
      protected function perso:Perso;
      public function MainGame() {
         jeau = new Jeau();
         //jeau setup
         perso = new Perso();
         perso.jeau = jeau;
      }
   }

}
于 2013-01-22T02:10:34.110 に答える
0

いくつかの単純なアクセサーが必要なようです。

ではJeu、次のようなマップを取得するための何かが必要になります。

function getMap(mapNumber:int):Array
{
    switch(mapNumber)
    {
        case 1:
            return t_map1;
        case 2:
            return t_map2;
        case 3:
            return t_map3;
        default:
            trace("Error: that's not a valid map number!")
    }
}

マップを別の包含Array(それを呼びallTheMapsましょう)に保存した場合、関数ははるかに見栄えが良くなります。

function getMap(mapNumber:int):Array
{
    allTheMaps[mapNumber];
}

次に、にPerso、マップを格納するための配列の参照(または、同時に複数のマップについて知る必要がある場合は複数)を格納する必要があります。データを設定する関数も必要です。

var theMap:Array;

function setMap(theMap:Array):void
{
    myMap = theMap;
}

これで、のインスタンスから次のインスタンスにマップを渡すことができJeuますPerso

var Jeu = new Jeu();
var Perso = new Perso();
...
Perso.setMap(Jeu.getMap(1));
于 2013-01-21T23:40:42.283 に答える