Гузариш ба мундариҷа
Мавзӯи 5 аз 6

Аниматсияи ҳамвор

Чаро пешрафтро идора мекунем

Лавҳаи интерфейс аз канор мебарояд, навишта аз шаффофӣ намоён мешавад, доира калон шуда, меистад. Дар ҳама ҳолат хосияти ададии объект тағйир меёбад. Агар оғоз, анҷом ва давомнокиро муайян кунем, як усул барои мавқеъ, андоза ва ранг мувофиқ мешавад.

Вақтро аз қимати хосият ҷудо кардан фоиданок аст. Аввал вақт ба пешрафт аз 0 то 1 табдил меёбад, сипас агар лозим бошад, тарзи ҳаракат тағйир ёфта, баъд координата ё ношаффофӣ ҳисоб мешавад. Бо ин роҳ таъхир, давомнокии пайдоиш ва шакли ҳаракат дар як формула омехта намешаванд.

1. Табдили вақт ба пешрафт

start лаҳзаи оғоз дар миқёси умумии вақт ва duration давомнокии мусбат аст. Ифодаи (t - start) / duration нишон медиҳад, ки кадом ҳиссаи аниматсия гузаштааст. Пеш аз оғоз он манфӣ ва баъд аз анҷом аз як зиёд аст, бинобар ин барои аниматсияи якдафъаина пешрафтро маҳдуд мекунанд.

start, duration = 2, 4
for t in (1, 3, 6, 8):
    p = max(0, min(1, (t - start) / duration))
    print(f"{p:.2f}")

Натиҷа:

0.00
0.25
1.00
1.00

Дар лаҳзаи 3 аз чор сония як сония гузаштааст: пешрафт 0.25 аст. Қиматҳои 0 ва 1 ҳолатҳои аввал ва охирро ифода мекунанд. Натиҷаи тақсимро маҳдуд кунед; худи t метавонад барои объектҳои дигари саҳна афзоиш ёбад.

2. Интерполятсияи хаттӣ

Интерполятсия ҳисоб кардани қимати миёна аз рӯйи қиматҳои канории маълум аст. Интерполятсияи хаттӣ, ё lerp, яксон пеш меравад: a + (b - a) * p. Ҳангоми p=0 қимати a, ҳангоми p=1 қимати b ва ҳангоми p=0.5 миёна ҳосил мешавад.

a, b = 20, 60
for p in (0, 0.25, 0.5, 1):
    print(a + (b - a) * p)

Натиҷа:

20
30.0
40.0
60

Ҳамин формула ҳангоми аз a хурд будани b ҳам кор мекунад: фарқ манфӣ буда, қимат кам мешавад. Ҳар кадр ба координатаи пешина ҷобаҷогузории хурд илова кардан шарт нест. Мавқеъро бевосита аз вақти ҷорӣ ҳисоб кунед, то кадри гузаронидашуда ҷадвали аниматсияро вайрон накунад.

3. Ношаффофӣ ҳам адад аст

Шаклҳо ва матни pyglet opacity доранд: 0 шаффофии пурра ва 255 ношаффофии пурра аст. Аз қимати касрӣ адади бутун дар ҳудуди иҷозатшуда гирифтан лозим аст. int қисми касриро мепартояд, round бошад гирд мекунад; инҳо қоидаҳои гуногунанд.

import pyglet
window = pyglet.window.Window(240, 160, visible=False)
circle = pyglet.shapes.Circle(100, 80, 10)
circle.opacity = int(255 * 0.5)
print(circle.opacity)
window.close()

Натиҷа:

127

Нисфи 255 ба 127.5 баробар аст, вале int қимати 127 медиҳад. Масъала метавонад маҳз ҳамин табдилро талаб кунад, бинобар ин онро бо гирдкунӣ иваз накунед. Мисол як ҳолати доираро таъин мекунад; хосияти аниматсионӣ дар функсияи аз ҷониби соат даъватшаванда нав мешуд.

4. Easing тарзи ҳаракатро тағйир медиҳад

Бо афзоиши яксони пешрафт ҳаракат якбора оғоз ва якбора қатъ мешавад. Функсияи ҳамворӣ, ё easing, пешрафтро ба ҳиссаи нави роҳ табдил медиҳад. Барои оғози оҳиста квадрати пешрафт ва барои анҷоми оҳиста каҷхати квадратии инъикосшуда мувофиқ аст.

Дар ҳар сатри зер пешрафти аслӣ, ҳиссаи роҳ барои суръатгирӣ ва ҳиссаи роҳ барои сустшавӣ чоп мешаванд. Ҳар ду каҷхат оғози 0 ва анҷоми 1-ро нигоҳ медоранд.

