hitTestObject not hitTesting with all MovieClips

Posted

技术标签:

【中文标题】hitTestObject not hitTesting with all MovieClips【英文标题】: 【发布时间】:2013-04-05 17:50:41 【问题描述】:

嘿伙计们有一点麻烦,这可能比我想象的要容易。 但是我遇到的问题是,当我用我的 mcPlayer 测试我的 mcPoints 时,它只与通过 for 循环添加到舞台的 5 个电影剪辑中的 4 个进行交互。

过去两天我一直在努力解决这个问题,似乎无法确定问题所在,一切似乎都设置得很完美,但也许你可以提供帮助。

这些是我的变量:

public var mcPoints:smallGainPoints;
    private var nPoints:Number = 5;
    private var aPointsArray:Array;

以下是我如何设置要添加到舞台的 5 个 mcPoints 电影剪辑:

private function addPointsToStage():void
    
         var startPoint:Point = new Point((stage.stageWidth / 2) - 100, stage.stageHeight / 2);
         var spacing:Number = 50;

         for (var i = 0; i < nPoints; i++)
         
             trace(aPointsArray.length);
             mcPoints = new smallGainPoints();
             aPointsArray.push(mcPoints);
             stage.addChild(mcPoints);
             mcPoints.x = startPoint.x + (spacing * i);
             mcPoints.y = startPoint.y;
         

    

这样就可以将水平对齐的 5 点电影剪辑添加到舞台。

最后是监听 HitTestObject 以启动的循环:

private function checkPlayerHitPoints():void 
    

        for (var i:int = 0; i < aPointsArray.length; i++)
            
                //get current point in i loop
                var currentPoints:smallGainPoints = aPointsArray[i];

                //test if  player is hitting current point
                if(player.hitTestObject(currentPoints))
                
                    //Add points sound effects
                    var pointsSound:Sound = new pointsPickUpSound();
                    pointsSound.play();

                    //remove point on stage
                    currentPoints.destroyPoints()
                    //remove points from array
                    aPointsArray.splice(i, 1);
                    trace(aPointsArray.length);

                    //Add plus 5 text to current points position
                    mcPlus5 = new plusFiveText();
                    stage.addChild(mcPlus5);
                    mcPlus5.x = (currentPoints.x);
                    mcPlus5.y = (currentPoints.y);

                    //Update high score text
                    nScore += 5;
                    updateHighScore();


                

            
    

所以我为添加影片剪辑的时间和点击它们的时间添加了跟踪,这是我得到的值:

0 1 2 3 4 命中:4 命中:3 命中:2 命中:1

我也调用 addPointsToStage();在我的构造函数中获取更多信息。

所以从我得到的值来看,最后一个值“0”似乎没有被交互,任何想法为什么?请任何有用的东西。非常感谢!

【问题讨论】:

【参考方案1】:

我不确定您的代码应该在做什么。但是,当您从循环中的数组中删除元素时,您将丢失一项。

你的数组是 [1][2][3][4][5] 当 i=1 删除元素并获取 [1][3][4][5] next interation i=2 这意味着您永远不会再次测试值 3。

每当您从数组中删除元素时,您都应该减少 i。

【讨论】:

抱歉,我可能不够详细。但上述代码的第一部分只是向舞台添加了 5 个影片剪辑。代码的第二部分是 hitTest 检查影片剪辑“播放器”是否与所有 5 个称为“点”的影片剪辑接触,但它只命中 5 个影片剪辑中的 4 个,而不是全部 5 个其中 我会在哪里减少它?我尝试了,但仍然没有做任何事情 这很奇怪,每当我将 var Spacing 更改为不同的值时,hittest 的工作方式就像我将其更改为 var Spacing:Number = 70;它工作正常。但是当它在 50 或任何其他值时它不起作用

以上是关于hitTestObject not hitTesting with all MovieClips的主要内容,如果未能解决你的问题,请参考以下文章

AS3 使用 hitTestObject 转到下一帧

AS3 hitTestObject 根本不工作

Actionscript:如何创建一个计数器来注册一个 hitTestObject 并在主舞台上显示分数?

Actionscript:如何创建一个注册hitTestObject的计数器并在主舞台上显示得分?

iOS之hitTest

iOS之hitTest