RU

Вопросы по Quest Navigator

Nex Moderator 21.02.2015 07:05 59 comments 42811 views

Здесь задаём любые вопросы по плееру Quest Navigator.

И тем не менее, хотелось бы всё-таки спросить об этом Nex’а.

HertzQ,

1. Определяем набор “сцен”: типов локаций, оформление которых различается.

Типичные варианты: “обложка”, “основная часть”, “об игре”, “концовка”.
Придумываем названия классов для каждой сцены. Пусть это будет “cover”, “main”, “about”, “ending”.

2. Прописываем в CSS-файле соответствующие правила, для применения этих классов к тегу BODY:

/* Если в основном экране или в концовке, то делаем верхний край основного описания ниже, чтобы оставить место для верхней панели */
body.main #qsp-wrapper-main, 
body.ending #qsp-wrapper-main { top:57px; }
body:not(.main):not(.ending) #qsp-wrapper-main { top:0px; }

3. В шаблоне игры, в файле “game.js” создаётся функция “skinSetStage”, которая “переключает” текущий класс тега BODY.

var skinStage = "";

function skinSetStage(cssClass)
{
	// Переключаем класс всего body, тем самым задаем разный стиль для разных игровых экранов
	var t = $(document.body);
	if ((skinStage !== '') && (t.hasClass(skinStage)))
		t.removeClass(skinStage);
	skinStage = cssClass;
	if ((cssClass !== '') && (!t.hasClass(cssClass)))
		t.addClass(cssClass);
}

4. В игре, в нужных локациях прописывается вызов этой функции.

! Стартовая локация игры.
! В начале игры, назначаем обработчик "загрузки игрового сохранения".
$ONGLOAD = 'OnLoad'
! Назначаем первую сцену - показываем "обложку" игры.
$stage = 'cover'
GS 'Stage'

! Локация "OnLoad".
! При загрузке игры, 
! скрываем и показываем все необходимые элементы скина.
GS 'Stage'

! Локация "Stage"
EXEC('JS:skinSetStage("' + $stage + '");')

! Первая сюжетная локация. Показываем сцену "основная часть".
$stage = 'main'
GS 'Stage'

! Проигрыш. Показываем сцену "концовка".
$stage = 'ending'
GS 'Stage'

Большое спасибо.

помогите пожалуйста при открытие игры появляется надпись ошибка при выполнении js-вызова .как исправить?

Видимо, ошибка в яваскрипте. Нужно смотреть, какой яваскрипт используется в игре, искать ошибку там.

Возникла задача, которую я не могу решить. Я не могу вызвать функцию JavaScript через оператор EXEC, когда перехожу на локацию, на которой записан вызов этой функции. Пример: у меня есть простенькая функция для JavaSript, которая прячет элемент с заданным ей ID:

Spoiler
function hideElement(elementId) {
   if (document.getElementById(elementId)) {
      var obj = document.getElementById(elementId);
      if (obj.style.display != "none") { 
         obj.style.display = "none";
      }
   }
}

Расмотрим всё на примере прогрессбара. Если в файле QSP прописать эти строчки:

'<progress id="progressbar" value="50" max="100"></progress>'
EXEC('JS:hideElement("progressbar");')

то никакого скрытия не будет вообще. Брогрессбар так и останется на экране.
Но если написать такой код:

'<progress id="progressbar" value="50" max="100"></progress>'
'<a onclick="hideElement(''progressbar'')">Кнопка</a>'

то при нажатии на ссылку прогрессбар исчезает как и было задумано. Но почему он не исчезает в предыдущем варианте? Хотя если прописать вызов обычного Alert через оператор EXEC, то всё отлично работает:

EXEC('JS:alert("AAA!!!");')

Скажите чего я не понимаю и почему нет скрытия элемента страницы(прогрессбара) в первом случаи?

Aleks Versus Moderator 27.11.2016 14:45 (9 years ago)

Storm,
возможно при попытке выполнить код через exec страница ещё не свёрстана. Не пробовал запустить тот же код через counter создав задержку или из действия?

Aleks Versus, я тоже подумал о том, что страница не готова в тот момент, когда выполняется функция. Тогда как правильно вызвать функцию? Из действия ACT будет тот же самый вариант, что с ссылкой. Тут вопрос немного в другом. Допустим, у нас есть страница с какими-то элементами на ней(прогрессбар тоже находится на ней); на этой же странице есть ссылка, которая выполняет другую локацию как функцию, пример такой локации:

a=1
b=2
![Ещё какой-то код]
EXEC('JS:hideElement("progressbar");')

При выполнении этой локации как функции переменные “a” и “b” приобретут свои значения. Но строчка

EXEC('JS:hideElement("progressbar");')

просто не выполниться. Вопрос: как сделать так, чтобы выполнилась?)

Задачка решена добавлением такой строчки:

'<script>window.onload=hideElement("progressbar");</script>'

После добавления скрипта на то, чтобы функция выполнилась после загрузки всей страницы всё заработало. Не уверен, что это самый оптимальный способ, но пока буду пользоваться им.
Может кто знает более лучший? =)

Aleks Versus Moderator 28.11.2016 05:58 (9 years ago)

Storm,
в принципе можно было скрыть элемент через css. А уже потом, когда нужно, открывать с помощью функции.

Aleks Versus, задача стояла совершенно не в том, чтобы скрыть элемент. Нужно было активировать функцию JavaScript так, чтобы она работала. Функцию с сокрытием элемента я брал лишь для примера.

Storm,
onload - всё правильно, это самый адекватный способ.

Можно ещё на “document ready” повесить: https://learn.jquery.com/using-jquery-core/document-ready/

Здравствуйте, форумчане. Скажите, кто-то проверял поворот элементов с помощью CSS? Я добавляю в класс элемента такую строчку:

transform: rotate(45deg);

Но элемент отказывается поворачиваться. Это свойство не поддерживается Навигатором?
Upd: А вот так работает:

-webkit-transform: rotate(45deg);

Найден глюк в Навигаторе с отображением прогрессбара. Создайте новый QSP-файл, создайте локацию “Start”, на которой напишите код:

USEHTML=1
'<progress value=5 max=7></progress>'
ACT'Кнопка':gs 'Start'

Сохраните и запустите через Навигатор. После нажатие на действие “Кнопка” прогрессбар исчезает, хотя такого не должно происходить.

Storm,
зачем делать GS на текущую локацию?

Log in or Register to post comments.