Управляйте несколькими массивами одновременно - PullRequest
0 голосов
/ 21 февраля 2020

Я использую as3 в Adobe Animate для создания видеоигры. Я создал несколько массивов с клипами mov ie, например


var A:Array [mc1, mc2, mc3]
var B:Array [mc4, mc5, mc6]
var C:Array [mc7, mc8, mc9]
var anObject:DisplayObject;

Как я могу управлять всеми клипами mov ie во всех массивах одновременно? Я пробовал это:


mc_Player.addEventListener(MouseEvent.CLICK, Change_Position);
function Change_Position (event:MouseEvent):void
{
    {for each (anObject in A) & (anObject in B) & (anObject in C) // how can I get this right?
    {anObject.x -= 100;
    }}
}

Я также пытаюсь понять, есть ли способ управлять всеми клипами mov ie в моем проекте одновременно без использования массивов.

например

mc_Player.addEventListener(MouseEvent.CLICK, Change_Position);
function Change_Position (event:MouseEvent):void
{
    {all movie_clips // how can I get this right?
    {anObject.x -= 100;
    }}
}

Спасибо.

1 Ответ

0 голосов
/ 21 февраля 2020

В программировании нет такой вещи, как одновременный (ну, если только вы не многопоточны с идеальным syn c, что вовсе не история AS3).

Есть несколько способов приблизиться к этой одновременной вещи:

  1. Поместите все объекты в один контейнер. Вы сможете изменить x и y этого контейнера, чтобы все встроенные объекты сразу изменили свои видимые позиции. Недостатком является то, что вы не можете поворачивать или масштабировать их по отдельности (представьте, что они подрезаны к доске и представьте, что вы вращаете всю доску), иначе вы не сможете переместить половину из них.
  2. Массив с и петли. Вы перебираете все элементы по очереди очень быстро. Он выглядит одновременно снаружи, но никогда не выглядит так.

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

Дело №1 : много Массив с одним.

// This methods takes a mixed list of items and Arrays
// and returns a single flattened list of items.
function flatten(...args:Array):Array
{
    var i:int = 0;

    // Iterate over the arguments from the first and on. 
    while (i < args.length)
    {
        if (args[i] is Array)
        {
            // These commands cut the reference to the Array
            // and put the whole list of its elements instead.
            aRay = [i,1].concat(args[i]);
            args.splice.apply(args, aRay);
        }
        else
        {
            // The element is not an Array so let's just leave it be.
            i++;
        }
    }

    return args;
}

Тогда все, что вам нужно сделать, - это получить единый список из ваших нескольких Массив s:

var ABC:Array = flatten(A, B, C);

for each (var anObject:DisplayObject in ABC)
{
    anObject.x -= 100;
}

В плане производительности рекомендуется заранее организовать, если это логически возможно, эти Array s, чтобы вам не приходилось компилировать их каждый раз, когда вам нужно обработать все объекты. Просто, если иногда вам понадобятся A + B, а иногда B + C, а иногда A + B + C, просто создайте их и приготовьте. Если вы знаете, с чем будете иметь дело, вам даже не понадобится этот сложный метод flatten :

var AB:Array = A.concat(B);
var BC:Array = B.concat(C);

var ABC:Array = A.concat(B).concat(C);

Дело №2 : все дети сразу. Как я уже объяснил в моем ответе на один из ваших предыдущих вопросов , вы можете перебирать все дочерние элементы определенного контейнера и помещать их в - угадайте, что - Array для позже использовать. Кроме того, вы можете фильтровать объекты при этом и помещать в них только те, которые вам действительно нужны.

var ALL:Array = new Array;

// Iterate over the amount of children of "this" container.
for (var i:int = 0; i < numChildren; i++)
{
    // Obtain a reference to the child at the depth "i".
    var anObject:DisplayObject = getChildAt(i);

    // Here go possible criteria for enlisting.

    // This will ignore texts and buttons.
    // if (anObject is MovieClip)

    // This will take only those with names starting with "mc".
    if (anObject.name.substr(0, 2) == "mc")
    {
        ALL.push(anObject);
    }
}

// Viola! You have all the objects you want in a single Array
// so you can bulk-process them now, which is ALMOST simultaneous. 
...