Introduction

Dans ce projet, tu vas utiliser le Raspberry Pi Build HAT, un encodeur et une roue de moteur LEGO® Technic™, ainsi que la bibliothèque Python Turtle pour fabriquer un contrôleur de jeu simple que tu pourras utiliser pour jouer à Pong.

Note

Pong est l'un des premiers jeux vidéo d'arcade, sorti à l'origine en 1972 par Atari. Il s'agit d'un jeu de ping-pong aux graphismes simples en deux dimensions. Les joueurs contrôlent des palettes de chaque côté de l'écran, qu'ils utilisent pour frapper une balle dans un sens ou dans l'autre.

Tu vas:
  • Apprendre à lire les degrés de rotation des moteurs LEGO® Technic™.
  • Apprendre à dessiner et à déplacer des graphiques de tortue à l'aide de moteurs LEGO® Technic™.
  • Apprendre à détecter les collisions entre les graphiques à l'aide des coordonnées x et y.
Pong avec le lego Spike

Tu auras besoin de :

  • Un Raspberry Pi
  • Un Raspberry Pi Build HAT
  • Un moteur LEGO® Technic™

Logiciels

  • Python 3
  • La librairie Build HAT Python


Avant de commencer, tu dois avoir configuré ton ordinateur Raspberry Pi et attaché ton Build Hat:

Le montage du Raspberry Pi de cette façon permet un accès facile aux ports ainsi qu'à l'emplacement de la carte SD. La plaque Maker te permettra de connecter plus facilement le Raspberry Pi à la structure principale de ton tableau de bord.

Tu dois maintenant alimenter ton Raspberry Pi à l'aide de la prise jack 7,5V du Build HAT, ce qui tu permettras d'utiliser les moteurs.


Utilise les codeurs de moteur LEGO® Spike™

Les codeurs de moteur peuvent non seulement tourner, mais aussi détecter avec précision le nombre de degrés de rotation, dont ils ont été tournés.

Les moteurs LEGO® Spike™ sont tous équipés de codeurs. Si tu regardes la partie du disque rotatif du moteur, tu verras une marque en forme de sucette qui peut être alignée avec la marque 0 sur le corps blanc du moteur lui-même. Il s'agit de l'encodeur réglé sur zéro degré et tout mouvement angulaire de l'arbre du moteur peut être détecté et mesuré par rapport à ce point.

Fonctionnement des codeurs de moteur


Connecte un moniteur, un clavier et une souris à ton Raspberry Pi.

Connecte ton Build HAT à ton Raspberry Pi avec le logo imprimé vers le haut, en t'assurant que tu as correctement recouvert toutes les broches.

Enfin, connecte l'alimentation, soit par la prise Build HAT barrel jack, soit par le port USB-C du Raspberry Pi.

Réagir au mouvement du codeur moteur

Pour utiliser les moteurs LEGO® Technic™ comme contrôleur pour un jeu, tu devras être capable de lire constamment leurs positions absolues.

tu devrais voir que ton programme imprime continuellement la position du moteur. Si tu fais pivoter le moteur, ces valeurs devraient changer.

Il y a cependant une meilleure façon de faire cela. Tu n'as besoin de lire la position du moteur que s'il est déplacé.

Crée ton écran Pong

Turtle est une bibliothèque de dessin et d'animation, et tu peux en apprendre davantage à ce sujet avec cet excellent projet.

Tout d'abord, crée une fenêtre où le jeu se déroulera.

La bibliothèque Turtle dispose également d'un moyen utile de définir les coordonnées pour une zone d'écran. Ajoute cette ligne à ton programme :

Cela crée une fenêtre rectangulaire de 400 pixels de large et 340 de haut, avec 0 au centre.

Déplacer la balle

La balle va rebondir autour de l'écran, donc deux variables sont nécessaires pour suivre sa vitesse dans les directions x et y. Ces nombres peuvent être augmentés pour rendre le jeu plus difficile, ou réduits pour le rendre plus facile.

