\documentclass[a4paper,12pt]{article}
\usepackage{myXsim}

\usepackage{listings}

\date{Décembre 2022}
\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
}

\pagestyle{empty}

\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:
