Compare commits

...

Аутор SHA1 Порука Датум
  Alain Somville 875784c9c1 invincible en cours пре 3 година
  Lapin-Blanc 68c913cd47 updated readme пре 3 година
  Lapin-Blanc 0c58aa8a9a base readme ok пре 3 година
  Lapin-Blanc 6770d67fb1 base readme OK пре 3 година
  Lapin-Blanc bcead12480 simplification du code пре 3 година
  Lapin-Blanc d7f5c5c575 chapitre 2 - end ok пре 3 година
2 измењених фајлова са 138 додато и 58 уклоњено
  1. +92
    -53
      README.md
  2. +46
    -5
      birdie.py

+ 92
- 53
README.md Прегледај датотеку

@@ -1,107 +1,146 @@
# Partie 2
Maintenant que nous avons un arrière-plan et un oiseau qui vole en montant et en descandant, ajoutons les tuyaux aux travers desquels l'oiseau va devoir passer.
# Partie 3

## Ajouter les tuyaux
Vous avez déjà vu que nous pouvons créer des objets `Actor` et les déplacer sur l'écran. Si vous avez oublié, allez voir où vous utilisez *titi* dans votre code pour voir comment cela fonctionne.
## Retour à la case départ

Nous devons donc ajouter deux tuyaux, et si vous regardez dans le répertoire images, vous verrez que nous avons deux fichiers nommés `top.png` et `bottom.png`. Comment les ajouter au jeu ?
Que se passe-t-il lorsque Titi tombe du bas de l'écran ? En ce moment, vous le perdez probablement pour toujours. Essayons de faire quelque chose de mieux.

> Créons deux nouveaux acteurs en ajoutant à la fin de votre code :
> Ajoutez cette nouvelle fonction après la fonction on_mouse_down :

```python
tube_superieur = Actor('top', (300,0))
tube_inferieur = Actor('bottom', (300,500))
def reset():
print("Retour au départ...")
titi.speed = 1
titi.center = (75, 350)
tube_superieur.center = (300, 0)
tube_inferieur.center = (300, tube_superieur.height + ecart)
```

We mustn’t forget to draw these pipes, so add this to your draw function:
Chaque ligne de cette fonction attribue une valeur. D'abord, elle ramène la vitesse de Titi à ce qu'elle était au départ, puis place son centre à une position **(x,y)**. Elle ramène également les tuyaux à leur point de départ. Si vous essayez le jeu maintenant, vous verrez que rien n'a changé. N'oubliez pas qu'une fonction ne fait rien tant que vous ne l'avez pas appelée. Appelons-la à partir de la fonction de mise à jour si Titi quitte l'écran.

> Ajoutez ceci à la fin de la fonction de mise à jour :

```python
tube_superieur.draw()
tube_inferieur.draw()
if titi.y > HEIGHT :
reset()
```

> Testez le résultat
Attention à bien respecter les *indentations* à l'intérieur de la fonction *update()*.

Bien, nous avons des tuyaux ! Mais ils sont juste là, sur la page, et il n'y a pas d'espace entre eux.
> Vérifiez que tout se réinitialise si Titi tombe du bas de l'écran.
> Il faut aussi réinitialiser le jeu si Titi sort du haut de l'écran.

*Pouvez-vous deviner que que les `(300, 0)` et `(300, 500)` signifient ? Modifiez-les pour vérifier.*
> Modifiez votre code pour que cela fonctionne. Astuce : vous aurez besoin du mot-clé **or**.

> - Effectuez quelques modifications sur les lignes de votre programme et exécutez à nouveau celui-ci, pour vérifier l'effet attendu.
> - N'oubliez pas de quitter la fenêtre de jeu entre chaque tentative.
## Voler correctement !
En ce moment, Titi l'oiseau semble se téléporter vers le haut lorsque vous cliquez sur l'écran. Il faudrait idéalement qu'il se déplace un peu plus doucement. La raison pour laquelle il semble se déplacer instantanément est cette ligne :

## Attention à l'écart
```python
titi.y -= 50
```

