Prijavi problem


Obeleži sve katergorije koje odgovaraju problemu

Jos detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link
Na žalost nismo trenutno u mogućnosti da obradimo Vaš zahtev.
Molimo Vas da pokušate kasnije.

Programiranje grafike pomoću Pygame, priručnik za sedmi razred

Комбиновање анимације и реаговања на догађаје

Напиши програм у коме се врши анимација лоптице чији се полупречник мења од \(min_r = 20\) до \(max_r = 50\). Лопта се иницијално налази у центру екрана, а може се померити било кликом мишем (центар јој се поставља на место где се кликнуло), било стрелицама тастатуре (сваки тастер помера лоптицу за \(d = 20\) пиксела у одговарајућем смеру. Када лоптица изађе ван прозора, појављује се на његовом супротном крају.

Положај лоптице ћемо чувати кроз променљиве x и y центра лоптице, а полупречник кроз променљиву r.

Најбољи начин да се анимације искомбинују са реаговањем на догађаје миша и тастатуре је да се користи тајмер. Тада чекамо наредни догађај помоћу pg.event.wait када се деси анализирамо његов тип.

Догађај типа pg.QUIT, као и увек до сада завршава програм.

Догађај типа pg.MOUSEDOWN проузрокује само померање центра лоптице и то на место где је кликнуто мишем (које можемо очитати као dogadja.pos). Догађај pg.KEYDOWN проузрокован неком стрелицом проузрокује померање лоптице у одговарајућем смеру. То се лако може остварити додавањем или одузимањем вредности d од одговарајуће координате (гранањем на основу dogadjaj.key можемо одредити да ли је и која стрелица притиснута). Ствар се додатно компликује тиме што желимо да се лоптица врати на супротној страни када испадне на једној страни прозора. То можемо постићи било гранањем (провером да ли смо испали ван прозора и ресетовањем вредности координате ако јесмо), било коришћењем модуларне аритметике (сабирањем и одузимањем по модулу тј. сабирањем и одузимањем уз израчунавање остатка при дељењу). Другу технику смо често користили када смо пролазили кроз елементе листе у круг. Увећање неке координате по модулу димензије екрана се лако реализује. На пример, померање лоптице на десно можемо да остваримо тако што извршимо доделу x = (x + d) % sirina. Наиме, када x + d постане веће од ширине екрана тада се овим фактички одузима ширина екрана и лоптица се поново појављује на левом крају прозора. Умањивање неке координате је слично. На пример, померање лоптице на лево можемо да остваримо тако што извршимо доделу x = (x - d) % sirina. Проблем са овим је то што дељеник може бити негативан. Python коректно израчунава остатак при дељењу и у том случају, међутим, целобројно дељење се за сваки случај лако може избећи тако што се дељеник додатно увећа за делилац и тако што се израчуна x = (x - d + sirina) % sirina.

Догађај типа pg.USEREVENT значи да је тајмер откуцао и да треба променити полупречник. И у овом случају желимо да остваримо промену и то од min_r до max_r и онда опет у круг. Један начин да се то оствари је да се приликом увећања провери да ли смо достигли max_r и ако јесмо, да вредност ресетујемо на min_r. Међутим, и овај пут можемо користити модуларну аритметику. Можемо приметити да се разлика полупречника и min_r креће од нуле па до max_r - min_r и онда у круг. Зато можемо употребити следећу доделу r = (r - min_r + 1) % (max_r - min_r) + min_r.

Имајући претходну дискусију у виду, допуни наредни програм.