RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2425568 views

Aleks Versus Moderator 20.09.2022 07:03 (3 years ago)

nelsonrose777,
Все шесть вопросов требуют ответа в виде шести огромных статей, которые скорей всего в совокупности по объёму вытянут на целую книгу, потому что всё, перечисленное в этих вопросах, это игровые механики. Сложность реализации игровой механики зависит от упорства и целеустремлённости автора игры, а так же от структуры игры самой по себе. Для последовательно рассказываемой истории и для бродилки — реализация будет разная. Для маленького квеста и масштабной рпг - реализация будет разная. Даже банальные “характеристики персонажа” могут быть реализованы десятком различных способов. Сложно дать универсальный ответ по каждой из этих механик, расписывать по три четыре распространённых примера - долго. А ещё, в таком описании обязательно будут моменты, в которых человек, впервые пришедший в QSP, а то и в программирование вообще, запутается.

Поэтому всем, кто только начал знакомство с QSP, рекомендуют начинать с простых игр. С игр, для которых QSP в первую очередь предназначался: с квестов, или с книг-игр. Если у вас есть и идеи, и сюжеты, и миры, то на первых порах вам хватит инструментария, описанного в гайдах. Чтобы создать “Башню Абиссы” - игру, победившую в последнем конкурсе QSP-Compo, не нужны все эти сложности с течением времени, уймой характеристик и тому подобным. De@th K!d постоянно выпускает интереснейшие и пользующиеся популярностью игры, сделанные исключительно с помощью базовых возможностей языка и платформы. Даже экспериментальные форматы игр Mioirel не требуют каких-то обширных знаний в структурировании кода, написании механик, геймдизайне и прочем. Для всего этого игрового наследия QSP достаточно только той информации, что изложена в уже существующих гайдах.

К сожалению, писать гайды по механикам пока некому. Авторы, которые уже реализовали сложные механики в своих играх, не торопятся написать статейку-другую о том, как и что у них в игре устроено. Если сделаешь сам, надеюсь увидеть подобные статьи от тебя.
У себя на канале давно хочу запустить серию роликов по разработке игры с подвязкой тем по выбору механик, их реализации и прочему, но дело это не быстрое.

Доброго времени суток! Возможно где-то на форуме это обсуждалось, но потратив N-число времени, я так и не нашёл. Подскажите пожалуйста текст кода для воспроизведения видео файла в игре. Речь идёт о классическом qsp.

Aleks Versus Moderator 02.10.2022 16:55 (3 years ago)

7Юрий3,
в классическом QSP нельзя воспроизводить видео. Это возможно только в Quest Navigator и qSpider. Причём в Quest Navigator сделать это сложнее.
А код простой. Выводите видео с помощью html:

*p '<video width="400" height="300" controls="controls" poster="video/duel.jpg">'
   *p '<source src="video/duel.webm" type=''video/webm; codecs="vp8, vorbis"''>'
*p '</video>'

Описание тега: http://htmlbook.ru/html/video
Ответ на ваш вопрос есть так же здесь: FAQ/HowDo/Как вставить в игру видео?
Может быть найдёте там ответы и на другие вопросы

Спасибо очень помог совет. Перешёл по ссылке, почитал и узнал, что плеер от sonnix может открывать видео. Правда текст кода такой: *pl ‘<center><video loop src=“video/home/morning.webm” width=“800” height=“400” autoplay />’

Всем привет. Интересует вопрос, возможно ли получить значение массива (и вообще полноценно работать с этим массивом), переданным как параметр в func?
Например как-нибудь так:

func('arrays', 'get_array_value', $array)

Или так:

func('arrays', 'get_array_value', 'array')

У меня в коде функции получается ошибка из-за обращения через $ARGS1, QSP при проверке пишет “Недопустимое название переменной/массива”

P.S.
Искал ответ на этот вопрос на форуме и в гугле, но не нашел ничего. Если было, направьте, пожалуйста.

studentik,
Для работы с массивом есть arrpos.
Запись $ARGS1 некорректна с позиции синтаксиса. В $ARGS[1] что хранится, название массива?

dmvikar,
Да, по логике, $ARGS[1] хранит либо название массива, либо “ссылку” на него (если так можно выразиться в реалиях QSP).
Сам массив ассоциативный, т.е. выглядит примерно так:

$array['key_1'] = 'value'
array['key_2'] = 100

То есть, названия ключей служат их адресации, как-раз для того, чтобы не производить поиск с помощью arrpos или arrcomp. Только как обратиться к этому массиву (получить значение по ключу, изменить это значение, и прочие операции, выполняемые в том случае, когда мы обращаемся к известному массиву напрямую, типа $array[’key_1’] = ‘value 1’) из функции, если название этого массива было передано в виде параметра? $ARGS1 - было моим предположением, но очевидно, что это в QSP не работает.

UPD:
В справке по массивам сегодня появилось описание некой функции ARRITEM, которая как-раз и должна возвращать значение неизвестного заранее имени массива, но ни QGen, ни QSP плеер этой функции не понимают. Возникает вопрос, это новая функция плеера? Если да, то когда ждать релизной версии? (Использую 5.7.0)

P.S.
Опять же, не хватает функции, аналогичной ARRITEM, только для (пере)записи значения по индексу массива.

studentik,
ARRITEM - это для версии 5.8.0. Сейчас есть только qspider для этой версии.
Массив в версии 5.7.0 крайне не рекомендуется использовать для строковых и числовых значений одновременно. в 5.8.0 это невозможно.
Для передачи названия массива через args нужно использовать копирование

copyarr'$m',$args[0]

и уже работать с массивом $m. После использования - удаляешь.
Т.е. у тебя $m[’key_1’] будет иметь значение value.

dmvikar,
Проверил, работает. Спасибо за решение.
А почему не рекомендуется использовать массив для строковых и числовых значений одновременно? Какие подводные?

Aleks Versus Moderator 05.01.2023 17:02 (3 years ago)

dmvikar:

ARRITEM - это для версии 5.8.0. Сейчас есть только qspider для этой версии.

нет. Уже вышел классический 5.8.0. :P

dmvikar:

Массив в версии 5.7.0 крайне не рекомендуется использовать для строковых и числовых значений одновременно. в 5.8.0 это невозможно.

studentik:

А почему не рекомендуется использовать массив для строковых и числовых значений одновременно? Какие подводные?

Здесь имеется ввиду возможность в одну ячейку запихнуть и текстовое и числовое значение:

$mass[0]='текст' & mass[0]=137

В 5.7.0 оба значения будут лежать в нулевой ячейке, но в 5.8.0. в данном случае окажется только числовое.

Но вообще хранить одновременно в одном массиве и числовые и текстовые значения неудобно. Это не рекомендуется делать, чтобы избегать проблем с кодом при расширении проекта. Допустим нужно вывести все значения массива на экран, а у тебя в нём и числовые значения, среди которых может быть 0, и текстовые, среди которых может быть пустая строка. Вывести значения такого массива на экран уже проблематично.

Aleks Versus:

нет. Уже вышел классический 5.8.0. :P

Уже релиз? Или пока только Бета 7?

Aleks Versus:

Но вообще хранить одновременно в одном массиве и числовые и текстовые значения неудобно. Это не рекомендуется делать, чтобы избегать проблем с кодом при расширении проекта. Допустим нужно вывести все значения массива на экран, а у тебя в нём и числовые значения, среди которых может быть 0, и текстовые, среди которых может быть пустая строка. Вывести значения такого массива на экран уже проблематично.

Спасибо за разъяснение, а то мне показалось, что это некое ограничение QSP, из-за которого плеер может вылететь с ошибкой - независимо от того, насколько я осторожен с данными :)

Aleks Versus Moderator 07.01.2023 07:41 (3 years ago)

studentik:

Уже релиз? Или пока только Бета 7?

пока только бета, но это Байт осторожничает. Все ошибки, которые пока всплывали, были общие для библиотеки 5.8.0, он их уже устранил, новых ошибок за почти пол года не нашли.
Справка на вики переписана под плееры версии 5.8.0. Можно смело пользоваться. Чем больше людей начнут пользоваться, тем быстрее бета станет полноценным релизом.

Aleks Versus,
Скачал 5.8.0, пока вроде никаких проблем нет с игрой, написанной для 5.7.0.

