Processing math: 100%

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još 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.

Час 1 - координате, боје, дужи

Основна структура PyGame програма

Сви PyGame програми имају неколико незаобилазних корака. Програм садржи део кода који отвара прозор у ком се програм извршава (задају се његове димензије и наслов), део кода у којем се исцртава неки садржај на прозору, део кода који анализира и реагује на акције које корисник извршава (мишем или тастатуром) и део кода који на крају програма искључује прозор.

Пошто ће у великом броју почетних примера почетни и завршни делови кода (у којима се отвара прозор, чека да корисник искључи прозор и на крају затвара прозор) бити увек исти, у наредним програмима ћемо се фокусирати само на централни део кода у коме се врши цртање. Ако радиш на Петљи, ти помоћни делови кода ће бити унапред припремљени, биће приказани сивом бојом и ти не треба ни да их анализираш, нити да их мењаш. Ако радиш на свом локалном рачунару (на пример, у окружењу Python IDLE), тада не мораш да крећеш од празног програма, већ нови програм можеш започети тако што са Петље ископираш наредни програм и онда измениш само његов централни („бели”) део (који тренутно садржи само наредбе prozor.fill и pg.draw.line).

 
1
import pygame as pg
2
3
# uključivanje rada biblioteke PyGame
4
pg.init()
5
6
# postavljamo naslov prozora
7
pg.display.set_caption("Pygame")
8
# određujemo dimenzije prozora
9
(sirina, visina) = (400, 400)
10
# prikazujemo prozor tih dimenzija
11
prozor = pg.display.set_mode((sirina, visina))
12
13
# bojimo pozadinu prozora u belo
14
prozor.fill(pg.Color("white"))
15
16
# crtamo crnu duž od tačke (100, 100) do tačke (300, 300) debljine 5
17
pg.draw.line(prozor, pg.Color("black"), (100, 100), (300, 300), 5)
18
19
# osvežavamo sadržaj prozora i tako prikazujemo ono što smo nacrtali
20
pg.display.update()
21
22
# petlja obrade događaja - čekamo dok korisnik ne isključi prozor
23
while pg.event.wait().type != pg.QUIT:
24
    pass
25
26
# isključivanje rada biblioteke PyGame
27
pg.quit()
28

(pygame_osnovni_primer_dogadjaji)

Ако ипак желиш да научиш шта значе наредбе у помоћном („сивом”) делу кода, онда ти саветујемо да прочиташ овај текст.

Координатни систем

Положај свих објеката (тачака, дужи, кругова и слично) на прозору одређује се њиховим координатама у координатом систему прозора, који је сличан, али ипак мало другачији у односу на онај са којим си се срео/срела у математици. Положај тачке је и у овом случају одређен уређеним паром њених координата (координатом x тј. апсцисом и координатом y тј. oрдинатом). Јединица мере је један пиксел. Координатни почетак је овде постављен у горњем левом углу прозора. Координата x и овде расте када се крећемо на десно, али координата y опада када се крећемо на горе, односно повећава се када се крећемо на доле, што је другачије у односу на координатни систем који нам је познат од раније. Нека је дата тачка A(5,3). Ако бисмо подигли (транслирали) ову тачку за 1 на горе и задржали њену x координату, тада би нове координате тачке A биле A(5,2). Ако бисмо тачку A са тренутне позиције померили (транслирали) на доле за 2 нове координате би јој биле A(5,4). Дакле, прва координата тачке одређује колико је тачка удаљена од леве ивице прозора, а друга координата колико је тачка удаљена од горње ивице прозора.

../_images/koordinatni_sistem.png

Наредни програм ће ти олакшати да схватиш координате. Померај миша и прати пажљиво како се координате мењају. Прозор по ком се миш креће је димензије 300 пута 300 пискела. У наслову прозора пише колико је x и колико је y, а изнад миша пише уређен пар координата (у загради су уписане обе координате и то прво координата x, а онда y). Покрени програм дугметом „Прикажи пример”.

2

(nauci_koordinate)

