Как сделать?
…
Мне надо в основное окно описания. Я использовал $backimage. Не анимируется. В остальных окошках все анимируется
Приветствую. Опыта в программировании нет, знание QSP на уровне учебника…
Возник такой вопрос:
act '1':a=a+1 & delact '1'
act '2':a=a+1 & delact '2'
if a=2:act '3':''
Почему при выполнении условия не появляется действие “3”? Как сделать правильно?
act '1':a=a+1 & delact '1' & if a=2:act '3':''
act '2':a=a+1 & delact '2' & if a=2:act '3':''
Работает, но не рационально, код повторяется…
Puffy,
1. DELACT использовать не рекомендуется (в учебнике кстати его нет, откуда взял непонятно). Чревато багами.
2. Писать операторы в одну строку всегда чревато багами. Не рекомендуется. Пользуйся всегда многострочными формами ACT и IF, не пользуйся соединением операторов “&”. В учебнике опять же такого “всё-запишем-в-одну-строку” кода нет.
3. После выполнения действия, не выполняется код локации. Для выполнения кода локации после кода действия, нужно в конце самого действия выполнить перезаход на локацию: “GOTO $CURLOC”.
4. Ты очень зря в примере всё свёл к “абстракциям”, лучше если бы оставил как есть в игре, с настоящими названиями переменных, настоящим текстом действий. Иначе крайне трудно понять, какая на самом деле задача стоит, и как лучше для неё составить код. В зависимости от ситуации код совершенно разный. Поэтому на полностью абстрактную задачу ответ получается громоздкий и некрасивый.
IF take_1 = 0:
ACT '1':
take_1 = 1
a = a + 1
GOTO $CURLOC
END
END
IF take_2 = 0:
ACT '2':
take_2 = 1
a = a + 1
GOTO $CURLOC
END
END
IF a = 2:
ACT '3':
...
END
END
Также изучи Действие по условию.
Nex:
1. DELACT использовать не рекомендуется (в учебнике кстати его нет, откуда взял непонятно). Чревато багами.
Из справки. Да, я её прочитал.
А как тогда иначе удалить одно действие? По условию и дополнительным переменным не громоздко ли?
Nex:
2. Писать операторы в одну строку всегда чревато багами. Не рекомендуется. Пользуйся всегда многострочными формами ACT и IF, не пользуйся соединением операторов “&”. В учебнике опять же такого “всё-запишем-в-одну-строку” кода нет.
Я и не пишу в редакторе однострочные операторы. Написал тут для лаконичности.
Nex:
3. После выполнения действия, не выполняется код локации. Для выполнения кода локации после кода действия, нужно в конце самого действия выполнить перезаход на локацию: “GOTO $CURLOC”.
Я так и думал, но неправильно реализовывал.
Nex:
4. Ты очень зря в примере всё свёл к “абстракциям”, лучше если бы оставил как есть в игре, с настоящими названиями переменных, настоящим текстом действий. Иначе крайне трудно понять, какая на самом деле задача стоит, и как лучше для неё составить код. В зависимости от ситуации код совершенно разный. Поэтому на полностью абстрактную задачу ответ получается громоздкий и некрасивый.
Стесняюсь писать свой корявый код и не менее корявый текст :P
Спасибо за “громоздкий и некрасивый код”, для меня именно абстрактные задачи и универсальные решения приводят к пониманию принципов работы. Например, попытался написать код для решения квадратного уравнения (изучая условия), но оказалось, тут нельзя возводить в степень :)
Из справки. Да, я её прочитал.
Рекомендую также пройти учебник, и не просто прочитать, а реально выполнить уроки - он специально сделан для закрепления самых важных основ.
А как тогда иначе удалить одно действие? По условию и дополнительным переменным не громоздко ли?
Зависит от ситуации.
В большинстве случаев (за исключением диалогов с NPC), “исчезновение” действия после его выполнения должно быть постоянным. То есть, например, взял яблоко со стола - исчезло действие “взять яблоко”. При этом, если мы просто удалим через DELACT, то при следующем заходе на локацию оно снова появится. И это будет багом - можно будет бесконечно брать яблоки (т.н. “мыльная фабрика”). Поэтому мы заводим переменную и оборачиваем в условие, делаем действие по-настоящему “одноразовым”.
Сегодня, допустим, ты поленился сделать условие и переменную, обошёлся с помощью DELACT, уверенный, что на эту локацию игрок два раза не зайдёт. Через неделю, ты делаешь переход на эту локацию, а про код на самой локации не вспоминаешь - получается баг с лишним действием.
Также, часто бывает удобно поместить в то же условие не только само действие, но и динамический текст в описании локации. Тут уже - в реальном, а не абстрактном примере - всё становится более осмысленно и менее громоздко.
'Я очутился в логове Паучихи. Огромные паучьи яйца сложены в углу.'
IF яйцо_взял = 0:
' Одно яйцо стоит чуть в стороне от остальных.'
ACT 'Взять яйцо':
яйцо_взял = 1
ADDOBJ 'Паучье яйцо'
GOTO $CURLOC
END
END
Так что такой приём с переменной и условием в итоге очень полезен и используется повсеместно.
Nex:
Так что такой приём с переменной и условием в итоге очень полезен и используется повсеместно.
Спасибо за разъяснение. В моём коде использование delact’a оказалось оправданным (действие не одноразовое), и я теперь знаю 2 способа для разных ситуаций :)
Однако, моя проблема оказалась в том, что я недостаточно осознаю, чего я не понимаю. Оказалось, в моём случае ACT’ы оказались вложенными друг в друга, и gt $curloc начинал все действия, удаленные delact’ом, заново. А нужно было лишь ACT’ы расположить друг за другом, и приём с переменной и условием стал применимым. Вопрос исчерпан.
Puffy,
также частая ошибка, когда действие переименовывается, а соответствующий DELACT забывают переписать. Чтобы такого не происходило, лучше использовать функцию $SELACT:
! Удалить выбранное действие
DELACT $SELACT
Ну так что мне делать с неработающей анимацией на фоне? Как можно анимировать?
На фоне анимация не отображается
Puffy:
Например, попытался написать код для решения квадратного уравнения (изучая условия), но оказалось, тут нельзя возводить в степень
Возведение в степень - это не проблема. Даже вычисление квадратного корня - не проблема. Если глубоко понимаешь математику, знаешь правила записи чисел, ты можешь составить любую функцию, от нужды. Решение квадратного уравнения - отличная идея! Добью в своём математическом модуле, вдруг пригодится. Если нужны готовые функции, прошу ознакомиться. Возведение в степень и извлечение квадратного корня (методом Ньютона) присутствуют.
Aleks Versus:
Если нужны готовые функции, прошу ознакомиться
Ознакомился, все работает, восторг :D А я то думал, рогалик - это нетипичное применение QSP, как я ошибался :D
Рогалики на QSP уже делали, только не припомню чтобы кто-то при этом квадратный корень извлекал.
Как сделать, чтобы во время WAIT у игрока не отбирали управление? Чтобы можно было продолжать выбирать варианты действия и т.д.
RomaDova,
нужно не использовать WAIT, вместо этого использовать COUNTER. См. Действие по таймеру.
Но вообще реалтаймовые задания в текстовых играх - плохая идея.
где-то это уже было, но я спрошу снова, потому что искать среди сотни страниц слишком трудно
А какой оператор отвечает за сохранение и загрузку сохранений?