Как протестировать одинаковые объекты в одном массиве?

#actionscript-3 #flashdevelop #flash-cs3

#actionscript-3 #flashdevelop #flash-cs3

Вопрос:

Я хочу создать игру для стекирования. Где, например, при нажатии на экран блок падает, и новый появляется там, где изначально был другой. Теперь, когда пользователь снова нажимает на экран, тот же блок падает и, если он правильно выровнен, укладывается поверх первого, так один и так один. Продолжайте укладку, пока не пропустите.

Я думал, что создание массива и добавление каждого нового объекта в этот массив позволит проводить тестирование между каждым новым объектом и т.д., И они будут накладываться друг на друга. Я понял, что не совсем понимаю, как это сделать. Создаются новые экземпляры, поэтому я это записал. Вот мой код на данный момент:

 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);
        
    }
  

Я был бы признателен за любую помощь от вас, ребята. Может быть, если вы сможете подтолкнуть меня в правильном направлении. Заранее благодарю вас!

Комментарии:

1. Почему вы не используете 2D-физику? Например^ box2dflash.sourceforge.net

2. Эй, @Organis Я никогда не использовал 2D-физику. Я проверю документацию. Однако в этой игре на самом деле не было бы никакой физики. Просто линейное падение, которое я создал с помощью анимации, чтобы сделать его более плавным. Не имеет значения, если блоки складываются и кажется, что они будут наклоняться, потому что это не повлияет на блоки или заставит их упасть. Пока они соприкасаются, они будут складываться.

3. @Nathan если все еще не получается, вы могли бы избежать выполнения теста попадания, вместо этого используя Bitmap или double Array . Если растровое изображение, то вы создаете его с шириной в пикселях от общего количества блоков (бок о бок) и высотой от общего количества стеков блоков ( например: ширина 10 блоков и максимальная высота 7 блоков означает растровое изображение 10 Вт x 7H. Идея заключается в том, что вы отмечаете выбранное место на растровом изображении (устанавливаете цвет пикселя) и избегаете проверки попадания, просто проверяя, имеет ли значение пикселя больше нуля.

4. Спасибо VC, я даже не думал делать это таким образом, ха-ха

Ответ №1:

Похоже, что 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 значения вместо использования анимации, но вы не спрашивали об этом.

Вы также можете установить флаг для определения того, падает объект в данный момент или нет, и использовать его для определения того, следует ли запускать stackingHandler . В противном случае вы просто будете постоянно проверять все объекты, когда ничего не движется.

Комментарии:

1. На самом деле это имеет большой смысл. Я протестирую это, когда у меня будет возможность, но выглядит точно так же, как то, что я пытался выполнить. Я уже наполовину разобрался с этим ранее, я создал двойной цикл for и создал две отдельные переменные одного и того же класса. Это намного чище, большое спасибо. Удалось создать логическое значение, чтобы указать, когда происходит проверка попадания, правильно?

2. Да, двойной цикл позволит вам протестировать каждый объект против любого другого объекта. Вероятно, это то, что вы бы сделали, если бы выполняли полное физическое моделирование, но в вашем случае, когда перемещается только один объект, это перебор.

3. Я попробовал ваш метод и также использовал флаг, но, похоже, он все еще срабатывал, даже если в поле был только один экземпляр объекта. единственный способ заставить его работать — создать двойной цикл for. Я опубликую, как я в итоге это сделал.

Ответ №2:

Вот как я смог это исправить. Создание двойного цикла for. Проверка того, равны ли они друг другу, продолжается и проверяется на соответствие:

 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) amp;amp; 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
            }
        
        }
        
    }

}