Провери своје знање о координатама кроз наредних неколико питања.

../_images/pygame_quiz_coordinates.png
Повежи боју кружића са координатама његовог центра (димензије прозора су 300 пута 300 пиксела).
зеленацрнацрвенаплава
(50, 280)(230, 20)(150, 170)(30, 40)

Ако је прозор ширине 200 и висине 300 пиксела, које су координате његове централне тачке (резултат напиши у облику уређеног пара)?




Q-4: Означи тачна тврђења.







Aко је ширина прозора s, а висина v, упари темена екрана са њиховим координатама.
доње-деснодоње-левогорње-десногорње-лево
(s, v)(s, 0)(0, 0)(0, v)

У програмском језику Пајтон уређен пар координата тачке можемо представити било двочланом торком (3, 5) било двочланом листом [3, 5]. У наредном примеру две крајње тачке дужи задате су помоћу две двочлане торке ((100, 100) и (300, 300)).

2
 
1
pg.draw.line(prozor, pg.Color("black"), (100, 100), (300, 300), 5)
2

(primer_koordinata)

Координате су нам веома важан појам и са њима ћемо се сусретати буквално у сваком PyGame програму.

Задавање боја

Све облике можеш цртати у различитим бојама. Боју можеш добити на основу имена које се наводи као параметар функције pg.Color. Moжеш користити већ готове боје навођењем одговарајуће ниске: 'black' за црну, 'white' за белу, 'gray' за сиву, 'blue' за плаву, 'green' за зелену, 'orange' за наранџасту, 'yellow' за жуту и слично. Подсетимо се, ниске се наводе било између једноструких, било између двоструких наводника (равноправно се, на пример, могу користити 'blue' и "blue"). На пример, ако позовеш функцију py.draw.line(prozor, pg.Color('blue'), (0, 0), (200, 200), 3) на прозору ће се приказати дуж плаве боје чија су темена тачке са координатама (0,0) и (200,200) дебљине 3 пиксела.

Наведимо имена основних боја које ћемо користити у нашим програмима.

pg.Color("black")

Црна

pg.Color("white")

Бела

pg.Color("red")

Црвена

pg.Color("green")

Зелена

pg.Color("blue")

Плава

pg.Color("cyan")

Reзеда

pg.Color("magenta")

Љубичаста

pg.Color("yellow")

Жута

pg.Color("orange")

Наранџаста

Поиграј се мало са бојама у наредном програму и покушај да обојиш прозор у све ове боје. Прозор се боји коришћењем функције prozor.fill чији је једини параметар боја.

25
 
1
import pygame as pg
2
3
# uključivanje rada biblioteke PyGame
4
pg.init()
5
6
# postavljamo naslov prozora
7
pg.display.set_caption("Боје - називи")
8
# određujemo dimenzije prozora
9
(sirina, visina) = (400, 400)
10
# prikazujemo prozor tih dimenzija
11
prozor = pg.display.set_mode((sirina, visina))
12
13
# bojimo pozadinu prozora
14
prozor.fill(pg.Color("???"))
15
16
# osvežavamo sadržaj prozora i tako prikazujemo ono što smo nacrtali
17
pg.display.update()
18
19
# petlja obrade događaja - čekamo dok korisnik ne isključi prozor
20
while pg.event.wait().type != pg.QUIT:
21
    pass
22
23
# isključivanje rada biblioteke PyGame
24
pg.quit()
25

(colors)

Једна грешка коју можеш направити приликом задавања боје је да уместо да pg.Color напишеш великим словом, напишеш pg.color малим словом. Тада ће ти се приказати грешка AttributeError: '' object has no attribute 'color'. Још једна грешка је да назив боје не наведеш под наводницима (на пример, да наведеш pg.Color(white)). Тада ће ти се приказати порука NameError: name 'white' is not defined on line 8.

