Voici un exemple simple pour gérer la transparence : cet exemple est très simple, il crée un petit carré qui suit la souris partout, et un autre « gros » carré qui apparait autour de la souris puis ne bouge plus, et dès que la souris sort de ce carré, hop, il fait un fondu au noir. Vous pouvez donc vous baser sur cet exemple pour comprendre comment transformer votre Surface en surface transparente destinée à être rapidement affichée à l’écran. Je parle de convert_alpha()
. Avec cet appel, pour vous donner une idée, le temps pris est presque 40 fois plus rapide que sans l’appel. Vous pouvez tester par vous même !
Attention !
Le plus important c’est de faire dans l’ordre :
self.image.set_alpha(valeur_transparence)
pygame.Surface.convert_alpha(self.image)
Car l’ordre self.image.set_alpha(valeur_transparence)
fera créer un masque au complet, et ce n’est qu’après qu’il vous faudra convertir la totale via pygame.Surface.convert_alpha(self.image)
.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, pygame, sys, time, random, copy, pprint
from pygame.locals import *
class MySprite(pygame.sprite.Sprite):
def __init__(self,width,height):
# (!) Avant toute chose appeler le constructeur parent :
pygame.sprite.Sprite.__init__(self)
self.width = width
self.height = height
self.rect = pygame.Rect(0, 0, width, height)
self.image = pygame.Surface( (self.rect.width, self.rect.height) )
self.image.set_colorkey((0,0,0))
self.image.fill((0, 0, 0))
class SMouse(MySprite):
def __init__(self,width,height):
MySprite.__init__(self,width,height)
pygame.draw.rect(self.image, (205,250,130), self.rect, 5)
self.image = self.image.convert()
def update(self):
self.rect.topleft = pygame.mouse.get_pos()
class Contour(MySprite):
def __init__(self,width,height,speed):
MySprite.__init__(self,width,height)
pygame.draw.rect(self.image, (105,250,230), self.rect, 5)
self.fadeout = False
self.speed = speed
self.alpha = 250
self.done = False
self.image.set_alpha(self.alpha)
# Convertir en transparent :
pygame.Surface.convert_alpha(self.image)
def update(self):
if not self.fadeout:
if not self.rect.collidepoint( pygame.mouse.get_pos() ):
self.fadeout = True
else:
self.alpha -= self.speed
if self.alpha<0:
self.alpha = 0
self.done = True
self.image.set_alpha(self.alpha)
def main():
pygame.init()
pygame.mouse.set_visible(0)
screen = pygame.display.set_mode( (0,0),
pygame.FULLSCREEN | pygame.DOUBLEBUF | pygame.HWSURFACE )
if pygame.display.Info().bitsize < 24:
print "This game needs a 24 bits display"
pygame.quit()
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((0, 0, 0))
screen.blit(background, (0, 0))
pygame.display.flip()
clock = pygame.time.Clock()
c = Contour(500, 500, 5)
c.rect.center = pygame.mouse.get_pos()
group_sprites = pygame.sprite.RenderPlain( [ SMouse(50, 50), c ] )