Попытка создать кнопку, предназначенную для определенных свойств мувиклипа, которая находится в нескольких слоях мувиклипа. - PullRequest
0 голосов
/ 15 июня 2019

Я хочу изменить непрозрачность определенного фрагмента ролика (названного: Red_mc) в пределах нескольких слоев фрагментов ролика (пример иерархии слоев: Character_mc> arm_mc> arms_mc> Attribute_mc> Red_mc).

Но у меня также есть покадровая анимация в Character_mc (каждый из которых содержит и использует один и тот же MovieClip). Я хочу, чтобы кнопка изменила свойства всех Red_mc в каждом кадре).

Я уже некоторое время изучаю Adobe Animate, но я недавно начал изучать ActionScript, поэтому я очень новичок в этом языке. По сути, я просто пытаюсь сделать несколько "простой" профиль персонажа "страницей". Я пробовал несколько методов, но у них есть много ограничений. Ниже приведено то, что я использовал для одного клипа в рамке


function fl_ClickToHide(event: MouseEvent): void {
    Idle_mc.Idle_hw_mc.CrystalW_mc.Attribute_mc.IntelligenceW.visible = false;
    Idle_mc.Idle_hw_mc.CrystalW_mc.Attribute_mc.AgilityW.visible = false;
    Idle_mc.Idle_hw_mc.CrystalW_mc.Attribute_mc.StrengthW.visible = true;
}

button_7.addEventListener(MouseEvent.CLICK, fl_ClickToHide_2);

function fl_ClickToHide_2(event: MouseEvent): void {
    Idle_mc.Idle_hw_mc.CrystalW_mc.Attribute_mc.StrengthW.visible = false;
    Idle_mc.Idle_hw_mc.CrystalW_mc.Attribute_mc.IntelligenceW.visible = false;
    Idle_mc.Idle_hw_mc.CrystalW_mc.Attribute_mc.AgilityW.visible = true;
}

button_8.addEventListener(MouseEvent.CLICK, fl_ClickToHide_3);

function fl_ClickToHide_3(event: MouseEvent): void {
    Idle_mc.Idle_hw_mc.CrystalW_mc.Attribute_mc.StrengthW.visible = false;
    Idle_mc.Idle_hw_mc.CrystalW_mc.Attribute_mc.AgilityW.visible = false;
    Idle_mc.Idle_hw_mc.CrystalW_mc.Attribute_mc.IntelligenceW.visible = true;
}

Это работает, но есть много ограничений, например. если в клипе несколько кадров, то это не сработает.

Моя цель - создать кнопку, которая при нажатии будет искать определенный мувиклип, а затем редактировать свойства клипов в нем (т. Е. Красный, зеленый и синий).

TD; DR: Так есть ли код для поиска целевого фрагмента ролика по нескольким слоям фрагментов ролика в кадрах?

спасибо, надеюсь, то, что я сказал, имеет смысл.

1 Ответ

0 голосов
/ 15 июня 2019

Информация №1 .Объекты, которых нет в текущем кадре, в настоящий момент не существуют (по крайней мере, для вашего сценария).

Информация №2 .Смешение сценариев и фреймов - смелый поступок.Потому что впереди вас ждет много боли, страданий и страданий, как только вы решите пойти по этому пути.

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

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

package
{
    import flash.events.Event;
    import flash.events.EventDispatcher;

    public class AppData
    {
        static public const D:Object = new Object;
        static public const E:Event = new Event(Event.CHANGE);
        static public const I:EventDispatcher = new EventDispatcher;

        static public function has(key:String):Boolean
        {
            return D.hasOwnProperty(key);
        }

        static public function read(key:String):*
        {
            return D[key];
        }

        static public function write(key:String, value:*):void
        {
            if (value === null)
            {
                delete D[key];
            }
            else
            {
                D[key] = value;
            }

            I.dispatchEvent(E);
        }
    }
}

Теперь, если вы хотите, чтобы определенный клип вел себя определенным образом,фактически не зная, где находится этот клип в иерархии вашего приложения.Например, вы хотите контролировать его альфа-прозрачность.В первом кадре этого клипа вы делаете:

import AppData;
import flash.events.Event;

// The last argument is important, because timeline objects are
// auto-removed if their parent's timeline instructs so, thus
// you won't be able to locate them and unsubscribe, which,
// in turn, means they will hang in the memory forever.
// Still, if you subscribe them with useWeakReference
// set to true, they will be removed normally
// and unsubscribed automatically.
AppData.I.addEventListener(Event.CHANGE, onChange, false, 0, true);

// Call once in order to forcibly sync the object with the data.
onChange(null);

function onChange(e:Event):void
{
    if (AppData.has("red.alpha"))
    {
        alpha = AppData.read("red.alpha");
    }
    else
    {
        alpha = 1;
    }
}

Затем, после выполнения следующей инструкции, каждый объект, наблюдая, как параметр red.alpha изменит свой alpha :

import AppData;

AppData.write("red.alpha", 0.3);

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

...