From 4e7205869b4f48f3a88089cbe273936019e204a6 Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Wed, 8 Nov 2017 16:26:53 +0300 Subject: [PATCH] Pygame et snake pour l'ISN --- ISN/doc_pygame.pdf | Bin 0 -> 62220 bytes ISN/doc_pygame.tex | 141 ++++++++++++++++++++++++++++++++++++++++++++ ISN/draw.py | 2 +- ISN/draw_example.py | 83 ++++++++++++++++++++++++++ ISN/index.rst | 13 ++-- ISN/pygame_base.py | 16 ++++- 6 files changed, 247 insertions(+), 8 deletions(-) create mode 100644 ISN/doc_pygame.pdf create mode 100644 ISN/doc_pygame.tex create mode 100644 ISN/draw_example.py diff --git a/ISN/doc_pygame.pdf b/ISN/doc_pygame.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b161488c7fbb7ac2c244c1fda87a2941ac36cc81 GIT binary patch literal 62220 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ડ<1Lj9_U&2g<; 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 GgZ~efp-ut- literal 0 HcmV?d00001 diff --git a/ISN/doc_pygame.tex b/ISN/doc_pygame.tex new file mode 100644 index 0000000..8ee79b0 --- /dev/null +++ b/ISN/doc_pygame.tex @@ -0,0 +1,141 @@ +\documentclass[a4paper,12pt]{article} +\usepackage{myXsim} + +\usepackage{listings} + +\date{Novembre 2017} +\title{Documentation Pygame} +\tribe{ISN} + +\definecolor{mygreen}{rgb}{0,0.6,0} +\definecolor{mygray}{rgb}{0.5,0.5,0.5} +\definecolor{mymauve}{rgb}{0.58,0,0.82} + +\lstset{ % + backgroundcolor=\color{white}, % choose the background color + basicstyle=\footnotesize, % size of fonts used for the code + breaklines=true, % automatic line breaking only at whitespace + captionpos=b, % sets the caption-position to bottom + commentstyle=\color{mygreen}, % comment style + escapeinside={\%*}{*)}, % if you want to add LaTeX within your code + keywordstyle=\color{blue}, % keyword style + stringstyle=\color{mymauve}, % string literal style +} + +\begin{document} + +\maketitle + +\section{Code minimal} + +\lstinputlisting[language=Python, frame=single]{pygame_base.py} + +\section{Dessiner sur la fenêtre: Draw} + +Dans toute la suite, on supposera que vous avez appelé la fenêtre \texttt{windowSurface}. + +Les couleurs se définissent avec leur code RGB: + +\begin{lstlisting}[language=Python, frame=single] +BLACK = (0, 0, 0) +WHITE = (255, 255, 255) +RED = (255, 0, 0) +GREEN = (0, 255, 0) +BLUE = (0, 0, 255) +\end{lstlisting} + +Tracer de objets géométriques + +\begin{itemize} + \item \textbf{Un segment:} \texttt{(60, 60)} sont les coordonnées du points de départ, \texttt{(120,60)} le point d'arrivé et \texttt{4} est l'épaisseur du trait. + \begin{lstlisting}[language=Python, frame=single] + pygame.draw.line(windowSurface, color, (60, 60), (120, 60), 4) + \end{lstlisting} + \item \textbf{Un cercle:} \texttt{(300, 50)} sont les coordonnées du centre, \texttt{50} le rayon et \texttt{0} l'épaisseur du trait (0 signifie que le cercle est entièrement colorié). + \begin{lstlisting}[language=Python, frame=single] + pygame.draw.circle(windowSurface, color, (300, 50), 20, 0) + \end{lstlisting} + \item \textbf{Une ellipse:} \texttt{300} et \texttt{250} sont les coordonnées du centre, \texttt{40} le rayon horizontal, \texttt{80} le rayon vertical et \texttt{1} l'épaisseur du trait. + \begin{lstlisting}[language=Python, frame=single] + pygame.draw.ellipse(windowSurface, color, (300, 250, 40,80), 1) + \end{lstlisting} + \item \textbf{Un rectangle:} \texttt{20} et \texttt{30} sont les coordonnées du coin en haut à gauche du rectangle, \texttt{40} est la largeur et \texttt{50} est la hauteur. + \begin{lstlisting}[language=Python, frame=single] + pygame.draw.rect(windowSurface, color, (20, 30, 40, 50)) + \end{lstlisting} + \item \textbf{Un polygone:} \texttt{((146, 0), (291, 106), (236, 277), (56, 277), (0, 106))} sont les coordonnées des sommets du polygone. + \begin{lstlisting}[language=Python, frame=single] + pygame.draw.polygon(windowSurface, color, + ((146, 0), (291, 106), (236, 277), (56, 277), (0, 106)) + ) + \end{lstlisting} +\end{itemize} + +Il ne faut pas oublier la ligne suivante après avoir tracé tout ce que vous vouliez, sinon rien ne s'affichera. +\begin{lstlisting}[language=Python, frame=single] +pygame.display.update() +\end{lstlisting} + + +D'autres fonctions de dessins existent. Voici un exemple de tout ce qui peut être fait en dessin avec pygame. + +\lstinputlisting[language=Python, frame=single]{./draw_example.py} + +\paragraph{Ajouter une image:} Pygame permet d'ajouter des images ayant les formats suivant: JPG, PNG, GIF (non-animated), BMP. On supposera dans la suite qu'elles sont rangées dans le même dossier que notre programme. +\begin{lstlisting}[language=Python, frame=single] +#Charger l'image +img = pygame.image.load('image.jpg') +# L'afficher sur la surface +windowSurface.blit(img, (0,0)) +\end{lstlisting} +Les coordonnées \texttt{(0,0)} sont les coordonnées de l'angle en haut à droit de l'image sur la surface. + + +\section{Interaction avec les périphériques: Events} + +L'interaction avec l'utilisateur se fait dans la boucle des évènements. + +\begin{lstlisting}[language=Python, frame=single] + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + elif event.type == pygame.KEYUP: + # choses a faire quand une touche du clavier est relachee + if event.key == pygame.K_UP: + # choses a faire quand c'est la touche fleche du haut + elif event.key == pygame.K_DOWN: + # choses a faire quand c'est la touche fleche du bas + elif event.type == pygame.KEYDOWN: + # choses a faire quand une touche du clavier est pressee + elif event.key == pygame.K_LEFT: + # choses a faire quand c'est la touche fleche de gauche + elif event.key == pygame.K_RIGHT: + # choses a faire quand c'est la touche fleche de droite + elif event.type == pygame.MOUSEBUTTONUP: + # choses a faire quand le bouton de la souris est relache + elif event.type == pygame.MOUSEBUTTONDOWN: + # choses a faire quand le bouton de la souris est pressee +\end{lstlisting} + +De manière générale, le nom des touches de clavier sont faite sur le même modèle: \texttt{K\_\#\#\#} où on remplace les \texttt{\#} par le nom de la touche. +\begin{itemize} + \item Touche flèche du haut: \texttt{K\_UP} + \item Touche E: \texttt{K\_E} + \item Touche entrée: \texttt{K\_ESCAPE} +\end{itemize} + +Quelques méthodes pratiques pour manipuler la souris + +\begin{itemize} + \item \texttt{pygame.mouse.get\_pos()} : connaître la position de la souris sur la fenêtre. + \item \texttt{pygame.mouse.set\_pos((x,y))}: déplacer la souris à un endroit. +\end{itemize} + + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "master" +%%% End: + diff --git a/ISN/draw.py b/ISN/draw.py index ffc2ed3..c3cb67f 100644 --- a/ISN/draw.py +++ b/ISN/draw.py @@ -2,7 +2,7 @@ import pygame, sys pygame.init() -windowSurface = pygame.display.set_mode((500, 400), 0,32) +windowSurface = pygame.display.set_mode((500, 400)) pygame.display.set_caption('Hello world!') BLACK = (0, 0, 0) diff --git a/ISN/draw_example.py b/ISN/draw_example.py new file mode 100644 index 0000000..8fb4f8b --- /dev/null +++ b/ISN/draw_example.py @@ -0,0 +1,83 @@ +# Import a library of functions called 'pygame' +import pygame +from math import pi + +# Initialize the game engine +pygame.init() + +# Define the colors we will use in RGB format +BLACK = ( 0, 0, 0) +WHITE = (255, 255, 255) +BLUE = ( 0, 0, 255) +GREEN = ( 0, 255, 0) +RED = (255, 0, 0) + +# Set the height and width of the screen +size = [400, 300] +screen = pygame.display.set_mode(size) + +pygame.display.set_caption("Example code for the draw module") + +#Loop until the user clicks the close button. +done = False +clock = pygame.time.Clock() + +while not done: + + # This limits the while loop to a max of 10 times per second. + # Leave this out and we will use all CPU we can. + clock.tick(10) + + for event in pygame.event.get(): # User did something + if event.type == pygame.QUIT: # If user clicked close + done=True # Flag that we are done so we exit this loop + + # All drawing code happens after the for loop and but + # inside the main while done==False loop. + + # Clear the screen and set the screen background + screen.fill(WHITE) + + # Draw on the screen a GREEN line from (0,0) to (50.75) + # 5 pixels wide. + pygame.draw.line(screen, GREEN, [0, 0], [50,30], 5) + + # Draw on the screen a GREEN line from (0,0) to (50.75) + # 5 pixels wide. + pygame.draw.lines(screen, BLACK, False, [[0, 80], [50, 90], [200, 80], [220, 30]], 5) + + # Draw on the screen a GREEN line from (0,0) to (50.75) + # 5 pixels wide. + pygame.draw.aaline(screen, GREEN, [0, 50],[50, 80], True) + + # Draw a rectangle outline + pygame.draw.rect(screen, BLACK, [75, 10, 50, 20], 2) + + # Draw a solid rectangle + pygame.draw.rect(screen, BLACK, [150, 10, 50, 20]) + + # Draw an ellipse outline, using a rectangle as the outside boundaries + pygame.draw.ellipse(screen, RED, [225, 10, 50, 20], 2) + + # Draw an solid ellipse, using a rectangle as the outside boundaries + pygame.draw.ellipse(screen, RED, [300, 10, 50, 20]) + + # This draws a triangle using the polygon command + pygame.draw.polygon(screen, BLACK, [[100, 100], [0, 200], [200, 200]], 5) + + # Draw an arc as part of an ellipse. + # Use radians to determine what angle to draw. + pygame.draw.arc(screen, BLACK,[210, 75, 150, 125], 0, pi/2, 2) + pygame.draw.arc(screen, GREEN,[210, 75, 150, 125], pi/2, pi, 2) + pygame.draw.arc(screen, BLUE, [210, 75, 150, 125], pi,3*pi/2, 2) + pygame.draw.arc(screen, RED, [210, 75, 150, 125], 3*pi/2, 2*pi, 2) + + # Draw a circle + pygame.draw.circle(screen, BLUE, [60, 250], 40) + + # Go ahead and update the screen with what we've drawn. + # This MUST happen after all the other drawing commands. + pygame.display.update() + +# Be IDLE friendly +pygame.quit() diff --git a/ISN/index.rst b/ISN/index.rst index f002917..7f5a0a0 100644 --- a/ISN/index.rst +++ b/ISN/index.rst @@ -2,7 +2,7 @@ Quelques cours d'ISN pour la validation ####################################### :date: 2017-10-19 -:modified: 2017-10-22 +:modified: 2017-11-08 :authors: Bertrand Benjamin :category: ISN :tags: Progression @@ -25,14 +25,15 @@ On donne `un code pas commenté <./draw.py>`_. Les élèves doivent par eux mêm Étape 2: Création du jeu Snake ------------------------------ -À partir d'un fichier structure et de la description d'étape, les élèves codent le jeu snake. +À partir d'un `fichier de base pour pygame <./pygame_base.py>`_ et de la `description des étapes <./snake.pdf>`_, les élèves codent le jeu snake. -Librairie OpenCV +Chaque début de séance est consacrée au commentaire de ce qui avait été codé à la séance précédente. + +À la fin de la séquence, une documentation sur les `fonctionnalités de bases de Pygame <./doc_pygame.pdf>`_ est distribuée. + +Librairie Bottle ================ -Librairie Flask -=============== - Initiation à javascript ======================= diff --git a/ISN/pygame_base.py b/ISN/pygame_base.py index bf672fd..acb65d6 100644 --- a/ISN/pygame_base.py +++ b/ISN/pygame_base.py @@ -1,16 +1,30 @@ +# Importation de pygame import pygame pygame.init() +# Initialisation de la fenetre largeur = 600 hauteur = 400 windowSurface = pygame.display.set_mode((largeur, hauteur), 0,32) +# Initialisation des parametres + + +# Boucle de jeu +clock = pygame.time.Clock() running = True while running: - + # Limitation du nombre de tours de boucle par seconde. + clock.tick(10) + # Boucle des evenements for event in pygame.event.get(): if event.type == pygame.QUIT: running = False + # Elements a tracer + + pygame.display.update() + + pygame.quit()