Преместване на множество обекти¶
Досега правихме анимации, в които се движеха различни обекти (кола, билярдна топка, самолет, текст), но във всяка от тези програми имаше само един движещ се обект. За глобалните променливи, които описват сцената, използвахме координатите на този движещ се обект, а понякога използвахме и други стойности, като изместване, посока на движение и т.н.
Движението на множество обекти не е съществено различно от движението на един обект - просто ще трябва да проследим стойности, които описват движението за всички обекти. Например, можем да представим всеки обект с набор от стойности, описващи го, и да запазим всички такива комплекти в списък.
Топки¶
В следващия пример ще видим анимирано движение на няколко топки. Всяка топка е представена с \((x, y, dx, dy, r, color)\) комплект, където \(x, y\) са координатите на центъра на топката, \(dx , dy\) са разместванията на топката по координата, \(r\) е радиусът, а \(color\) е цветът на топката. Всички такива комплекти се поставят в списъка топки.
При разопаковане на комплект от елемент от списъка (команда x, y, dx, dy, r, color=balls[i]
), както и при връщането му в списъка (команда balls[i]=(x, y, dx, dy, r, color)
), трябва да имаме предвид реда на променливите.
В примера използваме модула random
, за да създадем топките, за да получим произволни селекции (внесени с помощта на командата import). Функцията random.randint(a,b)
връща произволно цяло число между a и b (включително граници), а функцията random.choice (a)
връща произволен елемент от колекция a.
Ако сравним тази програма с анимацията на движението на билярдна топка, ще забележим голямо сходство. Функцията new_frame е по същество различна само по това, че сега всички действия (преместване, подскачане, рисуване) се извършват в цикъл, тъй като те трябва да се извършват за всяка топка. Задаването на първоначалното състояние също е малко по-сложно, тъй като има повече обекти и ние съхраняваме множество данни за всеки от тях, а също така използваме произволни избори.
В предишния пример всички обекти (топки) присъстват от началото до края на програмата. Има ситуации, когато искаме някои обекти да престанат да съществуват по време на изпълнение на програмата или да се появят някои нови обекти (или и двете). В такива случаи можем да използваме спомагателен списък във функцията new_frame, в който ще поставим стойности, които описват новото състояние. Типична последователност от дейности е следната:
създайте нов празен списък при започване на функцията new_frame
преминаваме през списъка на съществуващите комплекти, променяме ги и добавяме тези, които все още ни трябват, в новия списък
ако е необходимо, допълнете списъка с нови комплекти
накрая, ние актуализираме глобалния списък, като добавяме стойности от новия, спомагателен списък
Нека да разгледаме един пример.
Звезеди¶
В този пример симулираме движението през пространството. Звездите, които срещаме, са представени с бели кръгове и се определят от тяхното положение и радиус.
За всеки кадър изчисляваме нов спомагателен списък, който описва следващото състояние. Преместваме звездите, следвайки някакво правило, и копираме тези, които не са напуснали напълно прозореца, в следващия списък със състояния. След обработката на съществуващите звезди, ние добавяме нови звезди към следващия списък със състояния, така че общият брой звезди да не намалява. Накрая преместваме всички звезди в глобалния списък, за да можем да изчислим следващия кадър по-късно.
Този пример е даден предимно за въвеждане на различен начин на работа със списък на комплекти, които описват сцена. Поради това на заден план бяха оставени някои интересни подробности. Нека разгледаме малко тези, в този контекст, странични детайли. За да постигнете ефект от приближаването, звездите пред нас трябва да се раздалечават и да се увеличават. Следователно в програмата стойностите на x и y се променят, така че звездите да се движат от центъра на прозореца към краищата, като се движат по-бързо, тъй като отиват по-далеч от центъра.
Не е особено важно да разбирате напълно командите, които променят стойностите на x, y и r, за да научите програмирането, но можете да изпробвате как се променя анимацията, когато леко промените коефициентите в тези команди (например звездите могат да се движат по-бавно или да растат по-бързо).
Задачи¶
Снежинки: Завършете програмата така, че да работи, както е показано в примера.
Всяка снежинка е описана само с две числа, нейните координати, така че комплектите, които ще използваме, всъщност ще бъдат двойки \((x, y)\).
Снежинките падат по с 1 пиксел, а тези, които излизат през прозореца, се заменят с нови снежинки. Формирането на ново състояние е подобно на това на програмата “звезди”, само правилата за преместване на снежинки са по-прости.
Снежинките в първоначалния набор са избрани навсякъде в прозореца, а добавените по-късно се избират някъде в горния ръб на прозореца.

Изходящи топки: Копирайте първата програма (топки) тук и я модифицирайте така, че топките да не отскачат, а да продължат да се отдалечават, а тези, които тръгват, се заменят с нови. Тази програма е комбинация от двата дадени примера (топки и звезди), така че опитайте да използвате части от двете програми.
Плъзгащ се текст Изпробвайте програмата и се опитайте да разберете как работи. Опитайте да промените нещо в програмата (текстът, който се показва, цветът, в който се показва текстът, скоростта, с която се движи текстът, или всяка друга подробност).
Предизвикателство: Опитайте се да промените програмата, така че текстът да се плъзга надолу, вместо нагоре.