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.

这只适用于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的数组。除了这里:intNumber

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

你不能 hitTestObject 反对int/ Number。不确定该行应该做什么,但是您测试的对象需要是 a DisplayObject(例如 a MovieClip)。

于 2013-08-08T16:06:14.693 回答
0

呃......经过大量的追踪和东西,我认为主要问题不是数组也不是拼接(虽然我的代码是错误的 - 但即使我注释掉这些代码它也不起作用),但是我放置 > 而不是 < 来检查 bosslife,所以它不断重置关卡,所以 snowballArray 不断成为一个新数组,因此 array.length 不起作用,并且在 for 循环中使用 SBAlength 会产生一些奇怪的错误。

于 2013-08-09T00:14:43.220 回答