Можда ћеш пожелети да поред основних боја које се могу добити на основу њиховог имена, самостално дефинишеш неку своју боју тј. нијансу. То можеш најлакше урадити коришћењем модела боје RGB (енгл. red-green-blue). Светло било које боје се може добити комбиновањем светла црвене (Red), зелене (Green) и плаве (Blue) боје. На пример, комбиновањем црвеног и зеленог светла добија се жуто светло, комбиновањем црвеног и плавог љубичасто, а комбиновањем плавог и зеленог резеда. Комбиновањем светла све три основне боје добија се бело светло док се црно светло добија када се сва три светла искључе. Сиво светло се добија када се измеша подједнака количина, црвеног, зеленог и плавог светла.

../_images/RGB.png

Боју тако можемо описати наводећи три броја (у овом случају то су бројеви од 0 до 255), који редом представљају количину црвене, зелене и плаве компоненте у боји коју дефинишемо. У програмском језику Python боју, дакле, можеш представити и тројком бројева и то у облику трочлане уређене торке (нпр. (123, 80, 56)) или трочлане листе (нпр. [123, 80, 56]). Торку или листу можеш навести директно као аргумент функције који одговара боји, а можеш је упамтити у променљивој и касније користити више пута. На пример, доделом REZEDA = (0, 255, 255) дефинишемо резеда боју (каже се и тиркизна или цијан) наводећи одговарајуће количине црвене, зелене и плаве светлости коју ова боја садржи (пошто је то мешавина плаве и зелене боје у њој нема нимало црвене, а плава и зелена компонента су на максимуму). Након тога, ту боју можемо употребити и у позиву функције (нпр. prozor.fill(REZEDA)). Имена тих променљивих не морају бити написана великим словима, али то је добар обичај.

Резимирајмо сада RGB вредности неких карактеристичних боја.

(255, 0, 0)

црвена

(0, 255, 0)

зелена

(0, 0, 255)

плава

(255, 255, 0)

жута

(0, 255, 255)

резеда

(255, 0, 255)

љубичаста

(255, 255, 255)

бела

(0, 0, 0)

црна

(128, 128, 128)

сива

(255, 128, 0)

наранџаста

(255, 128, 128)

розе

Приметимо да се жута боја добија мешањем црвене и зелене, љубичаста мешањем црвене и плаве, а резеда мешањем зелене и плаве. Нијансе сиве боје су препознатљиве по томе што је у њима количина црвене, зелене и плаве једнака (на основу тога можемо сматрати да су црна и бела екстремно тамна и екстремно светла нијанса сиве).

Поиграј се мало са бојама наведним у RGB облику у наредном програму и покушај да обојиш прозор у све ове боје. Пробај да уносиш и друге комбинације вредности између 0 и 255.

25
 
1
import pygame as pg
2
3
# uključivanje rada biblioteke PyGame
4
pg.init()
5
6
# postavljamo naslov prozora
7
pg.display.set_caption("Боје - RGB")
8
# određujemo dimenzije prozora
9
(sirina, visina) = (400, 400)
10
# prikazujemo prozor tih dimenzija
11
prozor = pg.display.set_mode((sirina, visina))
12
13
# bojimo pozadinu prozora
14
prozor.fill([???, ???, ???])
15
16
# osvežavamo sadržaj prozora i tako prikazujemo ono što smo nacrtali
17
pg.display.update()
18
19
# petlja obrade događaja - čekamo dok korisnik ne isključi prozor
20
while pg.event.wait().type != pg.QUIT:
21
    pass
22
23
# isključivanje rada biblioteke PyGame
24
pg.quit()
25

(colors_rgb)

Утврди своје знање о бојама тако што ћеш одговорити на наредних неколико питања.

Упари боје.
ПлаваЦрнаЗеленаЦрвена
pg.Color("red")pg.Color("blue")pg.Color("green")pg.Color("black")

Упари боје.
ПлаваЦрнаЗеленаЦрвена
(0, 0, 255)(0, 0, 0)(255, 0, 0)(0, 255, 0)

Q-5: Која од наредних боја је нека нијанса сиве?






Q-6: Које боје се мешају да би се добила љубичаста боја?






Q-7: Како би се боја [240, 230, 18] најбоље могла назвати?