Comment faire un trou pour que notre oiseau puisse voler ? Nous devons nous assurer que nous positionnons les tuyaux au bon endroit sur l'écran, et pour ce faire, nous devons connaître la taille de chaque image.
Cela lui fait déplacer un ensemble de 50 pixels d'un seul coup, ce qui n'est pas très fluide ! Lorsqu'un vrai oiseau bat des ailes, cela modifie sa vitesse et non sa position. Le changement de position n'est qu'un effet secondaire de la vitesse.

> Voyons ce que nous pouvons découvrir d'un acteur, en ajoutant ce code à la fin de votre programme :
> Changez votre fonction `on_mouse_down` pour ceci :

```python
print(tube_superieur.width, tube_superieur.height)
def on_mouse_down() :
titi.speed = -6.5
```

> Exécutez le programme et regardez quels nombres apparaissent dans la console.
Essayez et vous verrez que lorsque vous cliquez maintenant, il va juste monter et frapper le haut de l'écran.

Nous avons besoin d'un peu de *gravité* pour le faire redescendre après chaque envolée.

Vous devriez voir apparaître deux chiffres (normalement 100 500), c'est la largeur et la hauteur du tube supérieur en pixels.
> Créez une variable appelée **gravite** à la fin de votre fichier :

Grâce à ces informations, nous pouvons modifier la construction des tuyaux supérieurs et inférieurs en conséquence :
`gravite = 0.3`

Nous utiliserons cette variable pour modifier la vitesse de l'oiseau à chaque image.

> Utilisez cette variable au début de la fonction de mise à jour :

```python
ecart = 140
tube_superieur = Actor('top', (300, 0))
tube_inferieur = Actor('bottom', (300, tube_superieur.height + ecart))
titi.speed += gravite
```

Les deux valeurs séparées par une virgule à la fin de chaque ligne Actor contrôlent la position **x** (de gauche à droite), et **y** (de haut en bas) de l'Actor. Ainsi `(300,0)` place le tuyau à 300 pixels du bord gauche, et 0 pixel en bas du haut de la fenêtre.
> Essayez de changer la valeur de la gravité pour voir l'effet qu'elle a.

Maintenant, cet oiseau est plus réaliste et le contrôler demande maintenant un peu plus d'habileté. Vous pouvez essayer de voler entre les tubes, mais nous n'avons toujours rien fait pour vous empêcher de voler droit dans les tuyaux. Nous allons bientôt corriger cela.

## Rationnalisation du code
Vous avez peut-être remarqué qu'il y a des portions de code que nous avons dû écrire plusieurs fois à des endroits différents. Par exemple, `titi.speed = 1`. Nous l'avons une fois dans le code de configuration du jeu, puis une autre fois dans la fonction reset(), qui est appelée lorsque Titi meurt et que le jeu redémarre. Il serait peut-être judicieux de n'utiliser la fonction reset() qu'au début du jeu également ! On n'aurait alors besoin du code qu'à un seul endroit.

D'où viennent ces calculs ? Eh bien, l'écart est une nouvelle variable que nous créons, et nous disons que la hauteur du tuyau supérieur plus l'écart doit être la valeur **y** du tuyau inférieur. Essayez de changer la valeur de l'écart et voyez ce qui se passe.
Ajoutez un appel à la fonction `reset()` à la toute fin du fichier.
Maintenant, nous pouvons supprimer l'appel `titi.speed = 1` qui se produit dans le code de configuration du jeu.
Essayez de suivre la même logique pour ne spécifier les positions de départ des éléments qu'une seule fois dans votre code.

> Exécutez pour vérifier que nous avons créé un écart
Indice : vous devriez pouvoir supprimer 3 valeurs de position. L'une d'entre elles par exemple : `(75, 350)`.

*Quel est le plus grand écart que vous pouvez faire tout en voyant le tuyau de fond ?*
Vérifiez que tout fonctionne toujours comme avant.

### Une longueur d'avance pour Titi.

## Allons de l'avant
Laissons au joueur un peu plus de temps pour s'envoler avant qu'il ne tombe de l'écran. Nous pouvons déplacer le point de départ à seulement 50 pixels du haut de l'écran. Trouvez cette ligne dans la fonction de réinitialisation :

