Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

0    0    #1
07.03.2011 23:46

Olegus t.Gl.
Участник (+1039, -248)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2851
Вебсайт

События при добавлении, удалении и перемещении объекта

Допустим, есть команды, с помощью которых можно поместить предмет (или другой объект) в локацию (в другой объект), убрать его из локации или переместить между локациями.

Есть возможность контролировать эти события через обработчики событий, вызываемые в определённые моменты выполнения операции.

Например, в момент вызова команды "Поместить" вызывается обработчик события "ПриДобавленииОбъекта" (с параметром "Время=Перед"). Если данный обработчик возвращает ДА, то предмет помещается в локацию. После чего вызывается обработчик события "ПриДобавленииОбъекта" (с параметром "Время=После"), чтобы отработать возможные события, которые должны произойти после появления предмета в локации.

С командой "Убрать" всё аналогично, а вот с командой "Переместить" — немного сложнее.

По идее, команда "Переместить" состоит из двух команд: "Убрать" и "Поместить", каждая из которых вызывает свои обработчики. Однако для отработки ситуации, когда игрок берёт предмет из сундука, а он у него выскальзывает из рук и падает на пол, может оказаться полезным обработчик "ПриПеремещенииОбъекта", который должен вызываться после команды "Убрать", но перед командой "Поместить", и в случае необходимости прервать команду "Переместить".

Есть у кого какие идеи на этот счёт?

Неактивен

0    0    #2
07.03.2011 23:57

Olegus t.Gl.
Участник (+1039, -248)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2851
Вебсайт

Re: События при добавлении, удалении и перемещении объекта

Кроме того, может ли у обработчика события "ПриПеремещенииОбъекта" быть параметр "Время" (перед/после). И если есть, то когда лучше вызывать обработчик: обрамляя команды "Убрать" и "Поместить":

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

Код:

ПриПеремещенииОбъекта (перед)
    Убрать
        Поместить
            ПриПеремещенииОбъекта (после)

или же лучше так:

Код:

Убрать
    ПриПеремещенииОбъекта (перед)
        Поместить
            ПриПеремещенииОбъекта (после)

Вот.

Неактивен

0    0    #3
08.03.2011 06:02

Eten
Участник (+9, -307)
Откуда: Балаково, Санкт-Петербург.
Зарегистрирован: 21.05.2007
Сообщений: 1416
Вебсайт

---

Re: События при добавлении, удалении и перемещении объекта

Мыслишки интересные, но не могу ухватиться без конкретики (разве что своим проектом это представить). А что из себя представляет исполнитель, на что ориентироваться?! А то команды взяты с потолка, хоть и осмысленны, но трудно вообразить в рамках этой темы. wink

Да кстати, а откуда обработчик события взял?! И как он поддерживается.

З.Ы.
Я может и уловил мысль или суть идеи, но ты видимо по своим представлениям описывал.

Отредактировано Eten (08.03.2011 06:03)

Неактивен

0    0    #4
08.03.2011 06:30

Eten
Участник (+9, -307)
Откуда: Балаково, Санкт-Петербург.
Зарегистрирован: 21.05.2007
Сообщений: 1416
Вебсайт

---

Re: События при добавлении, удалении и перемещении объекта

Далеко мыслишь. Сомневаюсь, что на данный момент это где-нибудь реализовано, но есть парочка своих мыслей в тему.

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

С другой стороны, исполнитель может вызывать обработчики событий, которые подключены на определенные события (как это сделано в движке моего блога). Но вот не задача, обработчики событий в таком случае вызываются лишь для конкретных сопровождающих событие действий, а не для попытки отмены самого действия, что породило это событие. Это нормальная практика, иначе могут возникать странности в работе скрипта, шиш после этого разберешься, где собака зарыта.

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

З.Ы.
Взято из реального опыта. smile

Неактивен

0    0    #5
08.03.2011 10:25

fireton
некто с бородой (+348, -92)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1098
Вебсайт

Тон

Re: События при добавлении, удалении и перемещении объекта

Olegus t.Gl. написал:

Есть возможность контролировать эти события через обработчики событий, вызываемые в определённые моменты выполнения операции.

Ну, в информе ровно так и сделано. Есть события before и after для любой команды. Кроме того, в них можно прекратить выполнение команды в любом из них, заместить стандартный текст и т.п.

Почитай мануал по информу, много интересного.

Неактивен

0    0    #6
08.03.2011 11:32

Olegus t.Gl.
Участник (+1039, -248)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2851
Вебсайт

Re: События при добавлении, удалении и перемещении объекта

fireton написал:

Olegus t.Gl. написал:

Есть возможность контролировать эти события через обработчики событий, вызываемые в определённые моменты выполнения операции.

Ну, в информе ровно так и сделано. Есть события before и after для любой команды. Кроме того, в них можно прекратить выполнение команды в любом из них, заместить стандартный текст и т.п.
Почитай мануал по информу, много интересного.

Разумеется я его читал (давно правда) и кое-что оттуда почерпнул. У меня весь этот функционал уже работает. Вопрос лишь в некоторых деталях, например, в каких местах в случае перемещения объекта нужно расставить точки "перехвата", чтобы было удобно влиять на процесс.

Неактивен

0    0    #7
08.03.2011 11:43

Olegus t.Gl.
Участник (+1039, -248)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2851
Вебсайт

Re: События при добавлении, удалении и перемещении объекта

Eten написал:

Далеко мыслишь. Сомневаюсь, что на данный момент это где-нибудь реализовано…

Ну у меня это реализовано, не говоря уж про Inform и т.п.

Eten написал:

Во-первых лучше сделать работу команд сделать без обработчиков событий. И сделать это функциями или подпрограммами (смотря на чем пишем, даже на гипотетическом языке). А сами обработчики событий заменить пользовательскими функциями…

Обработчик события — это и есть пользовательская функция, вызываемая движком в определённый момент времени с определёнными параметрами.

Eten написал:

С другой стороны, исполнитель может вызывать обработчики событий, которые подключены на определенные события … Но вот не задача, обработчики событий в таком случае вызываются лишь для конкретных сопровождающих событие действий, а не для попытки отмены самого действия, что породило это событие. Это нормальная практика, иначе могут возникать странности в работе скрипта, шиш после этого разберешься, где собака зарыта.

А зачем вызывать обработчик "для попытки отмены самого действия"? Как раз действие вызывает обработчик, который возвращает результат: можно ли продолжать процесс выполнения действия, или нужно прерваться.

Неактивен

0    0    #8
08.03.2011 12:21

Eten
Участник (+9, -307)
Откуда: Балаково, Санкт-Петербург.
Зарегистрирован: 21.05.2007
Сообщений: 1416
Вебсайт

---

Re: События при добавлении, удалении и перемещении объекта

Ну что ж, раз так, то стоит взять себе на заметку. wink

Неактивен

Powered by PunBB
© copyright 2001–2021 iFiction.Ru