Боје се дакле, представљају са три, а координате тачака са два броја. Провери да ли ово разумеш тако што ћеш одговорити на наредно питање.

Упари боје и координате, ако је екран ширине 300 и висине 200 пиксела.
Горње лево теме екранаЦрна бојаЉубичаста бојаДоње десно теме екрана
[0, 0, 0](300, 200)(255, 0, 255)[0, 0]

Цртање дужи

Све функције за цртање у библиотеци Pygame почињу са py.draw. Прво ћемо се позабавити цртањем дужи. Дуж AB се црта позивом функције pg.draw.line. Већ смо видели пример позива pg.draw.line(prozor, pg.Color("black"), (100, 100), (300, 300), 5). Дакле, врши се позив облика pg.draw.line(prozor, boja, teme1, teme2, debljina). Ова функција има пет параметара који се наводе у загради. Први параметар је прозор на коме желимо да нацртамо дуж (он се подешава унутар „сивог” кода и увек ће се звати баш prozor). Други параметар је боја. Наредни параметри су координате почетног темена дужи (на слици је то тачка А) и крајњег темена дужи (тачка B). Последњи параметар је дебљина линије којом се исцртава дуж, задата у пикселима.

../_images/duz.png

Редослед аргумената наведених у позиву функције је важан. Провери да ли тај редослед знаш.

Q-9: Q-8: Поређај у складу са редоследом аргумената функције pg.draw.le:
прозор
боја
дебљина
координате другог темена
координате првог темена

Провежбајмо сада цртање дужи кроз неколико задатака. Ови задаци ће ти помоћи да боље упознаш координатни систем који користимо за позиционирање тачака на прозору.

Слово А

Напиши програм који помоћу три дужи исцртава слово A.

Циљ овог задатка је да утврдимо наше сналажење у координатном систему. За цртање слова A потребно је исцртати три дужи (леву косу линију, десну косу линију и хоризонталну црту). Величина прозора је 200×200 и о овоме би требало водити рачуна приликом одређивања координата тачака које представљају темена дужи. Спајањем одговарајућих тачака, формирају се дужи.

Приметимо да смо у решењу увели променљиву debljina да бисмо дебљину обе линије могли да контролишемо само на једном месту. Ова променљива је постављена (иницијализована) на почетку на 10 (наредбом доделе debljina = 10) и променом вредности ове променљиве мења се дебљина све три дужи које чине наше слово. И у наредним програмима ћемо уводити помоћне променљиве које ће нам помоћи да лакше пишемо и прилагођавамо наше програме.

../_images/slovoA.png

На слици можеш видети координате тачака. Тачка A је 50 пиксела удаљена по оси x, и 150 на ниже по оси y, зато су координате тачке A =(50,150). На исти начин ћеш одредити координате осталих тачака. Упиши их у програм уместо упитника, а затим покрени програм и провери да ли се добија слово А (једну линију смо већ уцртали).

32
 
1
import pygame as pg
2
 
3
# uključivanje rada biblioteke PyGame
4
pg.init()
5
6
# podešavamo naslov prozora
7
pg.display.set_caption("Slovo A")
8
# uključujemo prozor dimenzije 200x200 piksela
9
(sirina, visina) = (200, 200)
10
prozor = pg.display.set_mode((sirina, visina))
11
12
# bojimo pozadinu prozora u sivo
13
prozor.fill(pg.Color("gray"))
14
15
# debljina linije
16
debljina = 10
17
# leva kosa linija
18
pg.draw.line(prozor, pg.Color("white"), (50, 150), (100, 50), debljina)
19
# desna kosa linija
20
pg.draw.line(prozor, pg.Color("white"), ???, ???, debljina)
21
# horizontalna linija po sredini
22
pg.draw.line(prozor, pg.Color("white"), ???, ???, debljina)
23
# prikazujemo nacrtano na prozoru
24
pg.display.update()
25
 
26
# petlja obrade događaja - čekamo dok korisnik ne isključi prozor
27
while pg.event.wait().type != pg.QUIT:
28
    pass
