@@ -112,35 +112,33 @@ ploše.
112
112
113
113
Většina z tvarů jsou obdélníky, takže nejprve
114
114
navrhněme funkci ` nakresli_obdelnik ` , která
115
- dostane čtveřici souřadnic a pomocí modulu ` gl `
116
- z Pygletu vykreslí čtverec pomocí 2 trojúhelníků.
115
+ dostane souřadnice a velikost obdélníku a vykreslí ho.
116
+ Na to má pyglet v modulu ` pyglet.shapes ` třídu ` Rectangle ` ,
117
+ která se používá následovně:
117
118
118
119
``` python
119
120
from pyglet import gl
120
121
...
121
- def nakresli_obdelnik (x1 , y1 , x2 , y2 ):
122
- """ Nakresli obdelnik na dane souradnice
122
+ def nakresli_obdelnik (x , y , sirka , vyska ):
123
+ """ Nakresli obdelnik na danych souradnicich
123
124
124
125
Nazorny diagram::
125
126
126
- y2 - +-----+
127
- |/////|
128
- y1 - +-----+
129
- : :
130
- x1 x2
127
+ sirka (velikost v ose X)
128
+ |<------>|
129
+
130
+ +--------+ -
131
+ |KRESLIME| ^
132
+ |*TENHLE*| | vyska (velikost v ose Y)
133
+ |OBDELNIK| v
134
+ y - +--------+ -
135
+ :
136
+ x
131
137
"""
132
- # Tady pouzijeme volani OpenGL, ktere je pro nas zatim asi nejjednodussi
133
- # na pouziti
134
- gl.glBegin(gl.GL_TRIANGLE_FAN ) # zacni kreslit spojene trojuhelniky
135
- gl.glVertex2f(int (x1), int (y1)) # vrchol A
136
- gl.glVertex2f(int (x1), int (y2)) # vrchol B
137
- gl.glVertex2f(int (x2), int (y2)) # vrchol C, nakresli trojuhelnik ABC
138
- gl.glVertex2f(int (x2), int (y1)) # vrchol D, nakresli trojuhelnik BCD
139
- # dalsi souradnice E by nakreslila trojuhelnik CDE, atd.
140
- gl.glEnd() # ukonci kresleni trojuhelniku
138
+ obdelnik = pyglet.shapes.Rectangle(x = x, y = y, width = sirka, height = vyska)
139
+ obdelnik.draw()
141
140
```
142
141
143
-
144
142
Teď začneme pracovat na funkci ` vykresli() `
145
143
Nejprve ji vytvoř prázdnou a zaregistruj ji
146
144
v Pygletu na událost ` on_draw ` , jak jsme to
@@ -155,8 +153,7 @@ grafických prvků.
155
153
...
156
154
def vykresli ():
157
155
""" Vykresli stav hry"""
158
- gl.glClear(gl.GL_COLOR_BUFFER_BIT ) # smaz obsah okna (vybarvi na cerno)
159
- gl.glColor3f(1 , 1 , 1 ) # nastav barvu kresleni na bilou
156
+ window.clear() # smaz obsah okna (vybarvi na cerno)
160
157
161
158
window = pyglet.window.Window(width = SIRKA , height = VYSKA )
162
159
window.push_handlers(
@@ -173,18 +170,17 @@ vykreslení `míčku` na správné pozici,
173
170
kterou získáš z příslušné globální proměnné. Míček je
174
171
v našem případě jen malý čtvereček jehož velikost
175
172
máme uloženou v konstantě.
173
+ Pozor na to, že ` pozice_mice ` určuje * střed* míčku, ne roh.
176
174
177
175
{% filter solution %}
178
176
``` python
179
177
def vykresli ():
180
178
...
181
- # Vykresleni micku
182
179
nakresli_obdelnik(
183
180
pozice_mice[0 ] - VELIKOST_MICE // 2 ,
184
181
pozice_mice[1 ] - VELIKOST_MICE // 2 ,
185
- pozice_mice[0 ] + VELIKOST_MICE // 2 ,
186
- pozice_mice[1 ] + VELIKOST_MICE // 2 ,
187
- )
182
+ VELIKOST_MICE ,
183
+ VELIKOST_MICE )
188
184
```
189
185
{% endfilter %}
190
186
@@ -198,18 +194,21 @@ správně a na správném místě? Princip určení souřadnic
198
194
je podobný jako u vykreslení míčku.
199
195
200
196
{% filter solution %}
197
+ Existuje víc řešení.
198
+ Třeba se vykreslit obdélník dvojnásobnou šířkou, ale na hraně okna takže
199
+ ho bude vidět jen půl:
200
+
201
201
``` python
202
202
def vykresli ():
203
203
...
204
- # palky - udelame si seznam souradnic palek a pro kazdou dvojici souradnic
204
+ # palky - udelame si seznam souradnic palek, a pro kazdou dvojici souradnic
205
205
# v tom seznamu palku vykreslime
206
- for x, y in [(0 , pozice_palek[0 ]), (SIRKA , pozice_palek[1 ])]:
206
+ for x, y in [(0 , pozice_palek[0 ]), (SIRKA , pozice_palek[1 ])] :
207
207
nakresli_obdelnik(
208
208
x - TLOUSTKA_PALKY ,
209
209
y - DELKA_PALKY // 2 ,
210
- x + TLOUSTKA_PALKY ,
211
- y + DELKA_PALKY // 2 ,
212
- )
210
+ TLOUSTKA_PALKY * 2 ,
211
+ DELKA_PALKY )
213
212
```
214
213
{% endfilter %}
215
214
@@ -220,7 +219,7 @@ Namalujme ji jako sérii obdélníčků táhnoucích se odshora
220
219
dolů. Chce to jen vygenerovat seznam souřadnic,
221
220
které budou mít dostatečné rozestupy, a na každé
222
221
z nich vykreslit obdélníček. Kterou funkci z Pythonu
223
- bys použila na získání tohoto seznamu souřadnic?
222
+ bys použil{{a}} na získání tohoto seznamu souřadnic?
224
223
225
224
{% filter solution %}
226
225
``` python
@@ -231,9 +230,8 @@ def vykresli():
231
230
nakresli_obdelnik(
232
231
SIRKA // 2 - 1 ,
233
232
y,
234
- SIRKA // 2 + 1 ,
235
- y + DELKA_PULICI_CARKY
236
- )
233
+ 2 ,
234
+ DELKA_PULICI_CARKY )
237
235
```
238
236
{% endfilter %}
239
237
@@ -244,11 +242,7 @@ objekt `Label` (Nápis). Ten se hodí k vykreslení hodnoty
244
242
skóre. Objekt musíme nejdřív vytvořit. To uděláme
245
243
kulatými závorkami za jménem objektu, jako bychom
246
244
volali funkci, a uložíme si ho do proměnné:
247
- ` napis = Label() ` . Normálně bychom objekt
248
- vytvořili jen jednou a pak měnili jeho hodnotu, ale
249
- pro jednoduchost vytvoříme vždy nový a celé to zabalíme
250
- do funkce. V jejím závěru musíme na nadpisu zavolat
251
- metodu ` draw() ` , jinak se nápis nevykreslí.
245
+ ` napis = Label() ` .
252
246
253
247
``` python
254
248
def nakresli_text (text , x , y , pozice_x ):
@@ -578,3 +572,6 @@ def obnov_stav(dt):
578
572
Hurá, prokousali jsme se k zdárnému konci Pongu!
579
573
Máš teď plně funkční interaktivní grafickou
580
574
hru zakládající se na reálné předloze. :)
575
+
576
+ Můžeš si stáhnout [ celý kód hry] ({{ static('pong.py') }})
577
+ a porovnat ho se svým řešením.
0 commit comments