【问题标题】:TypeError #1007 Instantiation attempted on a non-constructor from arrayTypeError #1007 尝试对数组中的非构造函数进行实例化
【发布时间】:2012-07-31 06:03:29
【问题描述】:

我正在尝试制作一个横向滚动射击游戏,并使用代码而不是位置来生成所有敌人,但我一直遇到:

TypeError:错误 #1007:尝试在非构造函数上进行实例化。

相关代码:

tanktimer++;
var n:MovieClip;        
var lv1arr:Array = [24,120,144,264,288,384,408,432,480];                        
var lv1Tarr:Array = ['Tank(1)','Tank(1)','Tank(2)','Tank(1)','Tank(2)','Tank(3)','Tank(1)','Tank(2)','Tank(3)'];

if(tanktimer == lv1arr[we])
{
    trace('work darn you!');
    n = new lv1Tarr[we];
    n.x = 700;
    n.y = 550;
    addChild(n);
    trace('build');
    we++;
}

var 'we' 和 tanktimer 一样在顶部定义为 Number=0。

我认为应该发生的是 tanktimer 从 0 计数到 24,然后它将等于 lv1arr 中的第一个值,此时它将构建 lv1Tarr 中的第一个项目。

我很确定问题是:

n = new lv1Tarr[we];

当代码到达那里然后给出错误并且不生成坦克。但是如果我删除 lv1Tarr[we] 并用 Tank(1) 替换它,它工作得很好,所以很明显 Flash 不希望我以这种方式使用数组。

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案1】:

    您正在尝试实例化一个'Tank(1)' 的字符串,它没有调用Tank 类的构造函数。 ActionScript 3 不会 eval() 调用函数。

    这可以通过定义一个你想调用的函数数组来实现:

    var lv1Tarr:Array = [
        function():MovieClip {return new Tank(1)},
        function():MovieClip {return new Tank(1)},
        function():MovieClip {return new Tank(2)},
        function():MovieClip {return new Tank(1)},
        function():MovieClip {return new Tank(3)}
        ];
    

    然后您可以致电:

    var n:Tank = new lv1Tarr[we];
    

    或者更恰当地说:

    var n:Tank = lv1Tarr[we].call();
    

    【讨论】:

      【解决方案2】:

      您的数组必须包含类对象。但现在它包含字符串。 查看快速示例如何从数组中描述的类中实例化对象

      import flash.display.Sprite;
      
      var classesArray:Array = [Sprite, Sprite, MovieClip];
      for (var i:int=0; i<classesArray.length; i++){
          var clazz:Class =  classesArray[i] as Class;
          var object:Object = new clazz();    
      }
      

      【讨论】:

        【解决方案3】:

        您需要创建 tank 实例并将它们放入数组中,然后通过从数组中拉出它们来引用它们(我假设这里的“我们”在范围内)。简单地拥有一个字符串数组,然后尝试对其调用 new 是行不通的,这与:

        新的“坦克(1)”

        这不是一个有效的构造函数调用

        tanktimer++;
        var n:MovieClip;        
        var lv1arr:Array = [24,120,144,264,288,384,408,432,480];                       
        var tank1:Tank = new Tank(1);
        var tank2:Tank = new Tank(2);
        var tank3:Tank = new Tank(3); 
        var lv1Tarr:Array = [tank1,tank1,tank2,tank1,tank2,tank3,tank1,tank2,tank3];
        
        if(tanktimer == lv1arr[we])
        {
            trace('work darn you!');
            n = lv1Tarr[we]; //<-- this is not a constructor call if you have strings
            n.x = 700;
            n.y = 550;
            addChild(n);
            trace('build');
            we++;
        }
        

        如果您想包含类和构造函数 arg,您可以这样做(基于 terbooter 的回答 +1ed):

        var classesArray:Array = [{clazz:Tank,arg:1}, {clazz:Tank, arg:1}, {clazz:Tank, arg:2}];
        for (var i:int=0; i<classesArray.length; i++){
            var clazz:Class =  classesArray[i].clazz as Class;
            var object:Object = new clazz(classesArray[i].arg);    
        }
        

        【讨论】:

          【解决方案4】:

          问题(我相信)是we 不限于lv1Tarr 的长度,所以最终lv1Tarr[we] 评估为null

          这就是为什么你改用Tank(1) 时没有问题的原因。

          尝试像这样递增we

          ++we;
          we %= lv1arr.length();
          

          这样,we 不会超过数组的长度。

          【讨论】:

            猜你喜欢
            • 2012-06-16
            • 2011-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-05
            • 1970-01-01
            • 2023-03-04
            相关资源
            最近更新 更多