29
 
30
# isključivanje rada biblioteke PyGame
31
pg.quit()
32

(slovoA)

Плус

Напиши програм који исцртава симбол плус у центру прозора димензије 200x200 пиксела. Симбол се састоји од једне хоризонталне и једне вертикалне дужи дужине 100 пиксела и дебљине 10 пиксела.

Централни корак у решењу задатка је да два пута примениш функцију за цртање дужи и њеном применом исцрташ симбол плус. У решењу је већ нацртана вертикална дуж, а твој задатак је да нацрташ хоризонталну дуж дужине 100 пиксела, зато добро промисли где ћеш поставити почетне, односно крајње тачке дужи (овај пут немаш помоћ). Ширина и висина прозора су 200 пиксела. Анализирај позив функције pg.draw.line(prozor, pg.Color("black"), (100, 50), (100, 150), debljina) и мало га прилагоди. Видиш да је на месту аргумента за боју наведен позив функције pg.Color("black") који враћа црну боју. Координате темена вертикалне дужи су (100, 50) и (100, 150). Код хоризонталне дужи y координата треба да буде одређена тако xда се дуж налази на средини екрана, док се x координата простире од четвртине, па до три четвртине ширине екрана.

28
 
1
import pygame as pg
2
 
3
# uključivanje rada biblioteke PyGame
4
pg.init()
5
 
6
# podešavamo naslov prozora
7
pg.display.set_caption("Симбол плус")
8
# uključujemo prozor dimenzije 200x200 piksela
9
(sirina, visina) = (200, 200)
10
prozor = pg.display.set_mode((sirina, visina))
11
# bojimo pozadinu u belo
12
prozor.fill(pg.Color("white"))
13
# debljina linija je 10 piksela
14
debljina = 10
15
# vertikalna crna linija dužine 100 piksela
16
pg.draw.line(prozor, pg.Color("black"), (100, 50), (100, 150), debljina)
17
# horizontalna crna linija dužine 100 piksela
18
pg.draw.line(prozor, pg.Color("black"), (???, ???), (???, ???), debljina)
19
# osvežavamo prikaz sadržaja prozora
20
pg.display.update()   
21
 
22
# petlja obrade događaja - čekamo dok korisnik ne isključi prozor
23
while pg.event.wait().type != pg.QUIT:
24
    pass
25
 
26
# isključivanje rada biblioteke PyGame
27
pg.quit()
28

(plus)

Обојени плус

Прилагоди претходни програм тако да позадина буде жуте боје, хоризонтална линија црвене, а вертикална плаве.

Овај пример је модификована верзија претходног програма. У решењу директно примени неки од начина задавања боја, како би се одређена дуж обојила у жуту, односно црвену боју. Овај пут ти мораш да унесеш све аргументе у позивима функције за цртање дужи.

28
 
1
import pygame as pg
2
 
3
# uključivanje rada biblioteke PyGame
4
pg.init()
5
 
6
# podešavamo naslov prozora
7
pg.display.set_caption("Обојени симбол плус")
8
# uključujemo prozor dimenzije 200x200 piksela
9
(sirina, visina) = (200, 200)
10
prozor = pg.display.set_mode((sirina, visina))
11
# bojimo pozadinu u žuto
12
prozor.fill(???)
13
# debljina linija je 10 piksela
14
debljina = 10
15
# vertikalna plava linija dužine 100 piksela
16
pg.draw.line(???)
17
# horizontalna crvena linija dužine 100 piksela
18
pg.draw.line(???)
19
# osvežavamo prikaz sadržaja prozora
20
pg.display.update()   
21
 
22
# petlja obrade događaja - čekamo dok korisnik ne isključi prozor
23
while pg.event.wait().type != pg.QUIT:
24
    pass
25
 
26
# isključivanje rada biblioteke PyGame
27
pg.quit()
28

(obojeni_plus)

Саобраћајни знак

