Skip to content

Commit d6d2be2

Browse files
committed
Asteroids: Use radians everywhere, only convert to degrees for Sprite
1 parent 4c974be commit d6d2be2

1 file changed

Lines changed: 24 additions & 10 deletions

File tree

lessons/projects/asteroids/index.md

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,28 +96,43 @@ První krok bude naprogramovat vesmírnou loď, která půjde ovládat klávesni
9696

9797
Rychlost otáčení závisí na stisknutých šipkách (doleva nebo doprava).
9898
V jednom případě je záporná, v druhém kladná. Vhodnou hodnotu zvol
99-
experimentováním. Všechny podobné „magické hodnoty“ je vhodné definovat
99+
experimentováním – začni třeba u 4 radiánů za sekundu.
100+
Všechny podobné „magické hodnoty“ je vhodné definovat
100101
jako konstanty – tedy proměnné, které na začátku nastavíš a nikdy
101102
je neměníš. Bývá zvykem je označovat velkými písmeny a dávat je na
102-
začátek souboru, hned za importy.
103+
začátek souboru, hned za importy:
104+
105+
```python
106+
ROTATION_SPEED = 4 # radians per second
107+
```
103108
* Zrychlení je trochu složitější: k <var>x</var>-ové rychlosti
104-
se přičte sinus úhlu otočení krát uplynulý čas.
105-
U <var>y</var>-ové osy se použije kosinus.
106-
Je ale potřeba převést úhel na radiány, protože
107-
Pyglet (a naše hra) používá stupně:
109+
se přičte kosinus úhlu otočení krát uplynulý čas.
110+
U <var>y</var>-ové osy se použije sinus.
108111

109112
```python
110-
rotation_radians = math.radians(self.rotation)
111-
self.x_speed += dt * ACCELERATION * math.sin(rotation_radians)
112-
self.y_speed += dt * ACCELERATION * math.cos(rotation_radians)
113+
self.x_speed += dt * ACCELERATION * math.cos(self.rotation)
114+
self.y_speed += dt * ACCELERATION * math.sin(self.rotation)
113115
```
114116

115117
Všimni si v příkladu konstanty `ACCELERATION`. Tu opět zvol podle uvážení.
116118
* Když máš hodnoty `self.x`, `self.y` a `self.rotation` spočítané, nezapomeň
117119
je promítnout do `self.sprite`, jinak se nic zajímavého nestane.
120+
121+
Pozor na to, že funkce `math.sin` a `math.cos` používají radiány,
122+
kdežto `pyglet` používá pro `Sprite.rotation` stupně.
123+
(A k tomu je navíc 0° jinde, a otáčí se na opačnou stranu.)
124+
Pro sprite je tedy potřeba úhel převést:
125+
126+
```python
127+
self.sprite.rotation = 90 - math.degrees(self.rotation)
128+
self.sprite.x = self.x
129+
self.sprite.y = self.y
130+
```
118131
* Když raketka vyletí z okýnka ven, vrať
119132
ji zpátky do hry na druhé straně okýnka.
120133
(Zkontroluj si, že to funguje na všech čtyřech stranách.)
134+
135+
121136
* **Bonus 1**: Zkus si přidat několik raketek,
122137
každou trochu jinak natočenou.
123138

@@ -156,7 +171,6 @@ První krok bude naprogramovat vesmírnou loď, která půjde ovládat klávesni
156171
gl.glPopMatrix()
157172
```
158173
Pro přehled, dokumentace k použitým funkcím je tady:
159-
160174
[glPushMatrix, glPopMatrix](https://www.opengl.org/sdk/docs/man2/xhtml/glPushMatrix.xml),
161175
[glTranslatef](https://www.opengl.org/sdk/docs/man2/xhtml/glTranslate.xml).
162176

0 commit comments

Comments
 (0)