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

问题描述

我想创建一个堆叠游戏。例如,当您点击屏幕时,一个方块会掉落,然后会出现一个新方块,而另一个方块原本会出现。现在,当用户再次轻按屏幕时,相同的块会掉落,如果对齐正确,则会在第一个块的顶部堆叠一个,然后再一个。继续堆放,直到错过。

我认为创建一个数组并将每个新对象推入该数组将能够在每个新对象之间进行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。否则,您将一无所获,不断地对所有对象进行测试。

,

这就是我能够解决的方法。创建一个double 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
            }
        
        }
        
    }

}