0

アクションスクリプト 3.0

この bullet_array を取得しました。スペースバーを押すたびに新しい弾丸が押し出されます。この「for ループ」があり、スペースバーを押した場合にのみ機能します。しかし、弾丸が常に動くようにしたかったのです。

「for ループ」は update() の内部にあり、これは Event.ENTER_FRAME からのものであるため、技術的には、for ループは常にループしている必要があります (私は思います)。そして、それは新しいオブジェクトでのみ機能し、古いオブジェクトには触れませんでした。

     public function update(evt:Event = null)
    {
        stage.focus = stage;

        //fire = true is set by spacebar
        if (fire == true)
        {
            var snowball:MovieClip = new Snowball;
            snowball.x = (mcPlayer.x);
            snowball.y = (mcPlayer.y - 5); 
            snowballArray.push(snowball);
            SBAlength = +1; //stands for snowballArray's length
            addChild(snowball);
            fire = false; 

        }

        for (var i = SBAlength - 1; i >= 0; i--)
        {

           snowballArray[i].y -= snowballSpd; //snowballSpd is already declared as 5
           for (var j = snowmanArray.length - 1; j>=0; j--)
           {
               for (var k = numberArray.length -1; k>0; k--)
               {
                   if     (snowballArray[i].hitTestObject(snowmanArray[j]))
                    {
                        if     (snowmanArray[j].hitTestObject(numberArray[k]))
                        {

                            bosslife -=  numberArray[k]; 
                            numberArray[k].splice(k,1); 

                        }
                        snowballArray[i].gotoAndPlay("hit");                
                        snowmanArray[j].splice(j,1); 
                        break;
                    }
                    if(numberArray[k] >= 0) 
                    {
                        numberArray[k].splice(k,1);

                        randomNo= Math.floor(Math.random()*(max-min+1))+min;
                        numberArray[k].push(randomNo); 
                    }
                    snowmanArray[j].txtNumber.text = numberArray[j]; 
               }

           }
4

2 に答える 2

0

ここには他の問題があるかもしれませんが、次のとおりです。

配列の長さを維持する

SBAlength = +1; // Sets your length to 1

代わりに次を使用します。

SBAlength += 1; // Increases your length by 1

lengthしかし、実際には、維持する代わりに、ループ内で配列のプロパティを使用することもできますSBALength(将来のコードのために同期が取れなくなるリスクがあります)。

for (var i = snowballArray.length - 1; i >= 0; i--)

配列の操作

また(これがあなたの問題に関連しているとは思わないでください、しかしそれは確かにエラーを引き起こします)、あなたの内側のループでは、あなたは常に次のようなことをしています:

snowmanArray[j].splice(j,1);
numberArray[k].push(randomNo);
// etc.

numberArrayこれは、との項目snowmanArray自体が配列である場合にのみ機能します。配列であるかどうかはわかりませんが、項目を数値としても使用しているため、そうではないようです。

bosslife -= numberArray[k];

最初のステートメントは、格納されている配列から snowmanArray[j]項目を削除することを要求しています。項目snowmanArray自体から項目を削除するのではありません。からアイテムを削除する場合はsnowmanArray、 を実行しますsnowmanArray.splice(j, 1)

同様に、アイテムを に追加するには、 ではなくnumberArrayを実行します。numberArray.push(randomNo)numberArray[k].push(randomNo)

ループ内で配列を操作するなど。

たとえば、その配列を繰り返し処理しているときに現在の配列項目を削除しても問題ありませんが、最後から逆方向に実行する場合に限ります。でも...

雪だるまが当たった場合、これを実行した後 (または、実行するつもりでした):

snowmanArray.splice(j,1); 

...後でやっています:

snowmanArray[j].txtNumber.text = numberArray[j]; 

つまり、配列から雪だるまを削除しますが、後で、削除したばかりの配列アイテムを取得しようとします。snowmanArray[j]対処する前に、 がまだ存在していることを確認する必要があります。

配列項目タイプ

あなたは主に(または)numberArrayの配列として使用しています。ここを除いて:intNumber

snowmanArray[j].hitTestObject(numberArray[k])

int/に対して TestObject をヒットすることはできませんNumber。行が何をすべきかはわかりませんが、テストにヒットするオブジェクトはDisplayObject(たとえば a MovieClip) である必要があります。

于 2013-08-08T16:06:14.693 に答える
0

ええと...たくさんのトレースなどを行った後、主な問題は配列やスプライシングにあるわけではないことがわかりました(コードは間違っていますが、それらのコードをコメントアウトしても機能しませんでした)が、 < の代わりに > を配置して Bosslife をチェックすると、レベルがリセットされ続け、snowballArray が新しい配列になり続けるため、array.length が機能せず、SBAlength を使用すると for ループ内で奇妙なエラーが発生します。

于 2013-08-09T00:14:43.220 に答える