尝试制作一个针对特定影片剪辑属性的按钮,该属性位于影片剪辑的多层中

时间:2019-06-15 16:52:30

标签: actionscript-3 adobe-animate

我想在影片剪辑的多层中更改特定MovieClip(名为Red_mc)的不透明度(示例层层次结构:Character_mc> arm_mc>武器_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;
}

这很有用,但有很多局限性,例如。如果影片剪辑中有多个单帧,则它将不起作用。

我的目标是创建一个按钮,单击该按钮时将搜索特定的MovieClip,然后在其中编辑电影剪辑的属性(即红色,绿色和蓝色)。

TD; DR:那么,代码是否有办法在帧中的多层影片剪辑中搜索目标特定的影片剪辑?

希望我所说的有意义。

1 个答案:

答案 0 :(得分:0)

信息№1。当前不在当前帧中的对象不存在(至少对于您的脚本而言)。

信息№2。混合脚本和框架是很勇敢的事情。因为一旦您决定走那条路,就会有很多痛苦和磨难。

如果我的任务是对复杂的层次结构中的许多程序进行编程,那么我认为我将执行以下操作。

首先,我将设计一个共享数据类,该类可以在您的应用程序的任何位置使用。

package com.java.ds.arrays;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

public class FileRead {

    public static void main(String[] args) {


        HashMap<String, Integer> wordCountMap = new HashMap<String, Integer>();

        BufferedReader reader = null;

        try {
            // Creating BufferedReader object

            reader = new BufferedReader(new FileReader("ser.txt"));

            // Reading the first line into currentLine

            String currentLine = reader.readLine();

            while (currentLine != null) {
                // splitting the currentLine into words

                String[] words = currentLine.toLowerCase().split(" ");

                // Iterating each word

                for (String word : words) {
                    // if word is already present in wordCountMap, updating its count

                    if (wordCountMap.containsKey(word)) {
                        wordCountMap.put(word, wordCountMap.get(word) + 1);
                    }

                    else {
                        wordCountMap.put(word, 1);
                    }
                }


                currentLine = reader.readLine();
            }

            // Getting the most repeated word and its occurrence

            String mostRepeatedWord = null;

            int count = 0;

            Set<Entry<String, Integer>> entrySet = wordCountMap.entrySet();

            for (Entry<String, Integer> entry : entrySet) {
                if (entry.getValue() > count) {
                    mostRepeatedWord = entry.getKey();

                    count = entry.getValue();
                }
            }

            System.out.println("The most repeated word in input file is : " + mostRepeatedWord);

            System.out.println("Number Of Occurrences : " + count);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close(); // Closing the reader
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

现在,如果您希望某些片段以某种方式运行,而又不真正知道,则该片段在您的应用程序层次结构中可能在哪里。例如,您要控制其Alpha透明度。在此剪辑的第一帧上,您将执行以下操作:

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

然后,一旦执行以下指令,每个对象,观看 red.alpha 设置都会更改其 alpha

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

上面的设置非常原始,并且可能可以通过多种方式进行改进,但这很大程度上取决于对您在此处构建的内容的了解,而我没有。