RU 📌 Pinned

Как сделать?

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

Мне надо в основное окно описания. Я использовал $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

Ну так что мне делать с неработающей анимацией на фоне? Как можно анимировать?

На фоне анимация не отображается

Aleks Versus Moderator 03.06.2014 15:33 (11 years ago)

Puffy:

Например, попытался написать код для решения квадратного уравнения (изучая условия), но оказалось, тут нельзя возводить в степень

Возведение в степень - это не проблема. Даже вычисление квадратного корня - не проблема. Если глубоко понимаешь математику, знаешь правила записи чисел, ты можешь составить любую функцию, от нужды. Решение квадратного уравнения - отличная идея! Добью в своём математическом модуле, вдруг пригодится. Если нужны готовые функции, прошу ознакомиться. Возведение в степень и извлечение квадратного корня (методом Ньютона) присутствуют.

Aleks Versus:

Если нужны готовые функции, прошу ознакомиться

Ознакомился, все работает, восторг :D А я то думал, рогалик - это нетипичное применение QSP, как я ошибался :D

Рогалики на QSP уже делали, только не припомню чтобы кто-то при этом квадратный корень извлекал.

Как сделать, чтобы во время WAIT у игрока не отбирали управление? Чтобы можно было продолжать выбирать варианты действия и т.д.

RomaDova,
нужно не использовать WAIT, вместо этого использовать COUNTER. См. Действие по таймеру.

Но вообще реалтаймовые задания в текстовых играх - плохая идея.

где-то это уже было, но я спрошу снова, потому что искать среди сотни страниц слишком трудно

А какой оператор отвечает за сохранение и загрузку сохранений?

Log in or Register to post comments.