- Как сделать так, чтобы flash-приложение обменивалось данными с электронным курсом?
- Как сделать так, чтобы flash-приложение обменивалось данными с LMS?
- Как сделать так, чтобы flash-приложение управляло прохождением курса?
- Как сделать из flash-приложения полноценный вопрос?
Недавно мне самому пришлось искать ответы на эти вопросы для редактора Adobe Captivate. Я убил на это уйму времени, перелопатил гору материала и изучил азы программирования, чтобы убедиться: на самом деле, это не так уж и сложно. Меня крайне огорчил тот факт, что каких-либо инструкций по Captivate в целом и по его взаимодействию с Flash в частности на русском языке практически не найти. Поэтому я взялся обобщить свой опыт и это досадное недоразумение хотя бы частично, но устранить.
Итак, перейдем к сути вопроса. Самый главный момент: для взаимодействия с Captivate нужно превратить “флешку” в виджет. Сделать это очень просто: надо всего лишь добавить специальный код. К нему мы вернемся чуть позже, а сейчас рассмотрим пару общих моментов.
Существует три типа виджетов для Adobe Captivate:
- статический виджет;
- интерактивный виджет;
- виджет-вопрос.
Статический виджет может получать данные из курса и взаимодействовать с переменными (как системными, так и пользовательскими) Captivate. Это самый простой вид виджета, однако его возможностей, как правило, хватает для решения большинства задач.
Интерактивный виджет дополнительно может передавать в Captivate данные о своем состоянии: выполнено правильно/неправильно, а также вызывать подсказку.
Виджет-вопрос также может передавать данные о состоянии: правильный/неправильный ответ и вопрос завершен/отвечен не полностью. Помимо этого данные о состоянии вопроса могут быть переданы в LMS, и использоваться при повторном открытии курса. Результаты виджета автоматически учитываются наравне с результатами стандартных вопросов.
Для того, чтобы получить код, соответствующий выбранному типу виджета, надо выполнить несложную манипуляцию (для просмотра нажмите на иконку ниже) .
Обратите внимание, что помимо Adobe Captivate на вашем компьютере должен быть установлен Adobe Flash CS4 или CS5.
В следующих публикациях, я попытаюсь доступно рассказать о том, как пользоваться этим кодом, но уже сейчас могу сказать точно, что ничего сложного в этом нет!
Посмотрел видео. Создавать виджеты, используя “create widget”, т.е. стандартный код, который предлагает Captivate — пустая трата времени. Написание и поддержка становятся кошмаром, на изобретение костылей уходит больше времени, чем на полезную работу. Рекомендую использовать – и рассказывать об этом клиентам – фреймворки Widget Factory (cpguru.com) или cpGears.
Могу рассказать подробнее, если есть желание.
С уважением,
Сергей
Сергей, я думаю, что не у меня одного есть огромное желание об этом узнать. Если не сложно, набросайте пару строк.
Денис, запросто
Предположим, нам нужна прозрачная кнопка, которая при нажатии показывает несколько объектов на слайде и прячет несколько других. Можно делать её с помощью advanced actions, но учитывая кривизну интерфейса Капа (например, копировать экшны между слайдами почти так же долго, как создавать их с нуля, а копировать их между проектами невозможно вообще), но можно создать свой виджет.
Шаг 1. Идём на cpguru (или кто хочет – гуглим альтернативу, cpgrears), скачиваем классы, подключаем их во флэше (или просто копируем папку widgetfactory в директорию с нашим .fla).
Шаг 2. Строим интерфейс виджета. На одном слое – видимый в Капе (например, поля ввода текста – названий объектов, которые виджет будет прятать и показывать). На другом слое – видимый в рантайме, т.е. собственно кнопку размером в 100% сцены.
Шаг 3. Создаем и подключаем класс showhide.as, за основу берём шаблон с cpguru. В шаблоне имеется несколько функций, каждая из которых исполняется ТОЛЬКО в определенный момент: в рантайм (ролик играется), во время редактирования файла cptx, во время предпросмотра, во время настройки свойств виджета и т.п.
Шаг 4. В функцию enterRuntime() вписываем функционал прятания объектов. Ключ к успеху – функция getSlideObjectByName(NAME).alpha=0; Виджетфактори позволяет вот так легко и ненавязчиво ловить объекты на слайде и делать с ними почти всё, что можно делать с displayobjects во флэше. Не забываем сделать visible=false для нашего меню с текстовыми полями.
Шаг 5. В функцию enterPropertiesDialog() вписываем функционал настройки виджета. Тут все просто – есть текстовые поля, в них есть имена, сохраняем их в массив, дальше в рантайме проходимся по массиву и все их прячем или показываем. Ключ к успеху – способность виджета сохранять информацию внутри cptx (и конечно сохранять её внутри каповского swf при паблише). Для этого при закрытии диалога свойств кнопкой Save запускаем saveProperties(), всё сохраняется. При открытии, соответственно, считываем обратно. Таким образом, виджет становится частью функционала Капа — его можно переносить между слайдами и проектами, копировать, легко задавать в нем список объектов, при этом всё сохраняется и запускается, как в режиме редактирования.
Шаг 6. Мечтаем о том, что когда-нибудь найдём время и заменим текстовые поля на выпадающий список присутствующих на слайде объектов
На cpguru.com всё описано популярнейшим образом, желаю успехов. Весь код виджета занимает 50 строк – посчитайте, сколько их в стандартном файле.
P.S. – 50 строк – это с разбивкой и комментариями
Стандартный статический виджет – 200+ строк ещё до того, как мы начнём что-то туда писать.
Бонус-трек:
package {import widgetfactory.*;
import widgetfactory.events.*;
import flash.events.MouseEvent;
public class showhide_as extends StaticWidget {
private var shown_objects:Array = [];
private var hidden_objects:Array = [];
private var hiddenOnEnter_objects:Array = [];
public function showhide_as():void {}
private function showhide(e:MouseEvent):void {
for each (var obj2:String in shown_objects) {
if (obj2.length > 0) getSlideObjectByName(obj2).alpha=1;
}
for each (var obj:String in hidden_objects) {
if (obj.length > 0) getSlideObjectByName(obj).alpha=0;
}
}
////PROPERTIES //////////////////////////
override protected function saveProperties():void {
properties.showlist = m.show_box.text;
properties.hidelist = m.hide_box.text;
properties.hideOnEnterlist = m.hideOnEnter_box.text;
}
override protected function enterPropertiesDialog():void {
butt.visible=false;
m.hideOnEnter_box.text=properties.hideOnEnterlist;
m.show_box.text = properties.showlist;
m.hide_box.text = properties.hidelist;
}
///////////////////////////////////////////////////////////////////////////
override protected function enterStage():void {
m.visible=false;
}
///////////////////////////////////////////////////////////////////////////
override protected function enterRuntime():void {
m.visible=false;
butt.addEventListener(MouseEvent.MOUSE_DOWN, showhide);
butt.buttonMode=true;
shown_objects=properties.showlist.split(",");
hidden_objects=properties.hidelist.split(",");
hiddenOnEnter_objects=properties.hideOnEnterlist.split(",");
for each (var obj3:String in hiddenOnEnter_objects) {
if (obj3.length > 0) getSlideObjectByName(obj3).alpha=0;
}
}
}
}
Сергей, огромное спасибо за мастер класс, ссылки на ресурсы и конструктивную критику. Будем совершенствоваться
Сергей, у меня еще парочка вопросов.
Как Вы думаете, для каких категорий пользователей подойдет предложенный Вами способ?
Сможет ли его сходу понять пользователь, не имеющий глубоких познаний в программировании? И нужен ли начинающему пользователю самый элегантный, но при этом более сложный вариант решения, или, для начала, подойдет любой работоспособный?
Это я к тому, что предложенный Вами способ очень хорош, но для тех, кто имеет определенный опыт.
Если вы не против, то Ваши комментарии, мы оформим отдельной статьей для более продвинутых пользователей. Ну и конечно авторство будет Вашим.
Для статьи я бы текст слегка переписал и приложил исходники. Через несколько дней, наверное, найду момент.
Что касается “элегантный, но при этом более сложный вариант”, то позвольте категорически не согласиться. Фреймворки облегчают жизнь, в том числе пользователям. Например, чтобы сделать в html картику “таскаемой” с помощью javascript, придётся повозиться. А с помощью JQueryUI – нужно просто дописать class=”draggable” к элементу.
Точно так же и тут: с widgetfactory получается ясный, короткий код, к которому есть документация, примеры и живая поддержка. А с File-New-Widget получаем нечитаемый код со слабой документацией и поддержкой в стиле “классика от Adobe”.
Лично я как классический не-программист (я, если что, технический директор и мои обязанности в ИТ-классификации куда ближе к business analyst, чем к developer), просто не осилил эти 200 строк кода от Adobe, а с widgetfactory (куда меня отправили добрые люди с пользовательского форума Adobe) всё завертелось буквально за минуты.
Так что позвольте уж дополнить статью более подробным описанием начала процесса, и вам сразу станет понятно: фреймворки – это самое то для начинающих.
Сергей, спасибо за детальный ответ. Буду ждать статью
Возникла необходимость в проект, созданный на Captivate 4, добавить виджеты. Но Captivate 4 не хочет почему-то импортировать виджеты (даже те, которые по умолчанию имеются в галерее). Выскакивает окно, где он просит установить флеш-плейер 8 или выше. Установил флеш-плейер 8 – результат тот же. Но если никакого плейера не установлено, тогда он это видит и отсылает на adobe.com. Одновременно у меня установлены Macromedia Flash 8 + Flash CS3 + Flash CS5. Flash CS3 он видит, код для виджета в него экспортирует. Подскажите, пожалуйста, помогите развитию образования в нашей стране.))
Леонид, добрый день!
Никогда не сталкивался с такой проблемой, но думаю, что она может решиться, если использовать Captivate 5. Открыть проект в нем и пересохранить. Устанавливать Captivate и Flash лучше из одного пакета – Adobe E-Learning Suite, тогда проблем с интеграцией быть не должно
Денис, спасибо за поддержку! Но, к сожалению, дело в том, что в Captivate 4 я создаю тесты, которые затем в виде .swf подгружаются в флеш-проект, который написан на AS2. А Captivate 5 работает только с AS3. Виджеты мне нужны для создания вопроса с перетаскиванием картинок. Когда я импортирую .swf с перетаскиванием, созданный во флеш, в качестве анимации, то не могу установить связь с переменными в Captivate 4. Может, есть какой-нибудь бесплатный виджет с перетаскиванием элементов для Captivate 4?