如何在一个数组中 hitTest 相同的对象?

How to hitTest same Objects in one Array?

我想创建一个堆叠游戏。例如,当您点击屏幕时,一个方块会掉落,而另一个方块原来所在的位置会出现一个新的方块。现在,当用户再次点击屏幕时,同一个方块会掉落,如果对齐正确,则会堆叠在第一个方块的顶部,如此如此。继续堆叠,直到你错过为止。

我认为创建一个数组并将每个新对象推送到该数组将能够在每个新对象之间进行 hitTest 等,并让它们相互堆叠。我意识到我不太明白该怎么做。创建了新实例,所以我记下来了。到目前为止,这是我的代码:

private function engineLogic(e:Event):void 
    {
        stackingHandler();
    }
    
    private function stackingHandler():void 
    {
        for (var i:int = 0; i < aCatArray.length; i++)
        {
            var currentCat:mcCats = aCatArray[i];
            
            //HIT TEST CATS 
            
        }
        trace("NUMBER OF CATS: " + aCatArray.length);
    }
    
    private function onTap(e:MouseEvent):void 
    {
        //Move Down 
        TweenLite.to(cats, 1.0, {y:(stage.stageHeight / 2) + 290, onComplete: addCats}); 
    }
    
    private function addCats():void 
    {
        //Create Instance
        cats = new mcCats();
        //Add Objects
        addChild(cats);
        //Push to Array
        aCatArray.push(cats);
        
    }

非常感谢你们的帮助。也许如果你能把我推向正确的方向。提前致谢!

看起来 cats 变量保存着当前下落的物体?
在那种情况下,你会做这样的事情:

private function stackingHandler():void 
{
    for (var i:int = 0; i < aCatArray.length; i++)
    {
        if(cats.hitTestObject(aCatArray[i])) {
            // collision detected!
            // kill the Tween
            // set the y position of the `cats` object 
            // so it appears on top of the object it collided with (`aCatArray[i]`)
            // (it may have moved slightly past the object before doing this check)
        }            
    }
}

因此,您正在遍历数组并一次针对数组中的每个对象进行 cats 测试。

使用基本的重力模拟或者只是线性增加 y 值而不是使用 Tween 可能更有意义,但你没有问这个。

您可能还想为对象当前是否正在下落设置一个标志,并使用它来确定是否 运行 stackingHandler。否则,您将在没有移动的情况下不断地测试所有对象。

这就是我修复它的方法。创建一个双 for 循环。检查它们是否彼此相等继续并检查 hitTest:

private function stackingHandler():void 
{
    for (var i:int = 0; i < aCatArray.length; i++)
    {
        var currentCat:mcCats = aCatArray[i];
        
        for (var j:int = 0; j < aCatArray.length; j++)
        {
            var newCat:mcCats = aCatArray[j];
            
            if (currentCat == newCat) continue;
            
            //Hit Test between Objects
            if (newCat.hitTestObject(currentCat.mcHit) && newCat.bFlag == false)
            {
                //Stop Moving
                newCat.stopMoving();
                trace("HIT");
                
                if (highScore == 0)
                {
                    addCats();
                    trace("ADD CATS 1");
                }else
                {
                    TweenLite.delayedCall(0.6, addCats);
                    trace("ADD CATS 2");
                }
                
                //Add Points
                highScore ++;
                trace(highScore + " Score");
                //Set Flag boolean
                newCat.bFlag = true
            }
        
        }
        
    }

}