pygame
L'essenziale
Ricerca…
Disegno e animazione di base
Questo programma disegna alcune forme e ' ciao mondo! 'e lascia che un'immagine arrivi ad ogni angolo della finestra.
il codice completo:
import pygame,sys
from pygame.locals import *
pygame.init()
FPS = 30 #frames per second setting
fpsClock = pygame.time.Clock()
#set up the window
screen = pygame.display.set_mode((500,400), 0, 32)
pygame.display.set_caption('drawing')
#set up the colors
black = ( 0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
green = ( 0, 255, 0)
blue = ( 0, 0, 255)
imageImg = pygame.image.load('baddie.png')
imagex = 320
imagey = 220
direction = 'left'
fontObj = pygame.font.Font('freesansbold.ttf', 32)
text = fontObj.render('Hello World!', True, green, blue)
rect = text.get_rect()
rect.center = (200, 150)
# the main game loop
while True:
screen.fill(white)
# draw a green polygon onto the surface
pygame.draw.polygon(screen, green, ((146, 0), (291, 106), (236, 277), (56, 277), (0, 106)))
# draw some blue lines onto the surface
pygame.draw.line(screen, blue, (60, 60), (120, 60), 4)
pygame.draw.line(screen, blue, (120, 60), (60, 120))
pygame.draw.line(screen, blue, (60, 120), (120, 120), 4)
# draw a blue circle onto the surface
pygame.draw.circle(screen, blue, (300, 50), 100, 0)
# draw a red ellipse onto the surface
pygame.draw.ellipse(screen, red, (300, 250, 80,80), 1)
# draw a red rectangle onto the surface
pygame.draw.rect(screen,red, (200, 150, 100, 50))
# draw the text onto the surface
screen.blit(text, rect)
if direction == 'right':
imagex += 5
if imagex == 320:
direction = 'down'
elif direction == 'down':
imagey += 5
if imagey == 220:
direction = 'left'
elif direction == 'left':
imagex -= 5
if imagex == 20:
direction = 'up'
elif direction == 'up':
imagey -= 5
if imagey == 20:
direction = 'right'
screen.blit(imageImg, (imagex, imagey))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
fpsClock.tick(FPS)
impostazione di pygame e della finestra:
import pygame,sys
from pygame.locals import *
pygame.init()
#set up the window
screen = pygame.display.set_mode((500,400), 0, 32)
pygame.display.set_caption('drawing')
disegnando lo sfondo bianco:
In questa funzione si definisce il colore dello sfondo.
screen.fill(white)
disegnando il poligono verde:
Qui puoi definire la superficie di visualizzazione, il colore e la posizione di ogni angolo del poligono (coordinate xey), puoi farlo in senso orario e antiorario.
pygame.draw.polygon(screen, green, ((146, 0), (291, 106), (236, 277), (56, 277), (0, 106)))
disegnando le linee blu:
In questa funzione si definisce la superficie di visualizzazione, il colore, il primo e l'ultimo punto e la larghezza della linea (se non si dà una larghezza, è solo 1).
pygame.draw.line(screen, blue, (60, 60), (120, 60), 4)
pygame.draw.line(screen, blue, (120, 60), (60, 120))
pygame.draw.line(screen, blue, (60, 120), (120, 120), 4)
disegnando il cerchio blu:
In questa funzione si definisce la superficie di visualizzazione, il colore, la posizione, il raggio e la larghezza del cerchio (se si assegna uno 0 per la larghezza, si tratta di un cerchio semplice).
pygame.draw.circle(screen, blue, (300, 50), 100, 0)
disegnando l'ellisse:
In questa funzione si definisce la superficie di visualizzazione, il colore, la posizione, la dimensione orizzontale e la dimensione verticale e la larghezza.
pygame.draw.ellipse(screen, red, (300, 250, 80,80), 1)
disegnando il rettangolo:
In questa funzione si definisce la superficie di visualizzazione, il colore, la posizione e la dimensione orizzontale e verticale.
pygame.draw.rect(screen,red, (200, 150, 100, 50))
definizione del testo:
Per prima cosa definisci il tipo e la dimensione del tuo testo con questa funzione:
fontObj = pygame.font.Font('freesansbold.ttf', 32)
Quindi definisci il testo attuale, se il testo è in grassetto, il colore e, se vuoi, il colore del segno. Puoi farlo con questa funzione:
text = fontObj.render('Hello World!', True, green, blue)
Se vuoi segnare il tuo testo, devi dire a pygame che con questa funzione:
rect = text.get_rect()
E se vuoi definire la posizione del centro del testo puoi farlo con questa funzione:
rect.center = (200, 150)
disegno del testo:
Se hai definito una marcatura e / o il centro:
screen.blit(text, rect)
Altrimenti devi definire la posizione del testo quindi disegna il testo in questo modo:
screen.blit(text, (100,50))
definizione dell'immagine:
Qui definisci quale immagine vuoi usare (se lo fai in questo modo, il file immagine deve essere nella stessa directory del file di programma), la posizione iniziale (xey) e la direzione dell'immagine.
image = pygame.image.load('image.png')
baddiex = 320
baddiey = 220
direction = 'left'
animare l'immagine:
Con questa parte del codice controlliamo la direzione dell'immagine, se raggiunge un angolo, in tal caso, cambia la direzione, altrimenti, disegna l'immagine di 5 pixel ulteriormente nella stessa direzione.
if direction == 'right':
imagex += 5
if imagex == 360:
direction = 'down'
elif direction == 'down':
imagey += 5
if imagey == 260:
direction = 'left'
elif direction == 'left':
imagex -= 5
if imagex == 20:
direction = 'up'
elif direction == 'up':
imagey -= 5
if imagey == 20:
direction = 'right'
screen.blit(imageImg, (imagex, imagey))
nota: la mia immagine è di 20x20 pixel, io uso if imagex == 360:
e if imagey == 260:
perché allora la mia immagine è di 20 pixel dal bordo della finestra, proprio come gli altri 2 angoli. Se la tua immagine ha una dimensione diversa, probabilmente dovrai cambiare quei numeri.
controllare per uscire:
Qui controlliamo se hai chiuso la finestra di pygame e, in tal caso, chiudi la finestra, se non la scrivi da qualche parte nel tuo programma, probabilmente non sarai in grado di chiudere la finestra.
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
aggiornare lo schermo:
Con questa funzione si aggiorna lo schermo in modo che tutto ciò che si è disegnato sia visibile.
pygame.display.update()
Impostazione FPS:
Con questa funzione devi dire a pygame di dormire abbastanza in modo che la tua impostazione FPS sia rispettata.
fpsClock.tick(FPS)
Usando con PIL
Quando devi usare sia PIL che Pygame perché mancano le funzionalità in entrambi, hai bisogno di un modo per convertire tra Pygame Surfaces e PIL Immagini, preferibilmente senza scriverle sul disco.
Per questo è possibile utilizzare le funzioni "tostring" e "fromstring" fornite in entrambe le librerie.
Conversione da PIL a Pygame:
strFormat = 'RGBA'
raw_str = image.tostring("raw", strFormat)
surface = pygame.image.fromstring(raw_str, image.size, strFormat)
Conversione da Pygame a PIL:
strFormat = 'RGBA'
raw_str = pygame.image.tostring(surface, strFormat, False)
image = Image.frombytes(strFormat, surface.get_size(), raw_str)