Анимация по етапи

Светофар

Един от най-известните примери за устройство, което работи на етапи, е светофар. В примера на светофара ще обясним работата по етапи и как можем да анимираме събития, които се провеждат поетапно на компютър.

Има няколко състояния, в които може да бъде светофар. Например, тя може да показва червена светлина, мигаща жълта светлина, да бъде изключена и т.н. Ще наречем период, през който светофарът не променя състоянието си етап. При нормална работа на светофара, етапите се редуват циклично и всеки етап има собствена продължителност. Например вземете светофар, за който се редуват следните четири етапа: 1 - червена светлина, 2 - червена и жълта светлина, 3 - зелена светлина и 4 - жълта светлина.

За да направим анимацията по-проста, ще изразим продължителността на всеки етап в броя на кадрите (вместо секунди). Нека продължителността на посочените етапи да бъде \(n_1\), \(n_2\), \(n_3\) и \(n_4\) кадрите съответно. Тогава целият цикъл продължава \(N = n_1 + n_2 + n_3 + n_4\) кадри. От тях \(N\) кадри, първият \(n_1\) принадлежат към първия етап, следващият \(n_2\) към втория етап и т.н.

За да знаем към кой етап принадлежи текущият кадър, можем да въведем глобална променлива, която ще брои кадрите. Тъй като целият цикъл трае \(N\) кадри, достатъчно е да се брои по модул \(N\). Това означава, че когато броячът на кадрите достигне стойността \(N-1\), следващата стойност е нула (отчитаме само в рамките на един цикъл). В този случай, за стойности от 0 до \(n_1 - 1\), кадърът принадлежи към първия етап, за стойности от \(n_1\) до \(n_1 + n_2 - 1\) към втория етап , за стойности от \(n_1 + n_2\) до \(n_1 + n_2 + n_3 - 1\) до третия етап, а за стойности от \(n_1 + n_2 + n_3\) до \(N -1\) до четвъртия етап.

Ето как може да изглежда програмата, базирана на тази логика:

Задачи

Етап пети: Копирайте предишната програма, след това поставете етап за мигаща зелена светлина, след зелената светлина и преди жълтата светлина (както е показано в примера - бутон “Play Task”).

Съвет: В петата фаза няма да имаме нито едно обаждане към функцията draw_trafficlights, а по-скоро парче код, което изглежда така:

if i_frame % 2 == 0:
    draw_trafficlights(...)
else:
    draw_trafficlights(...)

Самолет: Напишете програма, която работи, както е показано в примера (бутон „Play Task“).

Описание на движението: равнината започва от центъра на левия ръб на прозореца. Първо се движи за 20 кадъра 2 пиксела надясно и нагоре, след това 20 кадъра 2 пиксела надясно и надолу. Когато излезе през десния ръб на прозореца, той се появява на същата височина в левия ръб. Скоростта на кадрите е 50 кадъра в секунда.

../_images/airplane.png ../_images/sun.png

Къртица Напишете програма, която работи както е показано в примера (бутон „Play Task“).

10 изображения се зареждат с къртица, излизаща от дупката малко повече във всяко изображение. Цикълът има четири етапа с общо 28 кадъра.

  • Етап първи трае 10 кадъра и по време на този етап къртицата излиза от дупката (изображенията са показани в ред, от първи до десети).

  • Етап втори продължава 5 кадъра, през които къртицата е в най-високото положение (показано е десетото изображение).

  • Етап три трае 10 кадъра и по време на този етап къртицата влиза в дупката (изображенията се показват от десето до първо място).

  • Етап четири трае 3 кадъра и по време на него къртицата е в дупката (показано е първото изображение).

../_images/mole1.png ../_images/mole2.png ../_images/mole3.png ../_images/mole4.png ../_images/mole5.png ../_images/mole6.png ../_images/mole7.png ../_images/mole8.png ../_images/mole9.png ../_images/mole10.png