【问题标题】:Array not resetting in Game数组未在游戏中重置
【发布时间】:2013-05-14 06:13:40
【问题描述】:

大家好,我正在开发一个游戏,我有一个数组来跟踪我的 5 个由数组添加到舞台的电影剪辑。我也有一个播放器影片剪辑,因此播放器影片剪辑正在使用所有 5 个菱形影片剪辑进行命中测试,这些影片剪辑添加到舞台,如下所示:

private var nPoints:Number = 5;..........

    public function addPointsToStage():void
    {            
         for (var i = 0; i < nPoints; i++)
         {
             trace(aPointsArray.length);
             points = new mcGainPoints();
             stage.addChild(points);
             points.x = startPoint.x + (xSpacing * i);
             points.y = startPoint.y - (ySpacing * i);
             aPointsArray.push(points);
         }

    }

现在,当播放器接触到所有 5 个影片剪辑时,一切正常,数组的输出如下所示:
0 1 2 3 4

然后它继续到下一个级别。

但是假设我的播放器没有击中 5 个影片剪辑中的任何一个或仅击中其中几个,当下一个级别开始时,输出如下所示: 5 6 7 8 9

当下一关开始时,奇怪的事情开始发生,比如分数开始自行添加到高分中。

我认为问题在于我没有正确销毁包含 5 个影片剪辑的数组,这是我用来启动下一个级别并销毁数组的代码:

if(player.hitTestObject(mcGoal_1))
           {

            //Remove all points from array/stage
            for (var i:int = 0; i < aPointsArray.length; i++)
            {

                if (aPointsArray[i].parent)
                {
                    parent.removeChild(aPointsArray[i]);
                }
                              startNextLevel();

            }

mcGoal_1 是游戏的对象,因此如果玩家击中了goal_1,则销毁屏幕上的所有数组对象并开始下一个关卡。这是 startnextlevel 函数。

private function startNextLevel():void
    {

        //add points to next stage
        addPointsToStage();


    }

那么你能明白为什么在下一级开始时数组没有重置回 01234 吗?我认为这就是为什么游戏有随机加分的错误。请任何帮助将不胜感激

【问题讨论】:

    标签: arrays actionscript-3


    【解决方案1】:
            //Remove all points from array/stage
            for (var i:int = 0; i < aPointsArray.length; i++)
                if (aPointsArray[i].parent)
                    parent.removeChild(aPointsArray[i]);
            // just one statement, no braces
            aPointsArray.length=0; // clear the array itself, not just 
            // points from display list!
            startNextLevel(); // now start level
    

    正确陈述的错误顺序会导致灾难。始终检查您的代码流,现在执行什么,然后执行什么,以及执行多少次。

    【讨论】:

      【解决方案2】:

      您似乎没有从数组中删除任何内容。

      您可以结合使用.indexOf().splice() 从数组中删除项目:

      function removeMc(clip:MovieClip):void
      {
          if(clip.parent) clip.parent.removeChild(clip);
      
          // Also remove from array.
          var index:int = aPointsArray.indexOf(clip);
          aPointsArray.splice(index, 1);
      }
      

      startNextLevel():

      private function startNextLevel():void
      {
          aPointsArray.length = 0;
      
          //add points to next stage
          addPointsToStage();
      }
      

      【讨论】:

      • @Vesper 我认为 AS3 标签中的速度并不是真正的问题,不像 JavaScript 或 PHP,在前 2 分钟内您会得到 5-10 个答案。尽我所能阅读这个问题,然后花一些时间将链接放在一起并阅读我的答案,我感到很自在:)
      • 非常感谢!我感谢一切。
      【解决方案3】:

      只需将您的数组分配为空值。这样该数组将在您需要时从头开始。希望下面的代码对你有所帮助。

        var nPoints:Number = 5;
        var points:poin;
        var aPointsArray:Array;
         var startPoint:Number = 0;
        var xSpacing:Number = 20;  
          var ySpacing:Number = 20; 
      
          addPointsToStage();
      
        function addPointsToStage():void
          {        
          aPointsArray = null;
              aPointsArray = new Array();
      
               for (var i:int = 0; i < 6; i++)
               {
                   trace(aPointsArray.length);
                   points = new poin();
                   addChild(points);
                    points.x = 100+ (xSpacing * i);
                   points.y = 200 - (ySpacing * i);
                   aPointsArray.push(points);
               }
          }
      

      【讨论】:

      • 只是评论那个跟踪 yar,aPointsArray = null 这肯定会使该数组为空并重置数组。
      • 好吧,你不能把任何东西压入空值。
      • 感谢大家的帮助。我仍在编辑我所有级别的代码,我会让你知道它是怎么回事!我很感激!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多