======================================= Introducció als jocs amb pygame i pgu ======================================= Biblioteques ============ - pygame_: imatges, rellotge, sprites, esdeveniments, fonts, so... - pgu_: etapes, gui, tiles... .. _pygame: http://www.pygame.org/ .. _pgu: http://pygame.org/project-PGU+-+Phil%27s+pyGame+Utilities-108-.html Animació ======== - `Animació `__. - Fotograma: imatge. La classe :py:class:`pygame.Surface`. - Estructura d'una animació: - Inicialitzar els elements de l'animació. - Visualitzar l'estat inicial. - Per cada fotograma: - Calcular el nou estat dels elements després de *1/n* segons on *n* és el nombre de fotogrames per segon. - Visualitzar l'estat dels elements a la pantalla. Sprites ======= - Sprites: elements del joc que canvien de posició o d'aspecte. - El mòdul :py:mod:`pygame.sprite`. - La classe :py:class:`pygame.Surface`. - La classe :py:class:`pygame.Rect`. Exemple ======= - :download:`joc_1.py `, :download:`conf_1.py `, :download:`pilotes_1.py `, :download:`pilota.png `. - La classe `Jugant` i els mètodes `init`, `paint`, `loop` i `update`. - El mòdul `conf`. - Exercicis: #. Canvia el nombre de fotogrames per segon. #. Canvia les mides de la pantalla. #. Afegeix més pilotes. Exercicis ========= - :doc:`/exercicis/Sprites_de_cotxes_per_a_frogger/index` - :doc:`/exercicis/Barra_de_progrés/index` - :doc:`/exercicis/Indicador_circular/index` Videojoc ======== - Videojoc: animació + interacció. - Esdeveniments: tecla premuda, botó deixar anar, moviment del ratolí... - Estructura d'un joc: - Inicialitzar els elements del joc. - Per cada fotograma: - Tractar els esdeveniments produïts en els darrers *1/n* segons. - Calcular el nou estat dels elements després de *1/n* segons. - Visualitzar l'estat dels elements a la pantalla. Exemples ======== - :download:`joc_2.py `. Blocs bàsics d'un programa amb pygame i PGU =========================================== pygame: Sprites --------------- Pygame, a més de tot l'entorn gràfic, sonor, etc. aporta classes per a definir sprites i també grups de sprites. Típicament, un sprite del nostre joc seguirà aquesta estructura: .. code-block:: python class (pygame.sprite.Sprite): def __init__(self, ...): super().__init__() self.image = ... # ha de ser una Surface self.rect = ... # ha de ser un Rect def update(self): # Actualitza l'sprite per al fotograma actual La visualització d'un sprite és automàtica: es pinta la l'atribut `image` a la posició que indica l'atribut `rect` de la finestra gràfica. PGU: Etapes del joc ------------------- PGU (Pygame Utilities) aporta la gestió de les etapes (estats) del joc i realitza el bucle principal del joc. També inclou elements típics d'una interfície gràfica d'usuari (widgets). Típicament, un joc amb PGU tindrà aquesta estructura: .. code-block:: python class Joc(engine.Game): # Només una sola classe # Inicialitza el joc i permet canviar entre les etapes class (engine.State): # Una per cada etapa del joc def init(self): # crea tots els elements del joc: sprites, grups de sprites, ... def event(self, event): # tracta els events rebuts durant un fotograma def loop(self): # actualitza els elements del joc per al fotograma actual def update(sel, screen): # pinta tots els elements del joc a la finestra (screen), # és a dir, visualita un fotograma Pygame: mòduls, classes, mètodes i funcions més usades ====================================================== - Mòdul :py:mod:`pygame`. Defineix les funcions: - :py:func:`pygame.init`: inicialitza Pygame. - :py:func:`pygame.quit`: finalitza Pygame. - Mòdul :py:mod:`pygame.display`: gestiona la pantalla. Defineix les funcions: - :py:func:`pygame.display.set_mode`: inicialitza la pantalla. - :py:func:`pygame.display.flip`: visualitza els darrers canvis a la pantalla. - :py:func:`pygame.display.get_surface`: retorna la imatge (:py:class:`pygame.Surface`) associada a la pantalla. - Mòdul :py:mod:`pygame.event`: gestiona la cua d'esdeveniments. Defineix la funció: - Funció :py:func:`pygame.event.get`: retorna la llista d'esdeveniments produïts des del darrer `get`. - Mòdul :py:mod:`pygame.image`: entrada i sortida d'imatges. Defineix la funció: - Funció :py:func:`pygame.image.load`: retorna la imatge (:py:class:`pygame.Surface`) carregada des d'un fitxer. - Mòdul :py:mod:`pygame.locals`: agrupa constants de diferents mòduls. - Classe :py:class:`pygame.Rect`: rectangle. Defineix el mètode: - :py:meth:`pygame.Rect.move_ip`: canvia el rectangle aplicant-li un desplaçament. I els atributs: | :py:attr:`pygame.Rect.x`, :py:attr:`pygame.Rect.y` | :py:attr:`pygame.Rect.top`, :py:attr:`pygame.Rect.left`, :py:attr:`pygame.Rect.bottom`, :py:attr:`pygame.Rect.right` | :py:attr:`pygame.Rect.topleft`, :py:attr:`pygame.Rect.bottomleft`, :py:attr:`pygame.Rect.topright`, :py:attr:`pygame.Rect.bottomright` | :py:attr:`pygame.Rect.midtop`, :py:attr:`pygame.Rect.midleft`, :py:attr:`pygame.Rect.midbottom`, :py:attr:`pygame.Rect.midright` | :py:attr:`pygame.Rect.center`, :py:attr:`pygame.Rect.centerx`, :py:attr:`pygame.Rect.centery` | :py:attr:`pygame.Rect.size`, :py:attr:`pygame.Rect.width`, :py:attr:`pygame.Rect.height` | :py:attr:`pygame.Rect.w`, :py:attr:`pygame.Rect.h` - Classe :py:class:`pygame.sprite.Group`: conjunt d'sprites. A més de les operacions habituals dels conjunts, defineix els mètodes: - :py:meth:`pygame.sprite.Group.add` - :py:meth:`pygame.sprite.Group.update` - :py:meth:`pygame.sprite.Group.draw` - Classe :py:class:`pygame.sprite.Sprite`: classe pare per als sprites (elements que es mouen o canvien d'aspecte). Defineix el mètode: - :py:meth:`pygame.sprite.Sprite.update`: actualitza l'estat de l'sprite. Es crida un cop per fotograma. I els atributs: - :py:attr:`pygame.sprite.Sprite.image`: imatge (:py:class:`pygame.Surface`) associada a l'sprite. - :py:attr:`pygame.sprite.Sprite.rect`: rectangle (:py:class:`pygame.Rect`) amb la posició de l'sprite dins d'una altra imatge, normalment la pantalla. - Classe :py:class:`pygame.Surface`: imatges, matrius de píxels. Defineix els mètodes: - :py:meth:`pygame.Surface.convert`: converteix la imatge al format més adient per la pantalla. - :py:meth:`pygame.Surface.convert_alpha`: converteix la imatge amb transparència al format més adient per la pantalla. - :py:meth:`pygame.Surface.fill`: omple de color una imatge sencera o un rectangle de la imatge. - :py:meth:`pygame.Surface.blit`: enganxa una imatge al damunt. - :py:meth:`pygame.Surface.get_rect`: retorna el rectangle associat a la imatge. La posició del rectangle és la `(0, 0)` i la mida és l'amplada i l'alçada de la imatge. - Classe :py:class:`pygame.time.Clock`: rellotge. Defineix el mètode: - :py:meth:`pygame.time.Clock.tick`: retorna els milisegons que han passat des de la darrera crida a aquest mateix mètode. L'argument opcional indica el nombre màxim de fotogrames per segon. Alenteix el càlcul dels fotogrames si cal.