2013-01-21 73 views
0

我想從一個類的數組獲得一個其他類,但我不能使用靜態或全局變量。從一個其他類訪問變量,而不使用靜態或全局

在我的課Jeu.as,我有3個數組(t_map1,t_map2和t_map3),代表我的遊戲地圖。 t_map是一個數組,可以包含其中一個地圖和一個可以改變它的地方。我想把地圖使用(形式t_map)給我的角色(Perso.as),這樣它就可以知道它可以行走或不行走。

的問題是,我不知道如何從帶來t_map Jeu.asPerso.as ...我曾嘗試使用一個靜態變量(如在其他答案看到的),但它不工作,因爲地圖必須改變...

我如何創建一個變量,可以包含我的數組在我的perso.as類?

總之,我希望把t_map價值觀構成了我jeu.as到其他變量perso.as

+0

難以理解的問題的語言。如果你可以專注於清理你的問題,這將會有很大的幫助。當你實例化Perso.as傳遞給你的Jeu.as類的引用時。 – BadFeelingAboutThis

+0

(對不起,我英語不好...)簡而言之,我想將t_map值從我的jeu.as帶到perso.as中的其他變量 – Janick

+0

你確定靜態變量不能工作嗎?即使't_map1'發生變化,訪問'Jeu.t_map1 [0]'(例如)將會給你當前的值。 –

回答

0

您真正需要做的就是給這兩個實例的引用相同的陣列,或者給Perso一個參考Jeau。靜態變量是一個really bad idea,即使這種情況沒有固有的東西可以阻止它們爲你工作。

這是一個使用Dependency Injection解決方案將是什麼樣子:

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

我認爲這是一個視圖類 - 你有沒有考慮到許多細節。您可以監聽模型類中的事件,然後根據這些數組中的任何內容更新視圖。通過獲取整個實例,您有能力傾聽這些事件。否則,您必須使用其他一些機制來傳達更改(例如Ro enter link description here 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 
     } 

    } 
} 

這只是如何使用第三個類來組合前兩個的例子。我不一定這樣做:

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

} 
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,你需要存儲的引用(或幾個,如果它需要知道在同一時間多個地圖)的陣列到地圖存儲的,你還需要一個functi上設置數據:

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)); 
+0

謝謝!我會嘗試 – Janick