Pour donner l'impression que l'oiseau vole vers l'avant, et bien que cela paraissent paradoxal, il va falloir faire se déplacer les tubes. C'est une technique classique dans les jeux vidéos : le joueur reste immobile, c'est tout le reste qui se déplace.
`titi.center = (75, 350)`

Faisons donc bouger ces tuyaux. Tout comme nous l'avons fait avec notre oiseau, nous pouvons créer une variable de vitesse pour les tuyaux et l'utiliser pour les faire bouger. Nous voulons que la ligne de code suivante s'exécute une fois lorsque nous lançons le programme, elle doit donc se trouver à la fin de votre code :
Remplacez les 350 par quelque chose de beaucoup plus petit (50 par exemple) Essayez et trouvez une valeur qui vous semble juste.
Si vous avez bien rationnalisé votre code, vous remarquerez qu'il n'est nécessaire de changer cette valeur qu'à un seul endroit du code, ce qui évite les erreurs éventuelles.

## Collisions
Dans PyGameZero, rien ne vous empêche de dessiner plusieurs sprites (images) les uns sur les autres. Donc, si nous voulons avoir un certain comportement lorsque les choses se heurtent, nous devons nous en occuper nous-mêmes. Ajoutez ce code à la fin de la fonction de mise à jour :

```python
vitesse_defilement = 1
if (titi.colliderect(tube_superieur)) :
heurte_tube()
```

Et ils doivent se déplacer continuellement, donc ce code va dans la fonction de mise à jour :
La fonction de collision vérifie si deux objets se touchent. Comme cette fonction se trouve à l'intérieur de la fonction de mise à jour, elle est vérifiée à chaque image. Cela ne fonctionnera à ce stade parce que nous n'avons pas créé la fonction **heurte_tube()**. Créons-la après la fonction de réinitialisation...

```python
tube_superieur.x += vitesse_defilement
tube_inferieur.x += vitesse_defilement
def heurte_tube() :
print ("Paf !")
titi.image = "birddead" # (oiseau mort)
```
Maintenant, Titi devrait devenir un fantôme quand vous frappez le tuyau supérieur, mais il semble qu'il y ait encore trois problèmes :

1. Titi reste un fantôme même lorsque le jeu se réinitialise.
2. Titi peut toujours voler à travers le tuyau du bas !
3. Vous pouvez toujours voler, même en tant que fantôme.

Testez. Tout se passe-t-il comme prévu ? Si ce n'est pas le cas, relisez votre code et essayez de le corriger.
Essayez de résoudre vous-même les problèmes 1 et 2. Nous allons examiner le 3 ci-dessous.

Note : c'est peut-être le bon moment pour essayer de changer la taille de l'espace pour régler la difficulté du jeu. Vous pourriez par exemple le rendre très grand pendant les essais, afin de pouvoir vous concentrer sur les essais et non sur le vol !

Maintenant, nous aimerions empêcher Titi de continuer à voler lorsqu'il est un fantôme. Le code qui le fait voler a besoin d'un moyen de savoir s'il est toujours vivant. Nous pourrions utiliser la variable `titi.image`, car elle change quand il meurt. Mais il est préférable d'ajouter une nouvelle variable pour rendre notre code plus propre et moins susceptible de se casser si nous faisons des changements plus tard.

Ajoutez cette ligne à la fonction de réinitialisation :

```python
titi.vivant = True
```

## Plus de tuyaux
Nous avons besoin de plus de tuyaux, une seule paire ne suffit pas. En fait, nous en avons déjà assez, nous pouvons simplement les faire tourner en boucle lorsqu'ils sortent de l'écran.
Nous créons la nouvelle variable et nous la mettons en place. Maintenant, nous devons nous assurer que Titi ne battra que lorsqu'il sera vivant.

Pour ce faire, nous allons utiliser l'instruction `if` ainsi que les tests conditinnels `<` et `>`.
Ajoutez cette ligne au début de la fonction **on_mouse_down** :

