[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
ДеЦЦкий сад "ПандЁнок"
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 дня сидел читал документацию разбирался smile

Меня сейчас интересует как сделать что бы 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()


Ну и модели прицепляй к именованным нодам. Все wink


ООП  -  

Сообщение отредактировал 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
Может выйти так, что ты не знаешь на каком уровне от корня находится требуемый объект, да и делать столь жёсткую привязку не слишком хорошо.
 
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
Поиск: