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

配列にはクラス オブジェクトが含まれている必要があります。しかし、今では文字列が含まれています。配列に記述されたクラスからオブジェクトをインスタンス化する方法の簡単なサンプルを見てください

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 に答える
1

tank のインスタンスを作成し、それらを配列に配置してから、それらを配列からプルして参照する必要があります (ここでは、"we" が範囲内にあると想定しています)。単純に文字列の配列を持ってから 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++;
}

代わりに、クラスとコンストラクター引数を含めたい場合は、次のようにできます(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)'のコンストラクターを呼び出していないの文字列をインスタンス化しようとしています。ActionScript 3 では、関数を呼び出すことTankはできません。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 に答える
0

問題 (私が信じている) はwe、 の長さに限定されないlv1Tarrため、最終的には にlv1Tarr[we]評価されnullます。

そのため、代わりに使用しても問題ありませんTank(1)

we次のようにインクリメントしてみてください。

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

そうweすれば、配列の長さを超えません。

于 2012-07-31T06:11:18.123 に答える