Il y a trois choses délicates avec les énoncés `if` :
```python
if (titi.vivant) :
```
N'oubliez pas d'adapter les indentations de la ligne qui change la vitesse, de sorte qu'elle fasse partie de l'instruction if. Nous ne voulons changer la vitesse (en d'autres termes l'envol) que si l'oiseau est vivant !

- Que testez-vous exactement ? Que se passe-t-il après le "si" ?
- Il ne faut pas oublier les deux points à la fin du test conditionnel.
- Il faut que l'indentation soit correcte - combien d'espaces au début de la ligne ? - pour que le bon code soit exécuté.
La prochaine chose à faire est de changer Titi pour qu'il meurre quand il frappe un tuyau.

## Boucles sur les tuyaux
Mettons-nous au travail dans la fonction de mise à jour, car c'est là que nous déplaçons les tuyaux.
Ajoutez une ligne pour changer la variable "vivant" de Titi en "False" lorsqu'il frappe un tuyau.

> Ajoutez ce code à la fin de la fonction, et assurez-vous que vous l'indentez pour qu'il soit vraiment à l'intérieur de la fonction.
> Efforcez-vous de *réellement* comprendre le sens des lignes de code.
Voilà pour la partie 3. Dans la partie suivante, nous allons examiner quelques touches finales telles que l'ajout d'une animation de battement, la randomisation des positions du tuyau et le comptage des points

### Challenges
- Mettez la physique à l'envers ! Faites en sorte que la gravité tire Titi vers le haut, et que les battements d'ailes le poussent vers le bas
- Ajouter une clé de triche qui rend le joueur invincible.
Indice : essayez d'ajouter cette fonction et voyez ce qui se passe lorsque vous appuyez sur une touche :
```python
si tube_superieur.x < 0 :
tube_superieur.x = WIDTH
def on_key_down(key) :
print(key)
```

Il devrait toutefois subsister certains soucis... À vous de les corriger 😁
- Ajouter un petit battement d'aile moins ample et secret que le joueur peut faire en utilisant le bouton droit de la souris. Conseil : vous devrez ajouter un paramètre à votre fonction **on_mouse_down**, pour qu'elle devienne **on_mouse_down(button)**. Essayez d'utiliser la fonction d'impression comme vous l'avez fait dans le dernier défi pour voir quelles sont les valeurs du bouton.

+ 46
- 5
birdie.py Прегледај датотеку

@@ -4,18 +4,59 @@ TITLE = "Paf l'oiseau"
WIDTH = 400
HEIGHT = 708

def on_mouse_down():
print('Clic souris !')
titi.y -= 50
def on_mouse_down(button):
if (titi.vivant):
print('Clic souris !')
titi.speed = -6.5

def on_key_down(key):
if key == keys.A:
titi.invincible = True
print('vivant !!')
def reset():
print("Retour au départ...")
titi.invincible = False
titi.vivant = True
titi.image = "bird1"
titi.speed = 1
titi.center = (75, 50)
tube_superieur.center = (300, 0)
tube_inferieur.center = (300, tube_superieur.height + ecart)

def heurte_tube():
print("Paf l'oiseau!")
if titi.invincible == False:
titi.image = "birddead"
titi.vivant = False

def update():
titi.speed += gravite
titi.y += titi.speed
tube_superieur.x -= vitesse_defilement
tube_inferieur.x -= vitesse_defilement
if tube_superieur.right < 0 :
tube_superieur.left = WIDTH
tube_inferieur.left = WIDTH
if titi.y > HEIGHT or titi.y < 0:
reset()
if (titi.colliderect(tube_superieur)) or (titi.colliderect(tube_inferieur)):
heurte_tube()
titi.vivant = False

def draw():
screen.blit('background', (0, 0))
titi.draw()
tube_superieur.draw()
tube_inferieur.draw()

titi = Actor('bird1')
ecart = 140
tube_superieur = Actor('top')
tube_inferieur = Actor('bottom')
vitesse_defilement = 1
gravite = 0.3
reset()

titi = Actor('bird1', (75, 350))
titi.speed = 1
# print(tube_superieur.width, tube_superieur.height)

pgzrun.go()

Loading…
Откажи
Сачувај