Как сделать?
…
Привет. Есть несколько вопросов.
1. В Qgen есть папки. Как сделать такие же папки только в тексте? QGenом не пользуюсь, а папки очень удобны (было бы удобно сворачивать по ним, а потом пользоваться QGen для мелких правок)
2. Каким редактором кода пользуетесь? Как научить редактор сворачивать локации (#Локация -) и игнорировать знак “-” в середине кода.
3. Как использовать CSS? Или как в местном HTML сделать сплошные границы таблицы. (Чтобы потом отображалось в QSP плеере.)
4. Как в меню засунуть картинку .jpg и html код?
5. Как “тащить” args[] через меню. Конструкция menu ‘Текст:локация’ не допускает параметры запуска локации(если не ошибаюсь). Сейчас пользуюсь отдельной переменной, но хочется избежать, их и так много.
6. Есть ли какой-нибудь дебаггер, чтобы значение переменных показывал при выполнении кода или подобное. Сейчас для дебага вывожу значение искомой переменной текстом, но при выполнении меню и промежуточных GS текст не выведешь.
Заранее спасибо
GarniZone,
1. Это должно делаться на уровне текстового редактора. Мне такие способы неизвестны.
2. QGen 5 (сырая версия с неполным функционалом, тебе не подойдёт).
3. Зависит от используемого плеера.
4. Меню. HTML, по-моему, должен работать.
5.
В локацию-обработчик выбора пункта меню передаётся аргумент (ARGS[0]) - позиция выбранного пункта. Позиции элементов меню индексируются с 1.
Зная какие пункты добавляются в меню, можно сделать соответствующий обработчик меню.
6. Есть на уровне кода QSP. http://qsp.su/index.php?option=com_content&id=71&Itemid=56
Nex:
GarniZone,
…
Спасибо
3. Как использовать CSS в QSP плеере? Например style игнорируется.
4. Вот что получается.
Spoiler
[s
5. Это хорошо, чтобы все обработчики засунуть в одну локацию. Но не более. Никаких дополнительных сведений не передать.
6. Спасибо!
Вспомнил один злободневный вопрос
7.
#Yard_117
count117 = 0
lastitem = ARRPOS(0,'arr117',99)
:loop
IF count117! lastitem:
*p '<a href="exec: XGOTO ''click'', <<arr117[count117]>>"><img src="pics\<<$pic[arr117[count117]]>>.jpg"></a>'
count117 += 1
JUMP 'loop'
''
End
-
!получились куча картинок со ссылками
#click
!нужно по клику изменить этот элемент (count117) массива (arr117). Могу передать число и текст, а как передать название
!переменной (массива), чтобы дальше с ней работать. Массивов много, обработчик один. В каждый массив обработчик
!совать код раздуется в разы.
!или например можно ли передав чисто 117 каким-то образом научить программу работать с массивом arr117
-
В общем:
можно ли передать название переменной (массива) через аргумент, чтобы дальше работать с переменной (не с текстом названия)
либо
можно ли каким-то образом отождествить переменную (массив) А с переменной (массивом) Б, чтобы работать только с переменной (массивом) Б, а изменения происходили и с А, и с Б.
либокак-то иначе решить проблему в коде выше
GarniZone:
- Это хорошо, чтобы все обработчики засунуть в одну локацию. Но не более. Никаких дополнительных сведений не передать.
Какие ещё сведения нужны кроме номера пункта меню, чтобы определить нажатый пункт меню? :)
GarniZone:
- Как использовать CSS в QSP плеере? Например style игнорируется.
У QSP ограниченная поддержка HTML. Список того, что поддерживается - тут. AeroQSP поддерживает чуть больше, но лагает при большом количестве картинок. Сейчас в разработке следующий плеер (Quest Navigator), который полностью поддерживает HTML и CSS.
GarniZone:
- Вот что получается.
Нужно присвоить USEHTML = 1, по умолчанию html выключен
GarniZone:
как-то иначе решить проблему в коде выше
Не понял вопрос, но думаю, что тебе пригодится оператор DYNAMIC
newsash:
Какие ещё сведения нужны кроме номера пункта меню, чтобы определить нажатый пункт меню? :)
Никакие, но мне пункт меню не нужен, у меня и так локации-обработчики разные. Я так понял menu не предусматривает пользовательских аргументов.
newsash:
У QSP ограниченная поддержка HTML. Список того, что поддерживается - тут. AeroQSP поддерживает чуть больше, но лагает при большом количестве картинок. Сейчас в разработке следующий плеер (Quest Navigator), который полностью поддерживает HTML и CSS.
Спасибо. Исчерпывающе.
newsash:
Нужно присвоить USEHTML = 1, по умолчанию html выключен
Забыл. Но с ним тоже самое.
#Начало
USEHTML = 1
ACT 'Меню':
$menu[0] = '<p><b>привет</b></p>: привет'
menu '$menu'
End
-
#Привет
'<p><b>привет</b></p>'
-
на выходе пункт меню выглядит так: <p><b>привет</b></p>. Для сверки сделал в локации ту же запись с таким же синтаксисом. В локации так: привет.
Видимо в menu html не поддерживается.
newsash:
GarniZone:
как-то иначе решить проблему в коде выше
Не понял вопрос, но думаю, что тебе пригодится оператор DYNAMIC
Спасибо. Пошел изучать.
GarniZone,
чтобы передать параметры, нам достаточно знать номер выбранного пункта меню. Аргументы складываем в отдельный массив, в обработчике извлекаем по номеру пункта меню.
! Основной код
$меню[0] = 'Первый пункт:обработчик'
$меню[1] = 'Второй пункт:обработчик'
$меню[2] = 'Третий пункт:обработчик'
$аргументы[0] = 'Аргумент для первого пункта'
$аргументы[1] = 'Аргумент для второго пункта'
$аргументы[2] = 'Аргумент для третьего пункта'
ACT 'Вызвать меню':
MENU '$меню'
END
! Локация обработчика
$аргументы[ARGS[0] - 1]
Особо отмечу, что обработчики у пунктов могут быть разными, это ни на что не влияет. Просто в каждом из них извлекаем аргументы описанным способом при необходимости.
GarniZone,
по поводу “массива 117”, скорее всего, тебе просто нужен двумерный массив. Это зависит от задачи. Объясни, что в самой игре происходит, не в терминах программирования, тогда будет ясно, как эту задачу лучше решить.
Что касается “как передать массив по имени”, можно сделать так. Передаём в локацию аргументом имя массива, и переменную “по значению”, то есть само значение переменной.
*p '<a href="exec: XGOTO ''click'', ''arr117'', <<count117>>"><img src="pics\<<$pic[arr117[count117]]>>.jpg"></a>'
В локации “click” копируем содержимое указанного массива во “временный” (вспомогательный) массив, делаем в нём изменения, записываем значения обратно.
! Разбираем аргументы
element = ARGS[2]
$array = $ARGS[1]
! Копируем значения из указанного массива во вспомогательный
COPYARR '$a', '<<$array>>'
! Работаем со вспомогательным массивом
$a[element] = $a[element] + 1
...
! Записываем обратно изменённые значения
COPYARR '<<$array>>', '$a'
Если в обработчике используется только один элемент указанного массива, то, при желании, можно копировать только его, а не весь массив целиком.
Nex
Благодарю. Не ожидал такой отзывчивости :)
С аргументами для menu я так и делал.
Nex:
GarniZone,
по поводу “массива 117”., скорее всего, тебе просто нужен двумерный массив. Это зависит от задачи. Объясни, что в самой игре происходит, не в терминах программирования, тогда будет ясно, как эту задачу лучше решить.
Происходит вот что. Есть много локаций, в каждой локации есть предметы. Игрок может прийти в локацию, положить и забрать предметы. Соответственно я делал обработчики типа “Взять предмет из локации” и “Положить предмет в локацию”.
Массив-инвентарь я могу задать прямо, искомый номер элемента массива могу задать атрибутом взяв из ссылки, вопрос был: как сообщить машине массив локации (ящик с предметами). :)
Nex:
Что касается “как передать массив по имени”…
COPYARR подходит. Спасибо большое.
Пробовал на этом коде
Spoiler
#Начало
az[0] = 1
az[1] = 17
az[2] = 231
az[3] = 654
az[4] = 1167
az[5] = 12
az[6] = 21
az[7] = 101
az[8] = 2321
az[9] = 7
Mz = RAND(1,9)
ACT 'Удалить случайный элемент' : GS 'Удалить',Mz,'az'
ACT 'Содержание массива':
count=0
:loop
IF az[count] ! 0 :
'<<az[count]>>'
count += 1
Jump 'loop'
End
End
-
#Удалить
$array = $args[1]
element = args[0]
copyarr 'ar2','<<$array>>'
last = ARRSIZE('ar2')
IF element = ar2[last-1]:
ar2[last-1] = 0
Else
ar2[element] = ar2[last-1]
ar2[last-1]=0
End
copyarr '<<$array>>', 'ar2'
-
GarniZone,
как я и говорил, подойдёт двумерный массив. Так как на каждой локации свой набор предметов, то будет два индекса. Первый - имя текущей локации. Второй - номер предмета на локации. Имя текущей локации берётся из $CURLOC. Только вызывать обработчик тогда нужно не через XGT, а через GS, иначе произойдёт переход и $CURLOC изменится на имя локации обработчика.
! Ссылка на предмет
! Передаём в обработчик только номер предмета, имя локации и так известно.
! Обращаем внимание, что теперь появились вложенные подвыражения. Главное, ничего не напутать.
*p '<a href="exec: GS ''click'', <<count117>>"><img src="pics\<<$pic[items[''<<$CURLOC>>,<<count117>>'']]>>.jpg"></a>'
! Обработчик
element = ARGS[1]
$item = items['<<$CURLOC>>,<<element>>']
Таким образом, используется один двумерный массив, который хранит все предметы всех локаций.
Nex:
GarniZone,
как я и говорил, подойдёт двумерный массив. Так как на каждой локации свой набор предметов, то будет два индекса. Первый - имя текущей локации. Второй - номер предмета на локации. Имя текущей локации берётся из $CURLOC. Только вызывать обработчик тогда нужно не через XGT, а через GS, иначе произойдёт переход и $CURLOC изменится на имя локации обработчика.! Ссылка на предмет ! Передаём в обработчик только номер предмета, имя локации и так известно. ! Обращаем внимание, что теперь появились вложенные подвыражения. Главное, ничего не напутать. *p '<a href="exec: GS ''click'', <<count117>>"><img src="/pics\<<$pic[items[''<<$CURLOC>>,<<count117>>'']]>>.jpg"></a>' ! Обработчик element = ARGS[1] $item = items['<<$CURLOC>>,<<element>>']Таким образом, используется один двумерный массив, который хранит все предметы всех локаций.
Да, точно. В этом случае не нужно название массива перекидывать, а просто найти его в первом списке.
Я правильно понимаю, что двумерный массив a[x,y] позволяет для любого x иметь свой набор значений y?
A ARRPOS, ARRSIZE, ARRCOMP с ним работают? Есть какая нибудь инфа про двумерные в QSP? Хотя бы синтаксис по ARRPOS, без него никак.
Вот как чувствовал, что ерунду горожу и есть способы по-лаконичнее. Ну ладно, пофрустрирую и пойду переделывать. :)
Добавил: ARRPOS никак не хочет работать с двумерным массивом. Интересно, он наверно методом простого перебора работает, может перебиралку в Dynamic сделать.
GarniZone,
по двумерным массивам документации нет.
Двумерный, трёхмерный, сколькоугодномерный массив такого типа - это одномерный массив с текстовыми индексами, записанными в придуманном автором формате.
Пример:
a['1,2'] = 3
a['2,2'] = 4
a['абырвалг'] = 5
Получается массив из трёх элементов, со строковыми индексами “1,2”, “2,2”, “абырвалг”. Каждому строковому индексу ставится в соответствие числовой индекс - порядковый номер элемента массива. Нумерация начинается с нуля.
a[0]
a[1]
a[2]
Этот код выведет:
3
4
5
Так как в QSP массивы непрерывны, в них нет “пустых”, отсутствующих элементов. Мы всегда можем установить точно, сколько элементов есть в массиве (ARRSIZE), и все их перебрать по очереди, по числовому индексу.
Так как многомерный массив отличается от любого другого только придуманным автором форматом индекса, то на уровне языка он ничем не отличается от любых других массивов. Все функции работают с ним точно так же, как и с другими массивами.
Спасибо, теперь понятно.
подскажите как лучше сделать внутри игровой таймер, допустим чтобы повторное действие можно было совершить не раньше чем через 4 дня.
изпользую такой таймер времени.
дни = время / (24*60)
часы = (время - дни*24*60) / 60
минуты = время - часы*60 - дни*24*60
saks,
! Новое волшебное яблоко вырастает за четыре дня.
ACT 'Сорвать волшебное яблоко':
! В переменной "время_яблока" храним время, когда появится следующее яблоко.
! По умолчанию 0, это значит, что яблоко ещё не сорвано ни разу.
IF (время_яблока = 0) OR (время_яблока < время):
'Вы сорвали яблоко.'
ADDOBJ 'яблоко'
! Устанавливаем время появления следующего яблока в будущем, через четыре дня.
! К значению текущего времени прибавляем четыре дня и сохраняем результат в переменной "время_яблока".
время_яблока = время + 4*24*60
ELSE
'Новое яблоко ещё не выросло.'
END
END
Два важных момента:
1. Нужно не забыть сделать какие-то продолжительные действия, которые увеличивают переменную “время”, двигают время вперёд. Например, “погулять”, “поспать”, или сделать что-то полезное. Иначе время “застрянет” и игрок никогда не доберётся до нужных действий.
2. Тот код, который ты привёл, это не “таймер”, а только расчёт для вывода времени на экран. Весь учёт времени идёт в одной-единственной переменной “время”. Дни, часы, минуты - это просто разбивка этой переменной на составляющие для понятного представления игроку, и должно использоваться исключительно при выводе информации. В крайних случаях - для определения времени суток, или количества прошедших дней с начала игры. Все условия в игре, для которых необходимо вычислить игровой промежуток, должны опираться только на переменную “время”.