Creació de jocs amb PyBadge

Programació Gràfics     Recursos CITCEA
Tutorial Exemples Projectes   Inici

Afegim sons

Anem a afegir un so al programa amb diversos sprites. Per fer aquest exemple emprarem el fitxer de so pew.wav (el podem descarregar picant amb el botó dret sobre l'enllaç). El so s'emetrà cada cop que intentem moure l'sprite fora dels límits.

A continuació tenim el programa, en el qual hem marcat les línies afegides o modificades.

import board
import keypad
import displayio
import digitalio
import audiocore
import audioio
import adafruit_imageload
# Noms dels botons
K_X = 0
K_O = 1
K_START = 2
K_SELECT = 3
K_RIGHT = 4
K_DOWN = 5
K_UP = 6
K_LEFT = 7
# Creem un objecte per a la pantalla
pant = board.DISPLAY
# Carreguem el fitxer amb la imatge
imatge, palette = adafruit_imageload.load("/tiles.bmp",
                                                bitmap=displayio.Bitmap,
                                                palette=displayio.Palette)
# Creem els sprites
sprites = []  # Llista d'sprites
coord_sprites = []  # Llista de coordenades dels sprites
for k in range(0, 5):
    if k == 0:
        spt = 7  # Primer situem el personatge
        cdn = [4, 3]
    if k > 0 and k < 3:
        spt = 3  # Despres dues fruites
        cdn = [3*k, 2*k]
    if k > 2:
        spt = 11  # Finalment dues estrelles
        cdn = [3*k, 2*k]
    spr = displayio.TileGrid(imatge, pixel_shader=palette,
                            width = 1, height = 1,
                            tile_width = 16, tile_height = 16)
    spr[0] = spt
    sprites.append(spr)
    coord_sprites.append(cdn)
# Creem un mosaic per al taulell
taulell = displayio.TileGrid(imatge, pixel_shader=palette,
                            width = 10, height = 8,
                            tile_width = 16, tile_height = 16)
# Definim un grup per als sprites
grup_pers = displayio.Group(scale=1)
for sprt in sprites:
    grup_pers.append(sprt)
# Definim un grup per al taulell
grup_taulell = displayio.Group(scale=1)
grup_taulell.append(taulell)
# Creem un grup per englobar-ho tot
grup = displayio.Group()
# Afegim els grups anteriors al global
grup.append(grup_taulell)  # Primer el taulell
grup.append(grup_pers)  # Despres els sprites
# Objecte per llegir els botons
pad = keypad.ShiftRegisterKeys(
    clock=board.BUTTON_CLOCK,
    data=board.BUTTON_OUT,
    latch=board.BUTTON_LATCH,
    key_count=8,
    value_when_pressed=True,
)
# Llegim el fitxer CSV
fit = open("taulell_gros.csv", "r")
cont_fit = fit.read()
fit.close()
# Descomposem el fitxer en una llista de linies
llista_fit = cont_fit.replace("\r", "").split("\n")
# Variables de control de la finestra
alt = len(llista_fit)
ample = len(llista_fit[0].split(","))
# Funcio que redibuixa el taulell
def dib_taulell():
    xmin = coord_sprites[0][0] - 5
    xmax = coord_sprites[0][0] + 4
    ymin = coord_sprites[0][1] - 4
    ymax = coord_sprites[0][1] + 3
    while xmin < 0:
        xmin += 1
        xmax += 1
    while xmax >= ample:
        xmin -= 1
        xmax -= 1
    while ymin < 0:
        ymin += 1
        ymax += 1
    while ymax >= alt:
        ymin -= 1
        ymax -= 1
    # Bucle que recorre totes les linies
    for vy in range(0, 8):
        # Creem una llista amb els elements de la linia
        linia = llista_fit[vy + ymin].split(",")
        for vx in range(0, 10):
            # Dibuixem el taulell
            taulell[vx, vy] = int(linia[vx + xmin])
    # Situem els sprites
    n = 0
    for sprt in sprites:
        sprt.x = 16 * (coord_sprites[n][0] - xmin)
        sprt.y = 16 * (coord_sprites[n][1] - ymin)
        n += 1
# Fi de la funcio
# Fem que el fons dels personatges sigui transparent
palette.make_transparent(2)
# Mostra el grup a la pantalla
pant.root_group = grup
dib_taulell()
so_rebot = open("pew.wav", 'rb')
wav = audiocore.WaveFile(so_rebot)
sons = audioio.AudioOut(board.SPEAKER)
speaker_enable = digitalio.DigitalInOut(board.SPEAKER_ENABLE)
speaker_enable.switch_to_output(value=True)
while True:
    boto_act = pad.events.get()
    if boto_act and boto_act.pressed:
        boto = boto_act.key_number
        if boto == K_RIGHT:
            if coord_sprites[0][0] < ample - 2:
                coord_sprites[0][0] += 1
            else:
                sons.play(wav)
        if boto == K_LEFT:
            if coord_sprites[0][0] > 1:
                coord_sprites[0][0] -= 1
            else:
                sons.play(wav)
        if boto == K_DOWN: 
            if coord_sprites[0][1] < alt - 2:
                coord_sprites[0][1] += 1
            else:
                sons.play(wav)
        if boto == K_UP:
            if coord_sprites[0][1] > 1:
                coord_sprites[0][1] -= 1
            else:
                sons.play(wav)
    dib_taulell()

En el programa, abans del bucle principal, hem obert el fitxer de so per a lectura; també hem creat un objecte de so. Després li diem que el so no estigui desactivat; aquesta opció és molt interessant si, per exemple, volem que es pugui tenir un mode de joc silenciós.

En el bucle de programa, fem que el so es reprodueixi cada cop que s'intenta moure l'sprite en una direcció en la qual ja s'ha arribat a la vora.

 

 

 

 

 

 

 

 

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.