Flash AS3 - объединение нескольких имен переменных для нацеливания на новую переменную - PullRequest
0 голосов
/ 31 января 2012

Я все еще изучаю flash и actionscript 3, и у меня возникают проблемы с именами переменных и объектов.Мне нужно иметь возможность объединять имена переменных вместе (так же, как php можно объединять, используя var1.var2).

Мой SWF-файл содержит 4 загрузчика ( image1_loader, image2_loader и т. Д. ), которые являются потомками ( image1_content, image2_content и т. Д. * ..), которые у меня тогда есть4 кнопки, которые загружают изображение в загрузчик и при этом определяют активный в данный момент загрузчик.Наконец, у меня есть 4 кнопки управления - масштабирование вверх / вниз и вращение по часовой стрелке / против часовой стрелки, которые должны управлять только активным в данный момент загрузчиком (как установлено кнопками выше)

Так что мои кнопки, а также загрузка изображения имеют событиеслушатель:

image1_btn.addEventListener(MouseEvent.CLICK, setCurrentSelection);
image2_btn.addEventListener(MouseEvent.CLICK, setCurrentSelection); 

(и т. д.)

function setCurrentSelection(e:MouseEvent):void {
    if (e.currentTarget===image1_btn){activeLoader='image1';}
    if (e.currentTarget===image2_btn){activeLoader='image2';}
    if (e.currentTarget===image3_btn){activeLoader='image3';}
    if (e.currentTarget===image4_btn){activeLoader='image4';}
}

Так что после установки моего activeLoader в качестве строки 'imageX' у меня есть функции управления, как в этом повороте:

rotateClock_btn.addEventListener(MouseEvent.MOUSE_DOWN, rotateClockwise);
rotateAnti_btn.addEventListener(MouseEvent.MOUSE_DOWN, rotateAntiClockwise);

function rotateClockwise(event:Event):void {
    rotateAroundCenter(imageX_content, 10, ptR);
}

function rotateAntiClockwise(event:Event):void {
    rotateAroundCenter(imageX_content, -10, ptR);
}

Таким образом, в функциях rotateClockwise и rotateAntiClockwise мне нужно иметь возможность распознать, какой из них является активным в данный момент загрузчиком, и иметь этот номер вместо X - так что если это image1_loader, то это должно бытьimage1_content, если 4 - image4_content ... Я пытался сделать это так, но мне не нравится, что это строка:

rotateAroundCenter((activeLoader+'_content'), 10, ptR);

Пожалуйста, кто-нибудь может помочь мне понять, как решить (извините, если я не объяснил это ясно!) и, пожалуйста, будьте осторожны со мной - я учусь, как я иду

Лорен:)

Ответы [ 3 ]

0 голосов
/ 31 января 2012

Я думаю, это то, что вы пытались сделать ...

rotateAroundCenter(getChildByName([activeLoader+"_content"]), 10, ptR);
0 голосов
/ 31 января 2012

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

var numLoaders : int = 4;
var items : Array = [];
var activeItem : Object = null;

init();

function init() : void {
    var i: int = -1;
    while (++i < numLoaders) {
        var item : Object = { 
           btn: getChildByName ("image"+i+"_btn"), 
           image: getChildByName ("image"+i+"_content") 
        };
        item.btn.addEventListener (MouseEvent.CLICK, setSelection);
        items.push ( item ); 
    } 
}

function setSelection (e:Event) : void {
    var i:int = -1;
    while (++i < items.length) {
        if (e.currentTarget == items[i].btn) activeItem = item; // compare by reference, not by name!
        break;
    }
}

function rotateClockwise(event:Event):void {
    if (activeItem) rotateAroundCenter(activeItem, 10, ptR);
}

Я пошел с getChildByName(), потому что я предполагаюу вас уже есть эти элементы на сцене - вы также можете назначить элементы в цикле создания.

Кроме того, я по соглашению использовал индексные числа на основе 0.Если ваши элементы начинаются с «image1», используйте

var i : int = 0;
while (++i <= numLoaders) 

в первом цикле.

0 голосов
/ 31 января 2012

Если у вас есть одна-одна карта содержимого DisplayObjects для Loaders, вы можете сохранить содержимое в переменной.

function setCurrentSelection(e:MouseEvent):void {
    if (e.currentTarget===image1_btn){activeContent=image1_content;}
    if (e.currentTarget===image2_btn){activeContent=image2_content;}
    if (e.currentTarget===image3_btn){activeContent=image3_content;}
    if (e.currentTarget===image4_btn){activeContent=image4_content;}
}

function rotateClockwise(event:Event):void {
    rotateAroundCenter(image4_content, 10, ptR);
}

Если по какой-то причине вам нужно сохранить строковое имя загрузчика, вы можете сделать это следующим образом.

function rotateClockwise(event:Event):void {
    rotateAroundCenter(getChildByName(activeLoader+"_content"), 10, ptR);
}

Если image1_loader и другие находятся в рабочей области.

Еще лучше, вы можете использовать всплывающее окно и делать это (при условии, что ваши изображения и содержимое объектов DisplayObject находятся в одной области видимости).

addEventListener(MouseEvent.CLICK, setCurrentSelection);

function setCurrentSelection(e:MouseEvent):void {
    var name:String = e.target.name;
    var index:int = name.indexOf("_btn");
    if (index == -1) return;
    activeLoader = name.substr(0, index);    
}

function rotateClockwise(event:Event):void {
    rotateAroundCenter(getChildByName(activeLoader+"_content"), 10, ptR);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...