Еще раз здравствуйте.
Я снова с вопросами.
Необходим создать новый объект из имеющихся составных частей, причем части должны быть сложены в определенном порядке, а при
необходимости объект должен разбираться снова.
Единственная идея, пришедшая мне в голову:
сделать части поверхностями, чтобы была возможность накладывать их друг на друга, а для проверки правильности сборки проверить что на что наложено.
Но при таком наложении у меня в инвентаре части и создаваемый объект все равно отображаются отдельно.
Код и вовсе странный получается:
buterbrod : fooditem, container sdesc = "бутерброд" rdesc = "бутерброда" ddesc = "бутерброду" vdesc = "бутерброд" tdesc = "бутербродом" pdesc = "бутерброде" noun = 'бутерброд' 'бутерброда' 'бутерброду' 'бутербродом' 'бутерброде' 'бутерброду#d' 'бутербродом#t' ldesc = "Бутерброд" isHim = true ; syr: fooditem, surface sdesc = "сыр" rdesc = "сыра" ddesc = "сыру" vdesc = "сыр" tdesc = "сыром" pdesc = "сыре" noun = 'сыр' 'сыра' 'сыру' 'сыром' 'сыре' 'сыру#d' 'сыром#t' ldesc= "Это сыр." isHim = true doPutOn(actor, io) = { self.moveInto(io); bulochka.moveInto(buterbrod); buterbrod.moveInto(Me); "Вы положили сыр "; io.vdesc; ". "; } ; bulochka: fooditem, qsurface sdesc = "булочка" rdesc = "булочки" ddesc = "булочке" vdesc = "булочку" tdesc = "булочкой" pdesc = "булочке" noun = 'булочка' 'булочки' 'булочке' 'булочку' 'булочкой' 'булочке#d' 'булочкой#t' 'булка' 'булки' 'булке' 'булку' 'булкой' 'булке#d' 'булкой#t' ldesc = "Это булочка. " isHer=true ;
Как этого можно избежать?
И может быть существует какой-то более правильный и простой способ конструирования нового объекта?
Заранее спасибо.
Отредактировано Natalka (14.03.2009 21:27)
Неактивен
Natalka написал:
Еще раз здравствуйте.
Я снова с вопросами.
Необходим создать новый объект из имеющихся составных частей, причем части должны быть сложены в определенном порядке, а при
необходимости объект должен разбираться снова.
Единственная идея, пришедшая мне в голову:
сделать части поверхностями, чтобы была возможность накладывать их друг на друга, а для проверки правильности сборки проверить что на что наложено.
Но при таком наложении у меня в инвентаре части и создаваемый объект все равно отображаются отдельно.
[SNIP]
Как этого можно избежать?
И может быть существует какой-то более правильный и простой способ конструирования нового объекта?
Заранее спасибо.
Возможно два подхода: один - если после объединения в бутерброд к сыру и булочке не требуется обращаться по отдельности. Тогда сыр и булочку перемещаем в nil (moveInto(nil)), а для результирующего объекта-бутерброда надо еще продублировать лексические свойства сыра и булочки. Кроме того, для него делается команда "разобрать бутерброд" (ну, или аналог какой-нибудь - с одним объектом), по которой уже бутерброд будет перемещаться в локацию nil, а сыр и булочка - возвращаться в инвентарь.
Если же нам и после объединения в бутерброд надо обращаться к булочке и сыру по отдельности, то Ваш подход в целом правильный. Чтобы сыр и булочка "не отсвечивали", надо присвоить их свойству isListed, "отвечающему" за отображение предметов во всевозможных списках, значение nil:
syr: fooditem, surface sdesc = "сыр" rdesc = "сыра" ddesc = "сыру" vdesc = "сыр" tdesc = "сыром" pdesc = "сыре" noun = 'сыр' 'сыра' 'сыру' 'сыром' 'сыре' 'сыру#d' 'сыром#t' ldesc= "Это сыр." isHim = true doPutOn(actor, io) = {if(io=bulochka) {self.moveInto(buterbrod); bulochka.moveInto(buterbrod); bulochka.isListed:=nil; self.isListed:=nil; buterbrod.moveInto(Me); "Вы положили сыр "; io.vdesc; ". "; } else {"Класть сыр на этот предмет нет смысла."; } } ;
Чтобы не переключать isListed туда-сюда каждый раз (это задалбывает, если вариантов объединения сыра и булочки много), можно просто определить для этих двух объектов isListed следующим образом:
isListed={if(self.location=buterbrod) {return nil;} // Если предмет находится в бутерброде, то он - его составная часть и не должен отображаться else {return true;} // Во всех остальных случаях отображаем предмет обычным образом }
Отредактировано uux (14.03.2009 22:14)
Неактивен