Tu peux vérifier où se trouve une Turtle en utilisant turtle.xcor() et turtle.ycor() pour trouver respectivement les coordonnées x et y.

Donc, pour faire bouger la balle, tu peux combiner la position et la vitesse.

Exécute le programme et vois ce qui se passe !

La balle devrait se déplacer en diagonale vers le coin supérieur droit de la zone de jeu et continuer. Si tu veux que ton jeu soit rapide et difficile, tu peux augmenter les valeurs speed_x et speed_y pour faire bouger la balle plus rapidement.

La balle devrait rebondir sur le mur supérieur plutôt que de disparaître de l'écran. Pour ce faire, la vitesse peut être inversée, faisant voyager la balle dans la direction opposée si sa position y est supérieure à 160.

De la même manière que le code vérifie la position y supérieure de la balle pour la faire rebondir, il peut vérifier la position x droite et la position y inférieure, dans ta boucle de jeu.

La balle devrait maintenant rebondir autour de l'écran et s'envoler par le bord gauche. Ensuite, tu contrôleras ta raquette pour renvoyer la balle depuis le bord gauche.

Contrôler la raquette

Conception des commandes

Le moteur LEGO® Spike™ sera utilisé pour contrôler la position de la raquette, mais tu ne veux pas pouvoir faire des tours complets.

Un moyen simple de limiter le mouvement de la roue consiste à ajouter un élément LEGO® pour empêcher la roue de tourner complètement.

Maintenant, une nouvelle variable est nécessaire pour suivre l'emplacement de la raquette. Elle sera appelée pos_left et définie sur 0.

from turtle import Screen, Turtle
from time import sleep
from buildhat import Motor

motor_left = Motor('A')

game_area = Screen() #Créer un écran
game_area.title("PONG") #Donner un titre à l'écran
game_area.bgcolor('black') #Définir la couleur de fond
game_area.tracer(0) #Donner des animations plus fluides

game_area.setworldcoordinates(-200, -170, 200, 170)

ball = Turtle()
ball.color('white')
ball.shape('circle')
ball.penup()
ball.setpos(0,0)
                                    
paddle_left = Turtle()
paddle_left.color('green')
paddle_left.shape('square')
paddle_left.shapesize(4, 1, 1)
paddle_left.penup()
paddle_left.setpos(-190, 0)

ball.speed_x = 0.4
ball.speed_y = 0.4

pos_left = 0

while True:
    game_area.update()
    
    ball.setx(ball.xcor() + ball.speed_x)
    ball.sety(ball.ycor() + ball.speed_y)

    if ball.ycor() > 160:
        ball.speed_y *= -1

    if ball.xcor() > 195:
        ball.speed_x *= -1

    if ball.ycor() < -160:
        ball.speed_y *= -1

Collisions de la raquette

Le jeu est presque terminé - mais d'abord, tu dois ajouter une détection de collision supplémentaire qui couvre la balle frappant la raquette.

Essaye le programme. tu devrais pouvoir faire rebondir la balle sur ta raquette et jouer à un jeu solo de "squash"!

Maintenant que tu as un moyen d'empêcher la balle de disparaître de l'écran, il est temps de penser à ce qui se passe si tu ne parviens pas à faire une sauvegarde.

Pour l'instant, réinitialisons simplement la balle à son point de départ.

Une fois que tu es satisfait des différents paramètres, il est temps d'ajouter la deuxième raquette.

En utilisant ce que tu as créé pour la raquette de gauche comme point de départ, ajoute une deuxième raquette sur le côté droit de la zone de jeu.

Actuellement, la balle rebondira sur le mur droit. Modifie les lignes de ton programme qui le font pour que la balle soit plutôt réinitialisée au centre.

Tu devrais maintenant pouvoir profiter d'un jeu basique à deux joueurs de Pong.