Саобраћајни знакови у облику троугла са црвеном ивицом представљају знакове опасности. Један такав знак је знак који возаче упозорава да наилазе на укрштање путева исте важности. Доврши програм који исцртава тај саобраћајни знак.

Притисни дугме „Прикажи пример” да би се тај знак приказао. Док помераш миша, у наслову прозора ћеш видети координате тачке изнад које се налази показивач миша. Пошто су линије дебеле, x координате њихових крајњих тачака очитај док се миш налази на средини дебљине линије. Након тога покушај да прошириш наредни програм тако што ћеш додати наредбе за цртање две дужи који се укрштају (два пута позови функцију pg.draw.line са одговарајућим параметрима). Када допишеш потребне наредбе, покрени програм и види да ли твој саобраћајни знак личи на онај који је задат у примеру.

37
 
1
import math
2
import pygame as pg
3
4
# uključivanje rada biblioteke PyGame
5
pg.init()
6
7
# postavljamo naslov prozora
8
pg.display.set_caption("Pygame")
9
# određujemo dimenzije prozora
10
(sirina, visina) = (300, 300)
11
# prikazujemo prozor tih dimenzija
12
prozor = pg.display.set_mode((sirina, visina))
13
14
def jednakostranicni(cx, cy, h, boja):
15
    a = int(h * 2 / math.sqrt(3))
16
    A = (cx - a//2, cy + h//3)
17
    B = (cx + a//2, cy + h//3)
18
    C = (cx, cy - 2*h//3)
19
    pg.draw.polygon(prozor, boja, [A, B, C])
20
21
prozor.fill(pg.Color("white"))
22
(cx, cy) = (sirina // 2, 2 *  visina // 3)
23
jednakostranicni(cx, cy, round(0.8*visina), pg.Color("red"))
24
jednakostranicni(cx, cy, round(0.55*visina), pg.Color("yellow"))
25
    
26
27
28
# osvežavamo sadržaj prozora i tako prikazujemo ono što smo nacrtali
29
pg.display.update()
30
31
# petlja obrade događaja - čekamo dok korisnik ne isključi prozor
32
while pg.event.wait().type != pg.QUIT:
33
    pass
34
35
# isključivanje rada biblioteke PyGame
36
pg.quit()
37

(saobracajni_znak_linije)

Да би цртеж изгледао уредно, потребно је да су крајња темена дужи темена једног квадрата (или бар правоугаоника). Дакле, потребно је да су y координате оба горња тема једнаке, да су y координате оба доња темена једнаке, да су x координате оба лева темена једнаке и да су x координате оба десна темена једнаке. Провери да ли је то заиста тако и ако није, поправи цртеж тако да буде.

Домаћи задатак - антена

Пре кабловске телевизије телевизијски сигнал се примао помоћу антена које су људи углавном постављали на кровове својих кућа и зграда. Напиши програм који црта једну такву антену. Као што се види када покренете пример, цртеж се састоји од седам линија. Усправна линија је дебљине 4 пиксела, горње две водоравне су дебљине 1, средње две дебљине 2, а доње две дебљине 3. Боја позадине је „skyblue”. Пошто је овај задатак мало сложенији и у овом примеру имаш помоћ у облику приказа тренутних координата тачке на којој је показивач миша.

24
 
1
import pygame as pg, random
2
3
pg.init()   # uključujemo rad biblioteke PyGame
4
5
pg.display.set_caption("Пример") 
6
7
# otvaramo prozor
8
(sirina, visina) = (300, 300)
9
prozor = pg.display.set_mode((sirina, visina))
10
11
prozor.fill(???)
12
# uspravna linija
13
pg.draw.line(prozor, ???, (150, ???), (150, ???), 4)
14
# 6 vodoravnih linija
15
???
16
pg.display.update()   # prikazujemo nacrtano na ekranu
17
18
# petlja obrade događaja - čekamo dok korisnik ne isključi prozor
19
while pg.event.wait().type != pg.QUIT:
20
    pass
21
22
# isključivanje rada biblioteke PyGame
23
pg.quit()
24

(PyGame_antenna_simple_assist)