PSP-Python lezione n.3 (animare uno sprite)

« Older   Newer »
 
  Share  
.
  1. Darkman-92™
     
    .

    User deleted


    Eccoci giunti alla lezione n.3, in questa lezione vedremo come animare uno sprite.

    Qualche informazione utile:

    -Documentazione in italiano di Python: http://python.it/doc/Python-Docs/html/
    -Homepage di psp-python: http://fraca7.homeunix.net/trac/
    -Documentazione modulo psp2d: http://fraca7.homeunix.net/trac/wiki/PSP2d
    -Documentazione modulo pspsnd: http://fraca7.homeunix.net/trac/wiki/PSPSnd
    -Documentazione modulo pspos: http://fraca7.homeunix.net/trac/wiki/PSPOS
    -Documentazione modulo pspnet: http://fraca7.homeunix.net/trac/wiki/PSPNet

    Materiale necessario

    PACCHETTO CONTENENTE IMMAGINI E ALTRO

    Ecco il codice. Questa volta è forse un po' più complicato da capire per i "non programmatori", prestateci attenzione.

    Lo stesso codice più il font e le immagini li potete trovare nella directory esempio_4 del pacchetto scaricato.

    # -*- coding: iso-8859-1 -*-
    #Esempio 02: "Sprites animati"
    import psp2d, pspos
    from time import time

    #Setto velocità processore e bus (all'avvio è a 333)
    pspos.setclock(222)
    pspos.setbus(111)

    screen = psp2d.Screen()
    screen.clear(psp2d.Color(0,0,0,255))

    #Carico il font:
    font = psp2d.Font('font.png')

    #Carico le immagini dello sprite:
    spriteImages = []
    spriteImages.append((psp2d.Image('amg1_bk1.png'), psp2d.Image('amg1_bk2.png'))) #Direzione = su = 0
    spriteImages.append((psp2d.Image('amg1_fr1.png'), psp2d.Image('amg1_fr2.png'))) #Direzione = giù = 1
    spriteImages.append((psp2d.Image('amg1_lf1.png'), psp2d.Image('amg1_lf2.png'))) #Direzione = sinistra = 2
    spriteImages.append((psp2d.Image('amg1_rt1.png'), psp2d.Image('amg1_rt2.png'))) #Direzione = destra = 3

    #Posizione di partenza dello sprite:
    boolSprite = False
    direzione = 1
    velocita = 3
    posX = 225
    posY = 125

    lastPad = time()

    #Loop principale:
    while True:
    #Svuoto lo schermo:
    screen.clear(psp2d.Color(0,0,0,255))

    #Scrivo a video:
    font.drawText(screen, 10, 225, "Muovi lo sprite coi tasti direzionali")
    font.drawText(screen, 10, 240, "Premi Triangolo per salvare uno screenshot")
    font.drawText(screen, 10, 255, "Premi X per uscire")

    #Disegno lo sprite:
    spriteImage = spriteImages[direzione][int(boolSprite)]
    screen.blit(spriteImage, 0, 0, spriteImage.width, spriteImage.height, posX, posY, True)

    #Disegno fisicamente il video:
    screen.swap()

    #Controllo l'input dell'utente:
    pad = psp2d.Controller()
    if pad.cross:
    break
    elif pad.triangle:
    screen.saveToFile("screenshot.png")
    elif pad.down and (not lastPad or time() - lastPad >= 0.05):
    #Sposto lo sprite in basso:
    lastPad = time()
    direzione = 1
    if posY + spriteImage.height + velocita < 272:
    posY += velocita
    boolSprite = not boolSprite
    elif pad.up and (not lastPad or time() - lastPad >= 0.05):
    #Sposto lo sprite in alto:
    lastPad = time()
    direzione = 0
    if posY - velocita >= 0:
    posY -= velocita
    boolSprite = not boolSprite
    elif pad.left and (not lastPad or time() - lastPad >= 0.05):
    #Sposto lo sprite verso sinistra:
    lastPad = time()
    direzione = 2
    if posX - velocita >= 0:
    posX -= velocita
    boolSprite = not boolSprite
    elif pad.right and (not lastPad or time() - lastPad >= 0.05):
    #Sposto lo sprite verso destra:
    lastPad = time()
    direzione = 3
    if posX + spriteImage.width + velocita < 480:
    posX += velocita
    boolSprite = not boolSprite



    Di novità reali rispetto alla lezione 02 non ce ne sono, ma vediamo come funziona il programma.

    Per animare uno sprite in modo che "cammini" è sufficiente visualizzare lo sprite in posizioni diverse ad ogni frame (per lo spostamento come nella lezione 02), in più è necessario cambiare ciclicamente l'immagine dello sprite per generare l'animazione della camminata.

    #Carico le immagini dello sprite:
    spriteImages = []
    spriteImages.append((psp2d.Image('amg1_bk1.png'), psp2d.Image('amg1_bk2.png'))) #Direzione = su = 0
    spriteImages.append((psp2d.Image('amg1_fr1.png'), psp2d.Image('amg1_fr2.png'))) #Direzione = giù = 1
    spriteImages.append((psp2d.Image('amg1_lf1.png'), psp2d.Image('amg1_lf2.png'))) #Direzione = sinistra = 2
    spriteImages.append((psp2d.Image('amg1_rt1.png'), psp2d.Image('amg1_rt2.png'))) #Direzione = destra = 3



    Qui vengono caricate in memoria le 8 immagini che servono per l'animazione (2 posizioni per ognuna della quattro direzioni principali su/giu/destra/sinistra).
    Le immagini vengono immagazzinate in una lista (una specie di array, leggete la documentazione ufficiale di Python per saperne di più) ottenendo una strutura simile:

    Elemento 1 array (su): [immagine1, immagine2]
    Elemento 2 array (giu): [immagine1, immagine2]
    ...



    In pratica l'elemento 1 contiene le due immagini per lo spostamento verso l'alto, l'emeneto 2 quelleo per lo spostamento in basso, ecc..

    Viene definita la posizione iniziale e la direzione dello sprite:

    #Posizione di partenza dello sprite:
    boolSprite = False
    direzione = 1
    velocita = 3
    posX = 225
    posY = 125



    La variabile boolSprite servirà per sapere quale delle due immagini deve essere visualizzata, mentre le variabile direzione indica in che direzione è girato lo sprite.

    Durante il disegno del video lo sprite viene disegnato così:

    #Disegno lo sprite:
    spriteImage = spriteImages[direzione][int(boolSprite)]
    screen.blit(spriteImage, 0, 0, spriteImage.width, spriteImage.height, posX, posY, True)



    In pratica viene disegnata a video l'immagine presa dalla lista spriteImages in base alla direzione e alla variabile boolSprite (convertendola in intero può assumere i valori 0 o 1).

    L'ultima cosa che resta da fare è fare i modo che l'utente possa muovere lo sprite.
    Ecco come (analizzeremo solo lo spostamento in basso, gli altri seguono la stessa logica):

    elif pad.down and (not lastPad or time() - lastPad >= 0.05):
    #Sposto lo sprite in basso:
    lastPad = time()
    direzione = 1
    if posY + spriteImage.height + velocita < 272:
    posY += velocita
    boolSprite = not boolSprite



    Come potete vedere in caso di pressione del tasto giù (solo se è passato 0.05 secondi dall'ultimo movimento, altrimenti il personaggio corre troppo) viene impostata la variabile direzione a 1 (che corrisponde a giù).
    Successivamente (se lo sprite non è uscito dallo schermo) viene variata la sua posY e modificata la variabile boolSprite.
    Al prossimo frame in questo modo lo sprite si sarà spostato ed avrà cambiato immagine.

    boolSprite = not boolSprite




    Questa istruzione, che potrebbe sembrare strana, non fa altro che negare boolSprite.
    In questo modo se boolSprite è True diventerà False e se è False diventerà True.
    La conversione in intero di True restituisce 1, mentre quella di False 0.
    P.S. Lo sprite utilizzato è stato preso dai "Last Guardian Sprites" reperibili qui: http://blog.outer-court.com/archive/2006-08-08-n51.html

    Tutorial by sakya
     
    .
0 replies since 19/9/2008, 19:24   360 views
  Share  
.