Skip to content

Commit 70cea50

Browse files
committed
projects/pong: Update to Pyglet 2.0 & incorporate the script as static file
1 parent d1d0e81 commit 70cea50

File tree

3 files changed

+358
-42
lines changed

3 files changed

+358
-42
lines changed

courses/pyladies.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,6 @@ sessions:
122122
materials:
123123
- lesson: intro/pyglet
124124
- lesson: projects/pong
125-
- title: Kód celé hry Pong
126-
type: link
127-
url: http://pyladies.cz/v1/s012-pyglet/pong.py
128125
- title: Tahák na Pyglet
129126
url: https://pyvec.github.io/cheatsheets/pyglet/pyglet-basics-cs.pdf
130127
type: cheatsheet

lessons/projects/pong/index.md

Lines changed: 36 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -112,35 +112,33 @@ ploše.
112112

113113
Většina z tvarů jsou obdélníky, takže nejprve
114114
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ě:
117118

118119
```python
119120
from pyglet import gl
120121
...
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
123124
124125
Nazorny diagram::
125126
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
131137
"""
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()
141140
```
142141

143-
144142
Teď začneme pracovat na funkci `vykresli()`
145143
Nejprve ji vytvoř prázdnou a zaregistruj ji
146144
v Pygletu na událost `on_draw`, jak jsme to
@@ -155,8 +153,7 @@ grafických prvků.
155153
...
156154
def vykresli():
157155
"""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)
160157

161158
window = pyglet.window.Window(width=SIRKA, height=VYSKA)
162159
window.push_handlers(
@@ -173,18 +170,17 @@ vykreslení `míčku` na správné pozici,
173170
kterou získáš z příslušné globální proměnné. Míček je
174171
v našem případě jen malý čtvereček jehož velikost
175172
máme uloženou v konstantě.
173+
Pozor na to, že `pozice_mice` určuje *střed* míčku, ne roh.
176174

177175
{% filter solution %}
178176
```python
179177
def vykresli():
180178
...
181-
# Vykresleni micku
182179
nakresli_obdelnik(
183180
pozice_mice[0] - VELIKOST_MICE // 2,
184181
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)
188184
```
189185
{% endfilter %}
190186

@@ -198,18 +194,21 @@ správně a na správném místě? Princip určení souřadnic
198194
je podobný jako u vykreslení míčku.
199195

200196
{% 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+
201201
```python
202202
def vykresli():
203203
...
204-
# palky - udelame si seznam souradnic palek a pro kazdou dvojici souradnic
204+
# palky - udelame si seznam souradnic palek, a pro kazdou dvojici souradnic
205205
# 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])] :
207207
nakresli_obdelnik(
208208
x - TLOUSTKA_PALKY,
209209
y - DELKA_PALKY // 2,
210-
x + TLOUSTKA_PALKY,
211-
y + DELKA_PALKY // 2,
212-
)
210+
TLOUSTKA_PALKY * 2,
211+
DELKA_PALKY)
213212
```
214213
{% endfilter %}
215214

@@ -220,7 +219,7 @@ Namalujme ji jako sérii obdélníčků táhnoucích se odshora
220219
dolů. Chce to jen vygenerovat seznam souřadnic,
221220
které budou mít dostatečné rozestupy, a na každé
222221
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?
224223

225224
{% filter solution %}
226225
```python
@@ -231,9 +230,8 @@ def vykresli():
231230
nakresli_obdelnik(
232231
SIRKA // 2 - 1,
233232
y,
234-
SIRKA // 2 + 1,
235-
y + DELKA_PULICI_CARKY
236-
)
233+
2,
234+
DELKA_PULICI_CARKY)
237235
```
238236
{% endfilter %}
239237

@@ -244,11 +242,7 @@ objekt `Label` (Nápis). Ten se hodí k vykreslení hodnoty
244242
skóre. Objekt musíme nejdřív vytvořit. To uděláme
245243
kulatými závorkami za jménem objektu, jako bychom
246244
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()`.
252246

253247
```python
254248
def nakresli_text(text, x, y, pozice_x):
@@ -578,3 +572,6 @@ def obnov_stav(dt):
578572
Hurá, prokousali jsme se k zdárnému konci Pongu!
579573
Máš teď plně funkční interaktivní grafickou
580574
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

Comments
 (0)