0

我试图从一个类获取一个数组到另一个类,但我不能使用静态或全局变量。

在我的班级 Jeu.as 中,我有 3 个数组(t_map1、t_map2 和 t_map3)代表我的游戏地图。t_map 是一个数组,可以包含其中一个地图以及我可以更改它的位置。我想将地图使用(表格 t_map)带到我的角色(Perso.as),这样它就可以知道它可以在哪里行走。

问题是我不知道如何将t_mapJeu.as带到Perso.as ...我尝试使用静态变量(如其他答案所示)但它不起作用,因为地图必须改变...

如何在我的perso.as类中创建一个可以包含我的数组的变量?

简而言之,我想将t_map值从我的jeu.as带到perso.as中的另一个变量

4

2 回答 2

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

}
于 2013-01-22T02:10:34.110 回答