Допустим, есть команды, с помощью которых можно поместить предмет (или другой объект) в локацию (в другой объект), убрать его из локации или переместить между локациями.
Есть возможность контролировать эти события через обработчики событий, вызываемые в определённые моменты выполнения операции.
Например, в момент вызова команды "Поместить" вызывается обработчик события "ПриДобавленииОбъекта" (с параметром "Время=Перед"). Если данный обработчик возвращает ДА, то предмет помещается в локацию. После чего вызывается обработчик события "ПриДобавленииОбъекта" (с параметром "Время=После"), чтобы отработать возможные события, которые должны произойти после появления предмета в локации.
С командой "Убрать" всё аналогично, а вот с командой "Переместить" — немного сложнее.
По идее, команда "Переместить" состоит из двух команд: "Убрать" и "Поместить", каждая из которых вызывает свои обработчики. Однако для отработки ситуации, когда игрок берёт предмет из сундука, а он у него выскальзывает из рук и падает на пол, может оказаться полезным обработчик "ПриПеремещенииОбъекта", который должен вызываться после команды "Убрать", но перед командой "Поместить", и в случае необходимости прервать команду "Переместить".
Есть у кого какие идеи на этот счёт?
Неактивен
Кроме того, может ли у обработчика события "ПриПеремещенииОбъекта" быть параметр "Время" (перед/после). И если есть, то когда лучше вызывать обработчик: обрамляя команды "Убрать" и "Поместить":
(отступ показывает, что следующий уровень обрабатывается при успешном выполнении текущего)
ПриПеремещенииОбъекта (перед) Убрать Поместить ПриПеремещенииОбъекта (после)
или же лучше так:
Убрать ПриПеремещенииОбъекта (перед) Поместить ПриПеремещенииОбъекта (после)
Вот.
Неактивен
fireton написал:
Olegus t.Gl. написал:
Есть возможность контролировать эти события через обработчики событий, вызываемые в определённые моменты выполнения операции.
Ну, в информе ровно так и сделано. Есть события before и after для любой команды. Кроме того, в них можно прекратить выполнение команды в любом из них, заместить стандартный текст и т.п.
Почитай мануал по информу, много интересного.
Разумеется я его читал (давно правда) и кое-что оттуда почерпнул. У меня весь этот функционал уже работает. Вопрос лишь в некоторых деталях, например, в каких местах в случае перемещения объекта нужно расставить точки "перехвата", чтобы было удобно влиять на процесс.
Неактивен
Eten написал:
Далеко мыслишь. Сомневаюсь, что на данный момент это где-нибудь реализовано…
Ну у меня это реализовано, не говоря уж про Inform и т.п.
Eten написал:
Во-первых лучше сделать работу команд сделать без обработчиков событий. И сделать это функциями или подпрограммами (смотря на чем пишем, даже на гипотетическом языке). А сами обработчики событий заменить пользовательскими функциями…
Обработчик события — это и есть пользовательская функция, вызываемая движком в определённый момент времени с определёнными параметрами.
Eten написал:
С другой стороны, исполнитель может вызывать обработчики событий, которые подключены на определенные события … Но вот не задача, обработчики событий в таком случае вызываются лишь для конкретных сопровождающих событие действий, а не для попытки отмены самого действия, что породило это событие. Это нормальная практика, иначе могут возникать странности в работе скрипта, шиш после этого разберешься, где собака зарыта.
А зачем вызывать обработчик "для попытки отмены самого действия"? Как раз действие вызывает обработчик, который возвращает результат: можно ли продолжать процесс выполнения действия, или нужно прерваться.
Неактивен