Клавиатура ва муш
Чаро рӯйдод ва ҳолатро фарқ мекунем
Тирпарронӣ, таваққуф ва интихоби объект дар лаҳзаи муайян рӯй медиҳанд. Ҳаракати қаҳрамон то вақте давом мекунад, ки тугма пахш аст. Агар ин вазифаҳоро яксон коркард кунем, тир дар ҳар кадр такрор мешавад ё ҳаракат аз такрори клавиатура вобаста мегардад.
pyglet вурудро ба коркардкунандаҳои рӯйдоди равзана медиҳад. Рамзи шумо маънои рӯйдодро муайян мекунад: оғоз кардани амал, нигоҳ доштани ҳолати тугма ё интихоби объект барои кашондан. Худи шакли графикӣ ба тугма табдил намеёбад ва гирандаи пахшро интихоб намекунад.
1. Пахш ва раҳо кардан
on_key_press(symbol, modifiers) рамзи тугмаи пахшшуда ва модификаторҳоро мегирад. Барои муқоиса доимиҳои pyglet.window.key, масалан key.SPACE-ро истифода баред, на сатри "SPACE"-ро. Коркардкунандаи on_key_release ҳангоми раҳо кардан ҳамин ду аргументро мегирад.
Ҳолат ба саволи дигар ҷавоб медиҳад: оё тугма ҳоло пахш аст? KeyStateHandler чунин ҷавобҳоро нигоҳ медорад. Дар равзанаи воқеӣ онро бо window.push_handlers(keys) мепайванданд; дар зер рӯйдодҳоро дастӣ медиҳем, то тағйиротро бе клавиатураи воқеӣ бинем.
from pyglet.window import key
keys = key.KeyStateHandler()
print(bool(keys[key.A]))
keys.on_key_press(key.A, 0)
print(bool(keys[key.A]))
keys.on_key_release(key.A, 0)
print(bool(keys[key.A]))
Натиҷа:
False
True
False
Дархости тугмаи мавҷуднабуда қимати дурӯғ медиҳад. Пас аз пахш он рост ва пас аз раҳо кардан боз дурӯғ аст. Барои ҳаракати пайваста ҳолатро дар update(dt) хонед, барои амали якдафъаина рӯйдоди пахшро истифода баред. Агар push_handlers фаромӯш шавад, коркардкунанда рӯйдодҳои равзанаро намегирад.
2. Якчанд модификатор ҳамзамон
Shift, Ctrl ва Alt метавонанд ҳамзамон пахш бошанд. modifiers ниқоби битӣ аст: ададе бо бити алоҳида барои ҳар аломат. Амали | аломатҳоро якҷоя ва & мавҷуд будани аломати лозимро месанҷад. Агар модификаторҳои иловагӣ бошанд, муқоисаи баробарии пурра мувофиқ нест.
from pyglet.window import key
modifiers = key.MOD_SHIFT | key.MOD_CTRL
print(bool(modifiers & key.MOD_SHIFT))
print(bool(modifiers & key.MOD_ALT))
Натиҷа:
True
False
Дар ниқоб Shift ва Ctrl ҳастанд, вале Alt нест. Ифодаи modifiers & key.MOD_SHIFT метавонад адади ғайрисифрӣ диҳад; bool(...) онро ба True ё False табдил медиҳад. &-и битиро бо and-и мантиқӣ омехта накунед: вазифаҳои онҳо гуногунанд.
3. Самт ва суръат
Вектори (dx, dy) самт ва дарозии ҷобаҷогузориро муайян мекунад. Барои алоҳида идора кардани суръат самтро ба дарозии 1 меоранд, яъне нормализатсия мекунанд. math.hypot(dx, dy) дарозии вектор, яъне масофа аз (0, 0) то (dx, dy)-ро ҳисоб мекунад.
import math
dx, dy = 3, 4
length = math.hypot(dx, dy)
print(length)
print(dx / length, dy / length)
print(round(math.hypot(dx / length, dy / length), 2))
Натиҷа:
5.0
0.6 0.8
1.0
Векторҳои (3, 4) ва (0.6, 0.8) ба як самт нигаронда шудаанд, вале дарозии дуюм 1 аст. Барои ҳаракат ҷузъҳои онро ба суръат ва dt зарб мекунанд. Барои (0, 0) самт вуҷуд надорад, бинобар ин тақсим ба дарозиро гузаронед, вагарна ZeroDivisionError мешавад.
Вақте ду воситаи идора як амалро ифода мекунанд, аввал онҳоро мантиқан якҷоя кунед. Ҳамзамон пахш кардани тирча ва ҳарф набояд суръатро дучанд кунад. Самтҳои муқобил метавонанд якдигарро бекор кунанд; ин қоидаи идораро худи барнома интихоб мекунад.
4. Координатаҳо ва тугмаҳои муш
on_mouse_press(x, y, button, modifiers) ҷойи пахш ва як тугмаро медиҳад. on_mouse_drag(x, y, dx, dy, buttons, modifiers) ҳаракатро бо тугмаҳои пахшшуда медиҳад. on_mouse_motion(x, y, dx, dy) барои ҳаракати одӣ аст. Дар ин ҷо x, y мавқеи нав ва dx, dy тағйирот нисбат ба мавқеи пешинаанд.
Дар on_mouse_drag параметри buttons ниқоб аст: чанд тугмаро ҳамзамон нигоҳ доштан мумкин аст. Дар мисол тугмаи чапро санҷида, координатаҳои пешинаи курсорро барқарор мекунем.
from pyglet.window import mouse
buttons = mouse.LEFT | mouse.RIGHT
print(bool(buttons & mouse.LEFT))
x, y, dx, dy = 70, 45, 6, -3
print(x - dx, y - dy)
Натиҷа:
True
64 48
Дар проексияи пешфарз координатаҳои муш ва шаклҳо яксонанд: оғоз дар чапи поён ва dy-и мусбат ба боло аст. Танҳо барои аз муш омадани вуруд y-ро чаппа кардан лозим нест. Барои камераи худ ё саҳнаи табдилёфта табдили координатаҳо лозим мешавад.
5. Санҷиши расидан ва кашондан
Санҷиши расидан муайян мекунад, ки курсор дар дохили объект аст ё не. Барои росткунҷа дохил кардани канорҳои чапу поён ва хориҷ кардани канорҳои росту боло қулай аст. Он гоҳ росткунҷаҳои ҳамсоя барои сарҳади умумӣ рақобат намекунанд.
Ҳангоми кашондан ҷойи гирифтанро нигоҳ доштан фоиданок аст: фосила аз нуқтаи такягоҳи объект то курсор. Нуқтаи нави такягоҳ бояд ҳамин фосиларо нигоҳ дорад. Мисоли навбатӣ аввал сарҳадҳоро месанҷад, сипас як мавқеъро бо фосилаи пешакӣ маълум ҳисоб мекунад.
x, y, width, height = 10, 20, 30, 15
for px, py in ((10, 20), (39, 34), (40, 25)):
print(x <= px < x + width and y <= py < y + height)
offset_x, offset_y = 4, 6
cursor_x, cursor_y = 50, 60
print(cursor_x - offset_x, cursor_y - offset_y)
Натиҷа:
True
True
False
46 54
Нуқтаи (40, 25) дар канори рости хориҷшуда аст. Сатри охир мавқеи кунҷро нишон медиҳад, на курсорро. Худи интихоби объект ва нигоҳдории ҳолати кашондан қисмҳои алоҳидаанд: одатан объекти интихобшударо ҳангоми пахш нигоҳ дошта, ҳангоми раҳо кардан интихобро тоза мекунанд.
Вуруд дар дохили барнома чӣ гуна мегузарад
Низоми равзана рӯйдод месозад, pyglet коркардкунандаҳои сабтшударо даъват мекунад ва онҳо ҳолати барномаро тағйир медиҳанд. push_handlers(obj) методҳои объектро аз рӯйи номи рӯйдодҳо меёбад. Бо ин роҳ коркарди вурудро дар синфи алоҳида ҷамъ кардан мумкин аст, ба ҷойи нигоҳ доштани ҳама чиз дар функсияҳои умумӣ.
Агар объектҳо ҳамдигарро пӯшонанд, барнома бояд тартиби интихобро бо тартиби кашидан мувофиқ кунад. Танҳо мавҷуд будани рӯйхат дар Batch қабат намесозад; барои тартиби графикӣ Group(order=...) ё кашидани ошкорои пайдарпайро истифода бурдан мумкин аст. Қоидаи «объекти болоӣ пахшро мегирад» ба рамзи санҷиши расидани шумо тааллуқ дорад.
Хатоҳои маъмул ва ислоҳи онҳо
symbol == "LEFT"навиштан. Рамзи тугма адад аст ва муқоиса бо сатр кор намекунад.key.LEFT-ро истифода баред.modifiers == key.MOD_SHIFTнавиштан. Бо Shift ва Ctrl ҳамзамон санҷиш дурӯғ мешавад. Бити лозимро боmodifiers & key.MOD_SHIFTсанҷед.- Ҳамеша ба
math.hypot(dx, dy)тақсим кардан. Агар ҳаракат набошад, тақсимкунанда сифр аст. Аввал ғайрисифрӣ будани дарозиро санҷед. - Дар оғози кашондан
shape.x = xнавиштан. Нуқтаи такягоҳ ба назди курсор меҷаҳад. Фосилаи гирифтанро нигоҳ дошта, ҳангоми ҳаракат ба ҳисоб гиред. - Дар
on_mouse_releaseобъекти интихобшударо тоза накардан. Пас аз раҳо кардан ҳам барнома онро интихобшуда мешуморад. Ҳангоми раҳо кардан ҳолати кашонданро анҷом диҳед.
Ёддошти кӯтоҳ
| Вазифа | Восита |
|---|---|
| Амали якдафъаина | on_key_press(symbol, modifiers) |
| Тугмаҳои пахшшуда | key.KeyStateHandler() ва window.push_handlers(keys) |
| Санҷиши модификатор | modifiers & key.MOD_SHIFT |
| Дарозии самт | math.hypot(dx, dy) |
| Пахши муш | on_mouse_press(x, y, button, modifiers) |
| Ҳаракат бо тугмаҳои пахшшуда | on_mouse_drag(x, y, dx, dy, buttons, modifiers) |
| Анҷоми кашондан | on_mouse_release, тоза кардани интихоб |