Funzione transform.rotate() di Pygame

Per ruotare un oggetto di superficie (immagine o testo) in pygame uso la funzione rotate del modulo pygame.transform.

transform.rotate(surface, angle)

Dove gli argomenti sono

  • surface è l'oggetto di superficie da ruotare
  • angle è l'angolo di rotazione da applicare

    Un esempio pratico

    In questo script carico in memoria un'immagine di un quadrato rosso e la ruoto progressivamente tramite un ciclo continuo che incrementa l'angolo da 0 a 359.

    1. import pygame
    2. pygame.init()
    3. screen = pygame.display.set_mode((400,300))
    4. square = pygame.image.load('quadrato.gif')
    5. angolo=0
    6. running = True
    7. while running:
    8. screen.fill((0, 0, 0))
    9. for event in pygame.event.get():
    10. if event.type == pygame.QUIT:
    11. running=False
    12. angolo+=1
    13. if angolo>359: angolo=0
    14. square2 = pygame.transform.rotate(square, angolo)
    15. screen.blit(square, (170,120))
    16. screen.blit(square2, (170,120))
    17. pygame.display.update()
    18. pygame.time.delay(50)

    Alla riga 14 ruoto l'oggetto di superficie square creando un secondo oggetto square2 tramite la funzione transform.rotate().

    square2 = pygame.transform.rotate(square, angolo)

    Alle righe 15 e 16 disegno nell'area grafica entrambi i quadrati, quello fisso e quello ruotato, tramite il metodo blit().

    Dove le coordinate (170,120) indicano la posizione dell'angolo in alto a sinistra delle immagini.

    screen.blit(square, (170,120))
    screen.blit(square2, (170,120))

    L'effetto in output è il seguente

    Come si può notare pygame ruota l'oggetto ma non mantiene il centro dell'oggetto originario.

    l'effetto della rotazione

    Ogni volta che ruota l'immagine si ricalcola la dimensione della superficie rettangolare che lo contiene.

    Quindi la posizione (170,120) viene applicata alla nuova superficie rettangolare.

    Per capire questo fenomeno basta aggiungere tre righe di codice dopo la riga 16.

    lar=square2.get_width()
    alt=square2.get_height()
    pygame.draw.rect(screen, RED, (170,120,lar,alt),1)

    Queste righe calcolano le dimensioni del rettangolo che contiene l'immagine ruotata e lo disegnano sullo schermo.

    La nuova immagine ruotata mantiene le coordinate in alto a sinistra (170,120) ma è più grande dell'originale.

    la rotazione della immagine cambia centro

    Per far ruotare l'immagine su se stessa devo applicare all'immagine ruotata lo stesso centro dell'immagine originale.

    Dopo aver ruotato l'immagine, creo l'oggetto rettangolare che la contiene (rettangolo) tramite il metodo get_rect().

    square2 = pygame.transform.rotate(square, angolo)
    rettangolo = square2.get_rect();
    rettangolo.center = (170,120)
    screen.blit(square2, rettangolo)

    Poi imposto il centro dell'oggetto rettangolare alle coordinate (170,120).

    In questo modo modifico le coordinate (x,y) dell'angolo in alto a sinistra dell'oggetto rettangolo.

    Infine traccio l'immagine ruotata con il metodo blit() passandogli le coordinate dell'oggetto rettangolo.

    Questa modifica mi permette di far ruotare l'immagine su un punto fisso.

    L'effetto in output è il seguente

    l'immagina ruota intorno a un punto

    Il risultato è migliore ma ancora non è perfetto.

    L'immagine ruota intorno al punto (170,120) ossia l'angolo in alto a sinistra dell'immagine centrale.

    In realtà io voglio farla ruotare intorno al centro dell'immagine originale.

    Per farlo basta una piccola modifica alle coordinate del centro.

    square2 = pygame.transform.rotate(square, angolo)
    rettangolo = square2.get_rect();
    rettangolo.center = (170+square.get_width()/2, 120+square.get_height()/2)
    screen.blit(square2, rettangolo)

    In pratica aggiungo rispettivamente alle coordinate (170,120) la metà della lunghezza e la metà dell'altezza dell'immagine originale.

    Ora l'effetto grafico in output è perfetto.

    L'immagine gira su se stessa.

    l'effetto in output

    E così via.

     


     

    Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

    FacebookTwitterLinkedinLinkedin
    knowledge base

    PyGame