Другой вопрос: когда-нибудь будет изменена работа menu на более удобную? Я имею в виду обработку самих пунктов, где вместо параметра “название локации” можно было бы писать код для динамического выполнения БЕЗ посещения какой-либо локации, потому что это накладывает кучу ограничений и плодит кучу ненужных локаций в игре. Да, я понимаю, что в локацию-обработчик передается параметр с индексом нажатого пункта меню, но если мне это не надо? Допустим, мне нужно изменить одну переменную или вызвать одну функцию - в зависимости от игровой ситуации, мне для этого придется дополнительно как-то эту ситуацию отдельно программировать в условиях локации-обработчика, чтобы в игре произошло то, что нужно. В то время как если бы у меню было поведение аналогичное гиперссылке с exec, мне достаточно было бы в параметре “название локации” написать только то, что нужно, без всяких костылей.
Меню ведь сами по себе очень полезные, информативные и компактные, но очень ограниченные и неудобные в плане работы с ними - уверен, что именно поэтому они так мало встречаются в играх на QSP.

Aleks Versus Moderator 08.01.2023 08:58 (3 years ago)

studentik,
это не ко мне вопрос, это к Байту. :) Лучше зайти в Дискорд на канал qsp_dev и там тегнуть Байта и спросить. Но я сразу вижу ограничение твоего варианта: в коде для пункта меню нельзя будет использовать двоеточие, а захочется. И начнутся претензии к Байту, почему он это не предусмотрел.

Вообще, ты мог бы и сам реализовать нужный тебе функционал. Есть костыльный вариант: засунуть код пункта вместо пути к изображению:

$stone_menu[0]='Взять камень:run_code:stone+=1 & pl"Взял камень"'
$stone_menu[1]='Выбросить камень:run_code:stone-=1 & pl"Выбросил камень"'

act "Камень": menu "$stone_menu"

При выборе пункта будет вызываться локация, которая будет извлекать код на выполнение и запускать его:

!# run_code
! получаем индекс пункта в массиве
local index = args[0]-1
! получаем пункт меню
local $menu_item = $stone_menu[index]
! локальные переменные
local $code, in_string
! проходимся циклом и вырезаем последнюю часть (с кодом) из пункта
loop local run=1 while run:
	in_string = instr($menu_item, ':')
	if in_string <> 0:
		$menu_item = $mid($menu_item, in_string+1)
	else:
		$code = $menu_item
		run = 0
	end
end
if $code<>'': dynamic $code

Но этот вариант мне сразу не нравится, он костыльный и неудобный. Плюс ограничение на двоеточие. Я бы сделал такой вариант:

! первый пункт меню
$stone_menu[0]='Взять камень:run_code'
$stone_menu_code[0]={
	stone+=1
	pl "Взял камень."
	pl "Теперь у меня <<stone>> камней."
}

! второй пункт меню
$stone_menu[1]='Выбросить камень:run_code'
$stone_menu_code[1]={
	stone-=1
	pl "Выбросил камень."
	pl "Теперь у меня <<stone>> камней."
}

act "Камень": menu "$stone_menu"
!# run_code
! получаем индекс пункта в массиве
local index = args[0]-1
! получаем код
local $code = $stone_menu_code[index]
if $code<>'': dynamic $code

Есть ещё вариант. Делаем надстройку над оператором menu, не вызывая его напрямую, а через обращение к отдельной локации. Тогда ты можешь в массив с пунктами меню вообще запихивать всё, что пожелаешь (как это было в первом варианте, например), а уже на этой локации вытаскивать информацию из пунктов, распихивать по специально отведённым массивам и после выбора пунктов меню выполнять тот или иной код из этих массивов.
Короче, вариантов масса, и ты их можешь сделать сам, чтобы облегчить жизнь себе.

Aleks Versus,
Примерно так я и решил проблему, определив для себя заранее переменную для выполнения кода через dynamic в локации-обработчике, и заполняя ее “на лету” необходимым кодом.
Я согласен, что варианты есть (я не говорил, что их нет), но подобные костыли очень часто раздувают код, который впоследствии становится трудно читать. Как всегда, хотелось бы более простого и изящного решения.

Log in or Register to post comments.