Главная » Статьи » Учебник: теория

Клавиатура
Panda3D имеет встроенную поддержку клавиатуры. Нажатие клавиши генерирует событие (event — подробно о событиях написано в другой главе). Каждая клавиша может посылать события когда будет нажата, отпущена и на протяжении удержания в нажатом состоянии.
Объявляются события следующим образом:

self.accept( <event name> , <Function> )
self.accept( <event name> , <Function> , <parameters list> )
self.acceptOnce( <event name> , <Function> )
self.acceptOnce( <event name> , <Function> , <parameters list> )

<event name> строковое значение — метка события. <Function> функция питона, которая будет вызвана по событию. <parameters list> список параметров, передаваемых в функцию <Function>.
Построение <event name> базируется на следующих правилах:

1. Клавиши с печатаемыми символами имеют имя соответствующее символу. При этом подразумевается, что символ в нижнем регистре и английской раскладке, т.е. модификаторы Shift и Caps Lock не влияют
Например:
"a", "b", "3", "[", и т.д.
Но не
"A", "B", "#", "{"

2.Нажатие клавиши генерирует событие соответствующее просто имени клавиши.

3. Для обозначения повторяющихся событий используется имя клавиши + "-repeat" например:
"a-repeat", "2-repeat", "[-repeat"

4. Отпускание клавиши соответствует имени + "-up" например:
"a-up", "2-up", "[-up"

5. Все события (в т.ч. "-up") могут включать метку времени
"time-" + <key name>

Пример чтения времени нажатия:

class ReadKeys(DirectObject.DirectObject):
def __init__(self):
self.accept('time-a-repeat', self.printRepeat)

def printRepeat(self,a):
print "repeat a",a

6. Клавиши, не имеющие печатаемых символов обозначаются следующим образом:
"escape", "f"+"1-12" (e.g. "f1","f2",..."f12"), "print_screen" "scroll_lock"
"backspace", "insert", "home", "page_up", "num_lock"
"tab", "delete", "end", "page_down"
"caps_lock", "enter", "arrow_left", "arrow_up", "arrow_down", "arrow_right"
"shift", "lshift", "rshift",
"control", "alt", "lcontrol", "lalt", "space", "ralt", "rcontrol"
Замечание: "print_screen" не доступна в Windows, (и некоторых других ОС) поскольку используется системой. Если вы всё же желаете использовать эту клавишу, то нужно использовать обходные пути. (например, можно использовать "print_screen-up")

7. Некоторые клавиши могут посылать отличающиеся события, например клавиши модификаторов посылают события правой и левой клавиши, но так же посылает нейтральное события. (например, левый shift посылает "lshift" и "shift" событие при нажатии) За исключением "num_lock", "*", и "+" клавиши цифровой клавиатуры дублируют основную. (например, при включенном Num Lock — обе клавиши 1 и на цифровой и на основной клавиатуре посылают событие "1")

8. Клавиши, нажатые в комбинации с модификаторами, обозначаются добавлением этих модификаторов перед символом клавиши с разделением дефисом:
"shift-a" "shift-control-alt-a" "shift-alt-a"
Составные события не отправляют "time-" . Если необходимо, используйте "time-" с одной из клавиш, входящих в сочетание.
Составные события могут отключаться что бы позволить срабатывать регулярным вызовам:

base.mouseWatcherNode.setModifierButtons(ModifierButtons())
base.buttonThrowers[0].node().setModifierButtons(ModifierButtons())

Несколько примеров в виде кода:
self.accept('k', self.__spam )#вызывает __spam() при нажатии k.
self.accept('k-up', self.__spam, [eggs, sausage, bacon,] )#вызывает __spam(eggs,sausage,bacon)
self.accept('escape', sys.exit )#выход по esc
self.accept('arrow_up', self.spamAndEggs )#вызывает spamAndEggs по нажатию стрелки вверх
self.accept('arrow_up-repeat', self.spamAndEggs )#и автоповторяет, если удерживается
self.accept('arrow_up-up', self.spamAndEggs )#вызывается, когда стрелка вверх отпускается

Замечание — когда окно панды минимизируется, либо теряет фокус по иной причине, для всех клавиш вызывается событие "-up".

Категория: Учебник: теория | Добавил: ninth (20.02.2009)
Просмотров: 5936 | Комментарии: 5 | Рейтинг: 0.0/0
Всего комментариев: 5
1 3dmax  
0
Оч полезный мануал, объясняет то что раньше не совсем понимал happy
Спасибо за перевод biggrin

2 ninth  
0
Не за что )

3 Nikolay1987  
0
"Каждая клавиша может посылать события когда будет нажата, отпущена и на протяжении удержания в нажатом состоянии."
Событие удерживаемой клавиши это a-repeat? Есть в панде способ узнать состояние кнопки не через a и a-up?

4 ninth  
0
a-repeat будет повторять событие пока нажата клавиша, однако не стоит использовать этот метод для перемещения или чего-то подобного.
В панде я такого способа не знаю.

5 wfk  
0
думаю не повредит добавить строку вида
Для импорта модуля необходима строка
from direct.showbase import DirectObject

как в статье http://panda3d.org.ru/publ/1-1-0-6?lnNiWb про менеджер задач, для меня как для новенького это облегчит, с другой стороны мне самому пришлось искать гдеэтот DirectObject что тоже в свою очередь полезно xD


Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Онлайн всего: 1
Гостей: 1
Пользователей: 0