Разработчикам игр на Atril, часть 6: Лист персонажа
Ср Июн 11, 2014 11:27
- Доступные действия:
Jumangee
Во всех бочках затычка
Разработчикам игр на Atril
Часть 6: Лист персонажа
Актуально для: Atril 2.1.1
В предыдущем описании мы разобрались как сделать инвентарь в игре. Теперь перед нами стоит задача отобразить его содержимое на листе персонажа, а заодно и другие игровые параметры.
Для поддержки работы с листом персонажа, атрил заранее пытается получить доступ к его шаблону и в дальнейшем работать с ним. В примере из GDK, это происходит в событии ‘jsiq_init_start’:jsIQ.addEventHandler('jsiq_init_start', function(params, vars, process) {
...
this.containers.charsheet = $('#charsheet');
...
});
Здесь #charsheet это HTML-элемент определёный в разметке. После инициализации движка работать с листом персонажа возможно через jsIQ.containers.charsheet используя чистый jQuery, это первый вариант, он является практически эквивалентом реализации "магазина" из example.xml:var items = getItemList(); // вызываем глобальный скрипт
var html = $('<ul></ul>');
for (var i = 0; i < items.length; i++){
html.append('<li>' + items[i] + '</li>');
}
jsIQ.containers.charsheet
.html('') // очищаем его содержимое
.append(html); // вставляем инвентарь
В этом примере отображение инвентаря произойдёт только если специально вызвать такой скрипт. Но лучше он подойдёт, например, при начальном выборе персонажа или каких-либо специальных действиях с инвентарём. В остальных случаях, необходимо, чтобы скрипт вызывался "автоматически", чтобы реагировать на игровые события и всегда отображать актуальное содержимое.
Для этого познакомимся с "линкованными переменными" (красивого названия не придумано ). Суть их проста: в текст параграфа и/или в шаблон листа персонажа (параграф charsheet) добавляем код вида:
<span class="linked" name="name"></span>
Теперь, движок в случае обнаружения переменной this.name (т.е. локальной для параграфа), либо vars.name (т.е. глобальной) при отображении параграфа сразу вставит содержимое.
Единственная проблема, что содержимое вставляется "как есть", а потому массивы и объекты так просто отобразить не получится. Но есть решение – создадим специальную функцию-знчение, для этого, в некотором скрипте-инициализирующем игровые параметры пишем:jsIQ.linkValue('inventory', function(){
if (!vars.inventory) return '';
var list = $('<ul></ul>');
for (var name in vars.inventory){
if (!vars.inventory.hasOwnProperty(name)){ continue; }
if (vars.inventory[name] > 0){
list.append('<li>' + vars.inventory[name] + '</li>');
}
}
return list.html();
});
Как видите, функция всегда возвращает строку (а не html-элементы). Я сознательно не ре-использовал скрипт getItemList как в примере выше, по двум причинам: из экономии производительности и особенностей вызова скриптов.
Тему производительности пока трогать не будем, а вот с особенностями вызова скриптов познакомиться надо. Дело в том, что linkValue-функции и обработчики событий выполняются "вне параграфа", а в этой области напрямую вызвать ни локальные ни глобальные скрипты нельзя, их просто не существует.
Для вызова скриптов "извне" необходимо использовать команду
jsIQ.articleScript( scriptline, extargs, parentEnv )
где
- scriptline – название скрипта, либо "скрипт-запрос" (вида ‘скрипт?параметр1=значение,параметр2=значение’)
- extargs – ассоциативный массив параметров, передаваемых в скрипт
- parentEnv – объект-описание окружения, здесь рассматриваться не будет
Одновременное использование "скрипт-запроса" и передача extargs не предусмотрена, либо то, либо то. Таким образом, в нашем пример, для вызова getItemList можно использовать:var list = jsIQ.articleScript( 'getItemList' );
Теперь познакомимся с обработкой события обновления листа персонажа. Это может пригодиться для реализации особых случаев или сложных действий с листом персонажа.
Событие ‘update_charsheet’ происходит в момент после окончания "рендеринга" текущего параграфа, а оно происходит по времени между preload и onload вызовами скриптов.
Добавление обработчика события можно сделать следующим образом:jsIQ.addEventHandler('update_charsheet', function(params, vars, process) {
// произошло обновление листа персонажа
if (vars.hp < 1) {
// персонаж проиграл, лист персонажа отображать не нужно
this.containers.charsheet.hide();
}
process.next();
});
На этом пока всё.
ps. Требуется небольшое пояснение относительно лучшей методики создания шаблона листа персонажа. Дело в том, что явно вытекает минимум два life-style игры на движке Atril:
- standalone
- игровой модуль
Разделы форума
-
Книго-игровые марафоны
- Власть страха
- Монстр наносит ответный удар
- Теневой демон
- Стеклянные небеса
- Фон
- Зеркало Парфины: Повергнуть демона храма
- Королевская битва
- Киберпанк: Тени Найт-Сити
- Время решений
- Падшие ангелы
- Зиккурат Ленина
- Зловещие тропы Алмана
- Рандеву
- Корона королей
- Герои
- Небо над Бангкоком
- Каслевания: Битва в старом замке
- Рыцарь живых мертвецов
- Кольца злобы
- Око Сфинкса
- Мадам Гильотина
- Турнир юнлингов
- Политический отбор
- Хачиманский марафон
- Преддверие
- Идущие на смех
- Убийство в клубе Диоген
- Марафон безумного переводчика
- Рок-марафон
- Болотная лихорадка
- Проклятие замка «Пяти башен»
- Подземелья замка кошмаров
- Джунгарское нашествие
- Марафон
- МАКИМ
- МАКИМ
- Книго-игровой марафон 2014
- МАКИМ
-
Конкурсы
-
Обсуждение форумных РПГ
-
Большой Адронный Коллайдер
-
Утилиты для помощи ДМам
-
Безвременье
-
События и мероприятия
-
Книгровой клуб "Мы Текстовые!"