TypeError#1007从数组的非构造函数尝试实例化

时间:2012-07-31 06:03:30

标签: actionscript-3 flash

我正在尝试制作一个侧面滚动射击游戏并使用代码生成所有敌人而不是放置并且我一直遇到:

  

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'在顶部被定义为Number = 0和tanktimer。

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

我很确定问题是:

n = new lv1Tarr[we];

当代码到达那里然后给出错误并且不生成坦克。但是,如果我删除lv1Tarr [we]并将其替换为Tank(1),它就可以正常运行,因此很明显Flash不希望我以这种方式使用数组。

4 个答案:

答案 0 :(得分:1)

你需要制作坦克的实例并将它们放入你的数组然后通过从数组中拉出来引用它们(我假设这里“我们”在范围内)。只需拥有一个字符串数组然后尝试在它们上面调用new就行不通,这与下面的内容相同:

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

答案 1 :(得分: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 :(得分:1)

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

中描述的类实例化对象
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 :(得分:0)

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

这就是您使用Tank(1)时没有问题的原因。

尝试像这样递增we

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

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