0

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

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 不希望我以这种方式使用数组。

4

4 回答 4

1

您需要创建 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);    
}
于 2012-07-31T06:13:40.423 回答
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();
于 2012-07-31T06:15:36.540 回答
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();    
}
于 2012-07-31T06:16:26.707 回答
0

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

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

尝试we像这样递增:

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

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

于 2012-07-31T06:11:18.123 回答