Skip to content

Commit ec2fb7e

Browse files
authored
Update code for Pyglet 2.0
#28
2 parents d1d0e81 + 81afdc4 commit ec2fb7e

File tree

4 files changed

+374
-72
lines changed

4 files changed

+374
-72
lines changed

Diff for: courses/pyladies.yml

-3
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

Diff for: lessons/projects/asteroids/index.md

+16-30
Original file line numberDiff line numberDiff line change
@@ -157,22 +157,15 @@ První krok bude naprogramovat vesmírnou loď, která půjde ovládat klávesni
157157
def draw():
158158
window.clear()
159159

160-
for x_offset in (-window.width, 0, window.width):
161-
for y_offset in (-window.height, 0, window.height):
162-
# Remember the current state
163-
gl.glPushMatrix()
164-
# Move everything drawn from now on by (x_offset, y_offset, 0)
165-
gl.glTranslatef(x_offset, y_offset, 0)
166-
167-
# Draw
168-
batch.draw()
169-
170-
# Restore remembered state (this cancels the glTranslatef)
171-
gl.glPopMatrix()
160+
for x_offset in (-window.width, window.width, 0):
161+
for y_offset in (-window.height, window.height, 0):
162+
# Set the view matrix to offset draws
163+
matrix = pyglet.math.Mat4.from_translation(x_offset, y_offset, 0)
164+
window.view = matrix
172165
```
173166
Pro přehled, dokumentace k použitým funkcím je tady:
174-
[glPushMatrix, glPopMatrix](https://www.opengl.org/sdk/docs/man2/xhtml/glPushMatrix.xml),
175-
[glTranslatef](https://www.opengl.org/sdk/docs/man2/xhtml/glTranslate.xml).
167+
[window.view](https://pyglet.readthedocs.io/en/latest/programming_guide/migration.html?highlight=matrix#window-projection-and-cameras),
168+
[ Mat4](https://pyglet.readthedocs.io/en/latest/modules/math.html#pyglet.math.Mat4).
176169

177170
Povedlo se? Můžeš létat vesmírem?
178171
Čas to všechno dát do Gitu!
@@ -230,26 +223,19 @@ Naše asteroidy jsou zatím docela neškodné. Pojďme to změnit.
230223
Každý objekt bude potřebovat mít poloměr – atribut `radius`.
231224
* Aby bylo vidět co si hra o objektech „myslí”,
232225
nakresli si nad každým objektem příslušné kolečko.
233-
Nejlepší je to udělat pomocí
234-
[pyglet.gl](http://pyglet.readthedocs.org/en/latest/programming_guide/gl.html)
235-
a trochy matematiky; pro teď si jen opiš funkci
236-
`draw_circle` a pro každý objekt ji zavolej.
237-
Až to bude všechno fungovat, můžeš funkci dát pryč.
226+
Pyglet na to má třídu `Circle` v modulu
227+
[`pyglet.shapes`](https://pyglet.readthedocs.io/en/latest/programming_guide/shapes.html):
238228

239229
```python
240230
def draw_circle(x, y, radius):
241-
iterations = 20
242-
s = math.sin(2*math.pi / iterations)
243-
c = math.cos(2*math.pi / iterations)
244-
245-
dx, dy = radius, 0
246-
247-
gl.glBegin(gl.GL_LINE_STRIP)
248-
for i in range(iterations+1):
249-
gl.glVertex2f(x+dx, y+dy)
250-
dx, dy = (dx*c - dy*s), (dy*c + dx*s)
251-
gl.glEnd()
231+
circle = shapes.Circle(x=x, y=y, radius=radius)
232+
circle.opacity = 120 # (ne)průhlednost, od 0 (průhledné) do 255 (plné)
233+
circle.draw()
252234
```
235+
Pro zrychlení můžeš kolečka přidat do `batch` a vykreslovat společně se
236+
zbytkem vesmíru.
237+
238+
Až to bude všechno fungovat, můžeš kolečka dát pryč.
253239
* Když asteroid narazí do lodi, loď exploduje a zmizí.
254240
Explozi necháme na později, teď je důležité odebrání objektu ze hry.
255241
Dej ho do metody `SpaceObject.delete`,

Diff for: lessons/projects/pong/index.md

+36-39
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)