ДеЦЦкий сад "ПандЁнок"
|
|
ninth | Дата: Четверг, 13.10.2011, 20:27 | Сообщение # 196 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| ValueError: too many values to unpack значит у тебя в списке waypoints слишком много значений. Возможно всего вместо тюпла ('действие', вектор) передаётся просто вектор. Что у тебя в модуле control в процедуре mouseControl.pick?
|
|
| |
serg-kkz | Дата: Четверг, 13.10.2011, 20:38 | Сообщение # 197 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Rivermacaroon0,
Открой модуль: control.py
Строчку: player.control('replace_wp', Vec3(entry.getSurfacePoint(render))) замени на: player.control('replace_wp', ('goto', Vec3(entry.getSurfacePoint(render))))
Видно ошибка в коде, у меня тоже так было. В этой теме уже упоминалась это проблема и было приведено решение.
ООП -
Сообщение отредактировал serg-kkz - Четверг, 13.10.2011, 20:39 |
|
| |
Rivermacaroon0 | Дата: Четверг, 13.10.2011, 22:02 | Сообщение # 198 |
Рядовой
Группа: Пользователи
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
| Сорри значит не заметил, тему просмотрел. Спасибо, решение помогло. Еще вопросик, подскажите как сделать взаимодействие объектов при клике мышкой? т.е. например если кликнуть допустим на одного из гномиков появлялся диалог или какое либо другое действие? Я только начинаю разбираться, сорри за глупые вопросы.
|
|
| |
serg-kkz | Дата: Четверг, 13.10.2011, 22:38 | Сообщение # 199 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Ну это не глупые вопросы, но замечу что в уроках об этом было сказано. Погляди внимательно реализацию клацанья по поверхности террайна мышью. И сделай анолагично с гномами. Основы в уроке Клик-клик
ООП -
Сообщение отредактировал serg-kkz - Пятница, 14.10.2011, 11:51 |
|
| |
ninth | Дата: Пятница, 14.10.2011, 20:28 | Сообщение # 200 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Одним указанием не обойдёшься. Как я понимаю, необходимы следующие действия: 1. Персонаж подходит к указанному НПС и переходит в режим диалога 2. НПС прекращает любые свои действия и так же переходит в режим диалога 3. Запускается собственно сам процесс, реализующий диалог.
Что из этого нужно пояснить подробнее?
|
|
| |
Rivermacaroon0 | Дата: Пятница, 14.10.2011, 23:10 | Сообщение # 201 |
Рядовой
Группа: Пользователи
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
| Спасибо я разобрался как сделать... 2 дня сидел читал документацию разбирался
Меня сейчас интересует как сделать что бы BitMask32.bit(1) можно было задать сразу для разных значений... Т.е. что бы не размножать код для каждого отдельно а просто в написать несколько условий что делать если 1 что делать если 2 и т д...
Сейчас код у меня выглядит вот так
Code class mouseControl(DirectObject): def __init__(self): self.picker = CollisionTraverser() self.pickerQ = CollisionHandlerQueue() pickerCollN = CollisionNode('mouseRay') pickerCamN = base.camera.attachNewNode(pickerCollN) pickerCollN.setFromCollideMask(BitMask32.bit(1)) pickerCollN.setIntoCollideMask(BitMask32.allOff()) self.pickerRay = CollisionRay() pickerCollN.addSolid(self.pickerRay) self.picker.addCollider(pickerCamN, self.pickerQ) self.accept('mouse1',self.pick) def pick(self): if base.mouseWatcherNode.hasMouse(): mpos = base.mouseWatcherNode.getMouse() self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY()) self.picker.traverse(render) #print self.pickerQ.getNumEntries() for i in xrange(self.pickerQ.getNumEntries()): entry=self.pickerQ.getEntry(i) player.control('replace_wp',('goto',Vec3(entry.getSurfacePoint(render)))) #print 'entry '+str(entry.getSurfacePoint(render))
class mouseClick(DirectObject): def __init__(self): self.picker = CollisionTraverser() self.pickerQ = CollisionHandlerQueue() pickerCollN = CollisionNode('mouseRay') pickerCamN = base.camera.attachNewNode(pickerCollN) pickerCollN.setFromCollideMask(BitMask32.bit(2)) pickerCollN.setIntoCollideMask(BitMask32.allOff()) self.pickerRay = CollisionRay() pickerCollN.addSolid(self.pickerRay) self.picker.addCollider(pickerCamN, self.pickerQ) self.accept('mouse1',self.pick) def pick(self): if base.mouseWatcherNode.hasMouse(): mpos = base.mouseWatcherNode.getMouse() self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY()) self.picker.traverse(render) print self.pickerQ.getNumEntries() if self.pickerQ.getNumEntries() > 0: res=OnscreenText(text = 'my русский текстtext string', pos = (-0.5, 0.02), scale = 0.07) т.е. я добавил битмаск2 на бокс в примере. И когда в него попадаю мышкой появляется текст. А если у меня будет допустим 10 моделей и каждому надо вывести свой диалог, не писать же на каждый коллизию.
И был бы очень признателен если пояснишь как сделать что бы перейти в режим диалога, т.е. как я понимаю там должна присутствовать функция вида как радиобаттон для выбора ответа и разветвления события. Спасибо
Сообщение отредактировал Rivermacaroon0 - Пятница, 14.10.2011, 23:24 |
|
| |
ninth | Дата: Пятница, 14.10.2011, 23:15 | Сообщение # 202 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Хм. Для начале тебе этот режим диалога реализовать надо ) Засунь код в bb code, а то отступы не видно. Насчёт битовой маски не совсем понял вопрос, хотя подозреваю. Что тебе нужна обработка событий на коллизии.
|
|
| |
Rivermacaroon0 | Дата: Пятница, 14.10.2011, 23:31 | Сообщение # 203 |
Рядовой
Группа: Пользователи
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
| Код поправил. Ну как я понял работает эта система так... если в мы получаем ответ BitMask.bit(1) то гном идет к соотвествующей точке. если BitMask.bit(2) то у меня выполняется OnScreenText. Это я добавил для проверки работоспособности. Т.е. Into BitMask.bit(2) у меня сейчас имеет box Code box=loader.loadModel('res/geometry/box') box.reparentTo(render) box.setScale(3) box.setPos(35,35,loc.terrain.getElevation(35,35)*30) box.find('**/+GeomNode').node().setIntoCollideMask(BitMask32.bit(2)) А если я допустим добавлю еще одну модель на карту мне придется писать опять этот код на коллизию на BitMask.bit(3) Как этого избежать и использовать одну проверку для разных моделей и соотвественно с разными условиями. Или я что то совсем не так делаю?
|
|
| |
serg-kkz | Дата: Пятница, 14.10.2011, 23:39 | Сообщение # 204 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Лучше повесть тег на нод, и проверять его.
ООП -
Сообщение отредактировал serg-kkz - Пятница, 14.10.2011, 23:42 |
|
| |
ninth | Дата: Пятница, 14.10.2011, 23:43 | Сообщение # 205 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| serg-kkz дело говорит - маски не для этого служат. Чтобы выяснить от какого объекта пришёл ответ вешай тег. Пример есть в стандартных демах - шахматная доска и здесь в этой демке кажется: http://panda3d.org.ru/load/1-1-0-5
|
|
| |
serg-kkz | Дата: Пятница, 14.10.2011, 23:45 | Сообщение # 206 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Можно еще по имени нода, у меня в редакторе так.
ООП -
|
|
| |
ninth | Дата: Пятница, 14.10.2011, 23:49 | Сообщение # 207 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| С именем нода есть один подводный камень - если изначальный объект состоит из нескольких кусков, то можешь получить не совсем то, что ожидал. Хотя в данном случае это по-идее тоже должно работать.
|
|
| |
serg-kkz | Дата: Пятница, 14.10.2011, 23:55 | Сообщение # 208 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Code info = self.pickerQ.getEntry(0) # получаем информацию по первому полигону info1 = info.getIntoNodePath() # выбираем информацию имя нода, имя модели, т.д. PathSimul = str(info1) # переводим инфо в строку translite1 = PathSimul.split('/') # разделяем слэшами и получаем список name_selest = translite1[1] # обращаемся к втрому значению, которое будет содержать имя нода print name_selest
Воткни вместо: Code #print self.pickerQ.getNumEntries()
Ну и модели прицепляй к именованным нодам. Все
ООП -
Сообщение отредактировал serg-kkz - Воскресенье, 16.10.2011, 12:18 |
|
| |
serg-kkz | Дата: Пятница, 14.10.2011, 23:57 | Сообщение # 209 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Quote (ninth) С именем нода есть один подводный камень - если изначальный объект состоит из нескольких кусков, то можешь получить не совсем то, что ожидал. Хотя в данном случае это по-идее тоже должно работать. Порядок всегда одинаков, родитель после рендер вторым идет.
ООП -
|
|
| |
ninth | Дата: Суббота, 15.10.2011, 00:02 | Сообщение # 210 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Может выйти так, что ты не знаешь на каком уровне от корня находится требуемый объект, да и делать столь жёсткую привязку не слишком хорошо.
|
|
| |