-
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
.