for p in (0.0, 0.25, 0.5, 0.75, 1.0):
    ease_in = p ** 2
    ease_out = 1 - (1 - p) ** 2
    print(f"{p:.2f} {ease_in:.4f} {ease_out:.4f}")

Натиҷа:

0.00 0.0000 0.0000
0.25 0.0625 0.4375
0.50 0.2500 0.7500
0.75 0.5625 0.9375
1.00 1.0000 1.0000

Дар чоряки вақт суръатгирӣ танҳо 0.0625 ҳиссаи роҳро гузаштааст, сустшавӣ бошад аллакай 0.4375-ро. Давомнокӣ ва нуқтаҳои канорӣ ҳамон мемонанд, вале тақсимоти суръат тағйир меёбад. Ease-in-out оғози оҳиста ва анҷоми оҳистаро якҷоя карда, ҳар ду қисмро дар миёна мувофиқ мекунад.

5. Кадрҳои калидӣ

Кадри калидӣ ҷуфти маълуми «вақт, қимат» аст. Чанд чунин ҷуфт роҳро бе муайян кардани ҳар кадри экран тасвир мекунад. Аввал калидҳои ҳамсояеро интихоб мекунанд, ки t байни онҳост, сипас пешрафти маҳз ҳамин фосиларо ҳисоб мекунанд.

t0, v0 = 1, 30
t1, v1 = 3, 90
t = 1.5
p = (t - t0) / (t1 - t0)
print(p)
print(v0 + (v1 - v0) * p)

Натиҷа:

0.25
45.0

Дар фосилаи аз 1 то 3 лаҳзаи 1.5 дар чоряки роҳ аст. Пеш аз калиди аввал ва баъд аз охирин одатан қимати канориро нигоҳ медоранд; ин рафторро пешакӣ муайян кунед. Агар ду калид як вақт дошта бошанд, байни онҳо давомнокии мусбат нест. Ин ҷой ҷаҳиши фавриро ифода мекунад; бо тақсимкунандаи сифр интерполятсия кардан мумкин нест.

Барои ранг ҷузъҳоро алоҳида ва барои мавқеъ x ва y-ро алоҳида интерполятсия мекунанд. Ҳамаи хосиятҳо метавонанд як пешрафт дошта бошанд, вале қиматҳои аввалашон гуногун бошанд. Масалан, объект бе чанд таймери мустақил ҳамзамон ҳаракат карда, калон мешавад.

Аниматсия дар дохил чӣ гуна кор мекунад

Дар навсозии навбатӣ соат вақти нав медиҳад. Барнома пешрафтро гирифта, аз easing мегузаронад, хосиятҳоро ҳисоб мекунад ва ба объектҳои pyglet менависад. Баъдтар on_draw саҳнаи навшударо мекашад. Функсияи ҳамворӣ намекашад ва интизор намешавад: он табдили одии математикии адад аст.

Ҳисоби бевосита аз вақт барои оғози дубора ва гузаштан ба лаҳзаи дигар қулай аст. Барои t-и яксон ҳолат новобаста аз шумораи кадрҳо яксон мешавад. Агар ҳар кадр x += (target - x) * 0.1 иҷро кунед, ин раванди дигари вобаста ба шумораи навсозиҳо мешавад, на гузариши дорои давомнокии муайян.

Хатоҳои маъмул ва ислоҳи онҳо

  1. Ҳангоми ғайрисифрӣ будани вақти оғоз p = t / duration навиштан. Аниматсия барвақт оғоз мешавад. Аввал аз вақти умумӣ start-ро тарҳ кунед.
  2. Барои гузариши якдафъаина p-и номаҳдудро истифода бурдан. Хосият аз қимати охир мегузарад. Пешрафтро аз 0 то 1 маҳдуд кунед.
  3. Ба ҷойи a + (b - a) * p ифодаи a + b * p навиштан. Дар p=1 қимати a + b ҳосил мешавад, на b. Фарқро интерполятсия кунед.
  4. Барои ношаффофӣ int(p) * 255 навиштан. То худи анҷом int(p) ба 0 баробар аст ва пайдоиши ҳамвор намешавад. Баъди зарб ба бутун табдил диҳед.
  5. Бе санҷиши яксон будани вақти калидҳо ба t1 - t0 тақсим кардан. ZeroDivisionError шуданаш мумкин. Аввал ҷаҳишро мувофиқи қоидаи аниматсия коркард кунед.

Ёддошти кӯтоҳ

Мафҳум Формула ё қоида
Пешрафт (t - start) / duration, бо duration > 0
Маҳдудкунӣ max(0, min(1, p))
Lerp a + (b - a) * p
Оғози оҳиста p ** 2
Анҷоми оҳиста 1 - (1 - p) ** 2
Ношаффофӣ адади бутун аз 0 то 255
Фосилаи калидӣ вақти маҳаллӣ ва давомнокии худ