You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: notebooks/tps/boids/.teacher/README-boids-corrige-nb.md
+93-94Lines changed: 93 additions & 94 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -28,7 +28,8 @@ Licence CC BY-NC-ND, Thierry Parmentelat
28
28
````{admonition} nothing to prune
29
29
:class: warning
30
30
31
-
there are no difference - apart from this very cell - between the teacher and the student version, but the notebook is duplicated in .teacher for consistency
31
+
there are no difference - apart from this very cell - between the teacher and the student version,
32
+
but the notebook is duplicated in `.teacher` for consistency
32
33
````
33
34
34
35
+++
@@ -42,7 +43,8 @@ there are no difference - apart from this very cell - between the teacher and th
42
43
## c'est quoi les *boids* ?
43
44
44
45
une simulation ludique où on tente de reproduire le comportement d'animaux en
45
-
groupes - typiquement oiseaux et poissons
46
+
groupes
47
+
typiquement nuée d'oiseaux ou banc de poissons
46
48
47
49
### intérêts
48
50
@@ -87,12 +89,20 @@ les élèves rapides et/ou motivés pourront poursuivre jusqu'à réaliser une s
87
89
88
90
voici d'abord une vidéo très courte pour vous montrer les différentes étapes du TP
l'enjeu principal ici est d'être exposé à ce style de **programmation par spécialisation de classes**
93
-
aussi ce chemin est uniquement **indicatif**, et surtout à destination des élèves qui en ressentiront le besoin
94
-
si vous vous sentez, vous pouvez très bien vous y prendre complètement autrement,
95
-
le contrat est rempli dès que vous avez: **des obstacles** fixes, et **des boids** qui évoluent **spontanément** en **évitant** les autres objets
99
+
l'enjeu principal ici est d'être exposé à la **programmation par spécialisation de classes**
100
+
aussi ce chemin par étapes est uniquement **indicatif**, et surtout à
101
+
destination des élèves qui ressentent le besoin d'être guidés pas à pas
102
+
si vous vous sentez, vous pouvez très bien vous y prendre complètement autrement !
103
+
le contrat est rempli dès que vous avez: **des obstacles** fixes, et **des
104
+
boids** qui évoluent **spontanément** en **évitant** les obstacles et les autres
105
+
boids
96
106
97
107
+++
98
108
@@ -111,44 +121,18 @@ le zip contient
111
121
112
122
### v01: starter code
113
123
114
-
```python
115
-
"""
116
-
display a single object, inert, at (100, 100)
117
-
"""
118
-
119
-
import arcade
120
-
121
-
BACKGROUND= arcade.color.ALMOND
122
-
IMAGE="media/arrow-resized.png"
123
-
124
-
classWindow(arcade.Window):
124
+
* dans le zip vous trouverez le code suivant; n'hésitez pas à le renommer dans un fichier `boids.py`
125
125
126
-
def__init__(self):
127
-
super().__init__(800, 800, "My first boid")
128
-
arcade.set_background_color(BACKGROUND)
129
-
self.boid =None
126
+
::::{admonition} le code de départ
127
+
:class: dropdown
130
128
131
-
defsetup(self):
132
-
boid = arcade.Sprite(IMAGE)
133
-
boid.center_x =100
134
-
boid.center_y =100
135
-
self.boid = boid
129
+
:::{literalinclude} boids-01.py
130
+
:::
131
+
::::
136
132
137
-
defon_draw(self):
138
-
arcade.start_render()
139
-
self.boid.draw()
140
-
141
-
defon_update(self, delta_time):
142
-
self.boid.update()
143
-
144
-
window = Window()
145
-
window.setup()
146
-
arcade.run()
147
-
```
148
-
149
-
* installez la librairie
133
+
* installez la librairie (comment fait-on déjà ?)
150
134
* vérifiez que vous avez le fichier `media/arrow-resized.png` (il est dans le zip)
151
-
*copiez et lancez le code ci-dessus
135
+
* lancez le code ci-dessus
152
136
153
137
vous devez voir un seul boid immobile, dans le coin en bas à gauche
154
138
@@ -171,14 +155,16 @@ comment aurait-on écrit la même chose en `pygame` ?
171
155
dans ce code, on utilise - et ce n'est pas du tout explicite - le fait que
172
156
173
157
* le module `arcade` vient avec une *mainloop* - `arcade.run()`
174
-
qui se charge de faire 'avancer' le jeu - par défaut à plusieurs dizaines de Hz
158
+
qui se charge de faire 'avancer' le jeu - par défaut à plusieurs dizaines de Hz
159
+
(même si avec cette version 01 on ne voit pas grand chose bouger :)
175
160
176
161
* cette mainloop va appeler les méthodes `on_draw()` et `on_update()`
177
162
sur chaque instance de `Window` - c'est là que nous pouvons programmer
178
163
la logique de notre "*jeu*"
179
164
180
165
* la classe `Sprite` permet d'ajouter des objets qui savent s'afficher
181
-
ici on a juste créé l'objet à partir d'un png, puis fixé `boid.center_x` et `boid.center_y`
166
+
ici on a juste créé l'objet à partir d'une image `.png`, puis fixé
167
+
`boid.center_x` et `boid.center_y`
182
168
183
169
pour les forts: dans le même registre, mais plus subtil:
184
170
@@ -202,11 +188,12 @@ mais je vous invite à utiliser plutôt la classe `SpriteList` que fournit `arca
202
188
203
189
en plus de ça, je vous recommande de:
204
190
205
-
* prévoir le cas du debug, par exemple avec une variable globale DEBUG
191
+
* prévoir le cas du debug, par exemple avec une variable globale `DEBUG`
206
192
* et dans ce cas afficher un message à chaque fois que le boid est mis à jour
207
193
(surtout pour mettre en évidence la *mainloop* à ce stade)
208
194
209
-
* et aussi de [regarder la méthode `set_update_rate()`](https://api.arcade.academy/en/latest/api/window.html?highlight=set_update_rate#arcade.Window.set_update_rate)
ceci est beaucoup plus facile à utiliser si le boid continue de tourner pendant **tout le temps où la touche est enfoncée** - plutôt que de devoir appuyer plein de fois sur la touche
278
+
soyez sympa avec vos utilisateurs: ceci est beaucoup plus facile à utiliser si
279
+
le boid continue de tourner pendant **tout le temps où la touche est enfoncée** - plutôt que
280
+
de devoir appuyer plein de fois sur la touche…
291
281
292
282
+++
293
283
@@ -299,14 +289,15 @@ vous trouverez une image `media/obstacle-resized.png` pour le matérialiser
299
289
**2 options**
300
290
301
291
* on pourrait facilement s'en sortir avec juste la classe `Sprite`
302
-
* mais je vous demande, pour vous exercer à la spécialisation de classes, de créer une classe `Obstacle`
292
+
* mais je vous demande, pour vous exercer à la spécialisation de classes, de
293
+
créer une classe `Obstacle`
303
294
304
295
+++
305
296
306
297
### v08: créez une grille d'obstacles
307
298
308
299
remplacez l'unique obstacle par une grille d'obstacles
309
-
mettez en 10 x 10, ils sont donc espacés de 80px
300
+
par exemple: mettez en 10 x 10, ils sont donc espacés de 80px
310
301
311
302
+++
312
303
@@ -321,7 +312,7 @@ pour ma part j'ai rendu le boid semi-transparent, en jouant sur l'attribut `alph
321
312
322
313
#### discussion
323
314
324
-
ici on a le choix d'utiliser
315
+
ici on a le choix d'utiliser
325
316
326
317
* soit une variable globale (la liste de tous les obstacles)
327
318
* ou de rajouter dans la classe `Boid` une liste d'obstacles
@@ -366,7 +357,7 @@ on fait la somme de tous ces vecteurs, et on l'ajoute au déplacement de b
366
357
i.e. dans l'exemple de la figure, lorsqu'on traite le boid en b:
367
358
368
359
* on ignore les boids aux endroits en rouge
369
-
* et on fait la somme des 3 vecteurs (en vert)
360
+
* et pour les 3 boids proches (en vert) on fait la somme des 3 vecteurs de "repoussement" (en vert aussi)
370
361
* qu'on ajoute naturellement au déplacement dû à la vitesse du boid
371
362
372
363
#### à noter
@@ -375,39 +366,44 @@ dans cette version, en cas de collision, on se contente de modifier la position
375
366
376
367
+++
377
368
378
-
### v11: on essaie d'orienter correctement
369
+
### v11: orienter correctement
370
+
371
+
* dans cette version, on va essayer de répercuter les collisions sur l'orientation du boid
372
+
* et pour ça on va mettre à jour brutalement l'attribut `angle`
373
+
* à ce stade, on se base uniquement sur le mouvement qui est fait à l'instant t:
374
+
* pour être explicite, si on passe de *(x1, y1)* à *(x2, y2)*, on oriente
375
+
le boid pour s'aligner sur le vecteur *(x2-x1, y2-y1)*
376
+
377
+
l'effet n'est pas forcément très réussi, vous devez voir l'orientation sauter brutalement d'un angle à un autre
379
378
380
-
dans cette version, on va essayer de répercuter les collisions sur l'orientation du boid
381
-
et pour ça on va mettre à jour brutalement l'attribut `angle` uniquement sur le mouvement qui est fait à l'instant t
382
-
i.e, pour être clair, que si on passe de (x1, y1) à (x2, y2), on oriente le boid pour s'aligner sur le vecteur (x2-x1, y2-y1)
383
-
l'effet n'est pas forcément très réussi, vous devez voir l'orientation sauter brutalement d'un angle un autre
379
+
#### à savoir**
384
380
385
-
**à savoir**
386
381
voyez la fonction `math.atan2` qui est pratique ici
387
382
388
383
+++
389
384
390
-
### v12: on lisse les changements d'orientation
385
+
### v12: tourner plus doucement
391
386
392
-
comment pourrait-on obtenir quelque chose d'un peu plus élégant, en ce qui concerne les changements de direction ?
387
+
pour lisser les changements d'orientation: comment pourrait-on obtenir quelque
388
+
chose d'un peu plus élégant, en ce qui concerne les changements de direction ?
393
389
394
390
+++
395
391
396
392
### v13: les touches `↑` et `↓`
397
393
398
-
faire en sorte qu'on puisse contrôler aussi la vitesse avec les touches
394
+
faire en sorte qu'on puisse contrôler aussi la vitesse avec les touches `↑` et `↓`
399
395
essayez le comportement de l'évitement d'obstacles à plusieurs vitesses
400
396
401
397
+++
402
398
403
399
### v14: plusieurs boids
404
400
405
401
remplacez l'unique boid par un ensemble de 20 boids
406
-
sans changer la séparation, qui est calculée seulement à partir des obstacles
402
+
sans changer, pour l'instant, la séparation, qui est calculée seulement à partir des obstacles
407
403
408
404
+++
409
405
410
-
### v15: éviter les obstacles **et** les autres boids
406
+
### v15: éviter aussi les autres boids
411
407
412
408
assurez-vous que la séparation permet d'éviter tous les objets (obstacles et boids)
413
409
@@ -437,13 +433,16 @@ vous pouvez ensuite améliorer dans les directions suivantes :
437
433
438
434
## pour aller plus loin
439
435
440
-
* pour plus de détails sur les boids,
436
+
* pour plus de détails sur les boids,
441
437
voir [la page de Craig Reynolds](http://www.red3d.com/cwr/boids/),
442
-
l'auteur original, et [la page wikipedia](https://en.wikipedia.org/wiki/Boids)
443
-
444
-
* je vous signale un tutoriel intéressant sur la librairie arcade:
0 commit comments