Главная » Статьи » Деццкий сад

Урок 5. Клик-клик.
Небольшое расширение предыдущего урока. Будем реализовывать непосредственно класс, позволяющий клацать по поверхности террайна мышью. Располагаться он у нас будет сё в том же control.py
Полный текст класса:
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.setIntoC ollideMask(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)
  print 'entry '+str(entry.getSurfacePoint(render))

Как видите, процедура инициализации, практически идентична той, которую мы писали для класса heightChecker, за одним исключением — в конце мы добавляем событие реакции на нажатие мыши и для этого наш класс должен наследоваться от DirectObject.
Процедура, которая будет выполняться по клику — pick.
Снова мы это видели, только в процедуре управления камерой — мы проверяем находится ли мышь в нашем окне и в положительном случае получаем её как объект из которого потом выковыряем её экранные координаты.
А теперь новое для нас

Code
self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())

Этим мы устанавливаем ориентацию луча таким образом, что он начинается от камеры и проходит через точку, лежащую на экранной плоскости. Соответственно, точкой у нас является курсор мыши, а в результате, мы получаем луч, уходящий в бесконечность в нужном нам направлении.
Дальше снова уже знакомый код — запускаем рассчёт столкновений; выводим количество вхождений; в цикле проходим по всем полученным вхождениям и выводим координаты каждого вхождения.
Для проверки в главном файле экспортируем наш класс
Code
from modules.control import mouseControl

и создаём его экземпляр
Code
mc=mouseControl()
Категория: Деццкий сад | Добавил: ninth (03.08.2009)
Просмотров: 6090 | Рейтинг: 5.0/3
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Онлайн всего: 1
Гостей: 1
Пользователей: 0