Adobe Animate CC, HTML5 Canvas — записывать имена экземпляров в виде динамического текста?

Простите меня, я не настоящий JS-программист и до сих пор разбираюсь во многих концепциях.

Предположим, у вас есть группа похожих ролловеров с 2 кадрами и 2 состояниями, вложенных в содержащий их клип с именем экземпляра «Карта». Каждый клип использует 4-значный идентификационный номер, которому предшествует буква «s» в качестве имени экземпляра — например, «s6566».

Предположим, что затем нужно захватить эти соответствующие имена экземпляров, чтобы определить переменную, чтобы один небольшой сценарий мог позволить каждому из этих фрагментов ролика отображать свой идентификатор при прокрутке/активном состоянии (в данном случае «6566») в нескольких файлах.

В конечном счете, у меня есть тысячи этих маленьких клипов, разбросанных по нескольким десяткам документов, и кажется, что должно быть довольно просто получить имя/идентификатор экземпляра каждого символа, удалить «s» в начале (там, потому что имена экземпляров не могут начинаться с цифра) и применить указанный идентификатор в виде динамического текста к соответствующему прокручиваемому/активному фрейму символа.

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


person Halfacre    schedule 07.06.2019    source источник


Ответы (1)


Дочерние элементы MovieClip сохраняются как ссылки с использованием имени их экземпляра. Вы можете увидеть формат в JS-файле экспортированной библиотеки. Обратите внимание, что Animate преобразует имена некоторых экземпляров, чтобы удалить неподдерживаемые символы или дубликаты.

Вот непроверенный псевдокод для начала.

// You can iterate a MovieClip and get the names
for (var name in someMovieClip) {
    // Ignore anything not starting with an s
    if (name.substr(0,1) != "s") { continue; }

    // remove the s
    var newName = name.substr(1);

    // The child can be accessed using bracket-access with its name
    var child = someMovieClip[name];

    // The child should have text instances if it is set up how you described
    // Set the text to the newName
    child.textInstance.text = newName
}

Не забудьте обновить сцену после внесения изменений. Если у вас уже настроен Ticker для этого, он должен немедленно обновиться.

Надеюсь, это поможет. Если у вас есть дополнительные вопросы, дайте мне знать.

person Lanny    schedule 08.06.2019
comment
Еще раз спасибо, @Lanny! Я надеялся увидеть тебя здесь. Поэтому я заменил someMovieClip на имя экземпляра моего содержащего клипа и добавил к нему console.log(newName), но newName возвращается как undefined. Что мне не хватает? Что касается var name... объявляю ли я name новой переменной? Я понимаю, что действительно показываю здесь свою задницу, ха-ха. При этом, что такое Тикер? съежиться - person Halfacre; 10.06.2019
comment
Что вы получите, если console.log(n)? Это должно быть s1456 или любое другое имя вашего экземпляра. Цикл for просто перебирает все свойства MovieClip, и экземпляры сохраняются в каждом MovieClip как переменные. Он выведет имя строки. createjs.Ticker используется EaselJS для регулярного обновления сцены, и Animate должна инициировать это в шаблоне HTML. Надеюсь, это поможет! - person Lanny; 11.06.2019
comment
console.log(n) вернулся Can't find variable: n - person Halfacre; 11.06.2019
comment
ха, полностью моя ошибка. Должно быть name, а не n. name.substr() и т. д. - person Lanny; 11.06.2019
comment
Не беспокойтесь, очень ценю помощь. Итак, я получил символ с именем экземпляра Map на основной временной шкале со следующим кодом на слое действий на основной временной шкале: codepen.io/halfacre/pen/wLBvEp console.log(name); возвращает значение undefined. Вот скрин внутри экземпляра карты (символ называется mapTop), показывающий одну из выделенных остановок, с примером ее идентификатора, перед которым стоит буква s в качестве имени экземпляра (просто чтобы убедиться, что структура действительно такая, как я изложил ранее) . Каждая остановка находится на своем слое (если это имеет значение). postimg.cc/ftPh3j42 - person Halfacre; 11.06.2019
comment
Во что превращается Map, когда вы записываете его в console.log? Есть ли шанс, что вы можете опубликовать или отправить свою библиотеку javascript и html? Трудно отлаживать, не запуская его :) - person Lanny; 11.06.2019
comment
Понятно! Я обновил перо с помощью HTML и JS, созданных в Animate. Я не уверен, почему я наполовину ожидал, что это сработает там, но это не так. Там много старого кода CS5 закомментировано, а в JS есть 5-значные строки. Все еще в пути над моей головой, ха-ха. - person Halfacre; 11.06.2019
comment
Извините, забыл ответить на ваш первый вопрос. console.log(Map) возвращает следующее: function Map() { [native code] } - person Halfacre; 12.06.2019
comment
У вас есть несколько вариантов использования Map по сравнению с this.Map. Обратите внимание, что существует глобальный объект Map. в JavaScript, поэтому вы видите журнал [native code]. Поменяйте местами их, и вы можете начать видеть фактические значения, которые вы ожидаете! - person Lanny; 12.06.2019