AS3不断制作一组movieclip动作。 (这个阵列的大小不断增加)

时间:2013-08-08 15:53:05

标签: arrays actionscript-3 flash

ActionScript 3.0

我得到了这个bullet_array。 每当我按下空格键时它就会弹出新的子弹。 这是“for loop”,只有当我按下空格键时才有效。 但我希望子弹不断移动。

'for循环'位于update()内,来自Event.ENTER_FRAME 所以从技术上讲,for循环应该不断循环(我认为),但它只通过ONCE,并且只有在数组大小增加之后。它只适用于新对象,并没有触及旧对象。

     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]; 
               }

           }

2 个答案:

答案 0 :(得分: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.

仅当numberArraysnowmanArray中的项目本身就是数组时才会起作用 - 不确定它们是否是,但似乎不是这样,因为您还将这些项目用作数字:

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作为int(或Number)的数组。除此之外:

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

您无法针对int / Number点击TestObject。不确定该行应该做什么,但您测试的对象需要是DisplayObject(例如MovieClip)。

答案 1 :(得分:0)

嗯......经过大量的追踪和事情之后, 我认为主要问题不在于数组和拼接(虽然我的代码是错误的 - 但即使我评论了这些代码它也不起作用),但我放置了>而不是<检查bosslife,所以它不断重置级别,所以snowballArray不断变成一个新的数组,因此array.length不起作用,并且在for循环中使用SBAlength给出了一些奇怪的错误。