Creació de jocs amb PyBadge

Programació Dades pràctiques     Recursos CITCEA
Tutorial Exemples Projectes   Inici

Múltiples sprites en moviment

Hem vist com crear un programa amb un únic sprite, però en aquest teníem al bucle principal les instruccions que en controlaven el moviment i el canvi d'aspecte. Si, amb el mateix mètode, volguéssim tenir dos sprites caldria repetir els conjunts d'instruccions; però, imaginem que volem tenir vint sprites. Està clar que aquesta metodologia no és pràctica si n'hi ha més d'un o dos.

La forma més eficient serà crear un objecte per als nostres sprites i fer-ne tantes instàncies com siguin necessàries. En aquest objecte definirem els mètodes que permeten fer les funcions necessàries sobre l'sprite, en el nostre cas la inicialització i el comportament (moviment i canvi d'aspecte). Així, les accions del programa principal seran només crides a aquests mètodes.

També farem servir vectors; que ens permetran treballar sobre diversos sprites emprant bucles, en lloc de repetir les instruccions.

Comencem, doncs, per la definició de l'objecte i els seus mètodes:

class Bloc(stage.Sprite):
    def __init__(self, x, y):
        super().__init__(banc, 1, x, y)
        self.incx = 2
        self.incy = 2
    def update(self):
        super().update()
        self.set_frame(self.frame % 4 + 1)
        self.move(self.x + self.incx, self.y + self.incy)
        if not 0 < self.x < 144:  # 160 - 16 = 144
            self.incx = -self.incx
        if not 0 < self.y < 112:  # 128 - 16 = 112
            self.incy = -self.incy

Els objectes ja tenen, per definició, un mètode d'inicialització i un altre d'actualització; per aquest motiu hem creat els nostres dos mètodes amb els mateixos noms, __init__ i update. A cada un d'ells, però, cridem als mètodes originals per assegurar-nos que les tasques es fan correctament i no se'ns passa res per alt; un cop executat el mètode original, hi afegim les accions que ens interessen. Les següents línies marcades en color són les que criden als mètodes originals:

    def __init__(self, x, y):
        super().__init__(banc, 1, x, y)
        ...

    def update(self):
        super().update()
        ...

A banda del comentat, en la inicialització només definim quin és l'increment de cada una de les dues coordenades.

    def __init__(self, x, y):
        super().__init__(banc, 1, x, y)
        self.incx = 2
        self.incy = 2

En el mètode d'actualització hi posem aquelles accions sobre l'sprite que en el programa amb un únic sprite fèiem al bucle principal.

    def update(self):
        super().update()
        self.set_frame(self.frame % 4 + 1)
        self.move(self.x + self.incx, self.y + self.incy)
        if not 0 < self.x < 144:  # 160 - 16 = 144
            self.incx = -self.incx
        if not 0 < self.y < 112:  # 128 - 16 = 112
            self.incy = -self.incy

Un cop definit l'objecte, anem a veure com serà el programa complet. Després comentarem la resta de línies.

import ugame
import stage
class Bloc(stage.Sprite):
    def __init__(self, x, y):
        super().__init__(banc, 1, x, y)
        self.incx = 2
        self.incy = 2
    def update(self):
        super().update()
        self.set_frame(self.frame % 4 + 1)
        self.move(self.x + self.incx, self.y + self.incy)
        if not 0 < self.x < 144:  # 160 - 16 = 144
            self.incx = -self.incx
        if not 0 < self.y < 112:  # 128 - 16 = 112
            self.incy = -self.incy
banc = stage.Bank.from_bmp16("bloc.bmp")
fons = stage.Grid(banc, 10, 8)
bloc1 = Bloc(32, 40)
bloc2 = Bloc(64, 0)
bloc3 = Bloc(96, 80)
joc = stage.Stage(ugame.display, 12)
blocs = [bloc1, bloc2, bloc3]
joc.layers = [bloc1, bloc2, bloc3, fons]
joc.render_block()
while True:
    for element in blocs:
        element.update()
    joc.render_sprites(blocs)
    joc.tick()

La majoria de les línies ja les coneixem. Potser en cal comentar unes poques.

Definim tres blocs o elements i els inicialitzem, cada un, en una posició diferent de la pantalla.

bloc1 = Bloc(32, 40)
bloc2 = Bloc(64, 0)
bloc3 = Bloc(96, 80)

També creem un vector amb tots els blocs creats.

blocs = [bloc1, bloc2, bloc3]

I, a cada passada pel bucle principal, fem un bucle que recorri el vector i actualitzi tots els elements.

    for element in blocs:
        element.update()

 

 

 

 

 

 

 

 

 

 

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