Creació de jocs amb PyBadge

Programació Gràfics     Recursos CITCEA
Tutorial Exemples Projectes   Inici

Fem que el taulell sigui més gran que la pantalla

Si fem el taulell de manera que ocupi tota la pantalla ens queda un espai de moviment relativament petit. Podem, però, fer que el taulell sigui més gran i que la pantalla ens mostri només una part, centrada en la posició del personatge.

Per fer això, definirem una nova versió del taulell, el doble d'ample i d'alt que l'anterior, que guardarem al fitxer taulell_gros.csv. El contingut d'aquest fitxer és el següent:

0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10

Ara serà important tenir clar el sistema de coordenades. Per explicar com ho fem, ens pot ser útil el gràfic següent:

Coordenades

Les coordenades marcades en rosa, mesurades en rajoles, són les del taulell, que ara mesura 20 ⨯ 16. Imaginem que en un moment donat el personatge està en la posició indicada per la circumferència marró, és a dir a la posició (8, 7), mesurada en rajoles. La finestra de taulell que veurem a la pantalla es correspondrà amb el rectangle blau que anirà de la posició (3, 3) a la posició (12, 10). Aquests punts els calcularem amb les fórmules indicades en blau. Quan determinem la posició de la finestra hem de vigilar de no sortir fora del taulell i, per tant, mirarem que no ens surtin valors inferiors a zero o superiors a la mida del taulell.

Per situar el personatge a lloc ens cal, però, indicar la seva posició en píxels de la pantalla. El punt negre ens indica l'origen des del que comencem a comptar els píxels i les dues fórmules ens mostren com calcularem la posició del personatge a la pantalla.

El programa seria el següent:

import board
import keypad
import displayio
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 l'sprite (personatge)
pers = displayio.TileGrid(imatge, pixel_shader=palette,
                            width = 1, height = 1,
                            tile_width = 16, tile_height = 16,
                            default_tile = 7)
# 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 a l'sprite
grup_pers = displayio.Group(scale=1)
grup_pers.append(pers)
# 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 el personatge
# 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,
)
# Variables de posicio del personatge
cx = 4
cy = 3
# 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 = cx - 5
    xmax = cx + 4
    ymin = cy - 4
    ymax = cy + 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])
    pers.x = 16 * (cx - xmin)
    pers.y = 16 * (cy - ymin)
# 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()
while True:
    boto_act = pad.events.get()
    if boto_act and boto_act.pressed:
        boto = boto_act.key_number
        if boto == K_RIGHT and cx < ample - 2:
            cx += 1
        if boto == K_LEFT and cx > 1:
            cx -= 1
        if boto == K_DOWN and cy < alt - 2:
            cy += 1
        if boto == K_UP and cy > 1:
            cy -= 1
    dib_taulell()

Fixem-nos que abans de definir la funció hem llegit el fitxer i creat algunes variables que ens interessa que siguin globals.

 

 

 

 

 

 

 

 

 

 

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