videojuego mario juegos hacer crear con como codigo bros python graphics sprite pygame

python - mario - Cómo hacer sprites translúcidos en pygame



mario bros en python (4)

Acabo de empezar a trabajar con pygame y estoy intentando crear un sprite semitransparente, y el archivo fuente del sprite es un archivo bitmap no transparente cargado desde el disco. No quiero editar la imagen de origen si puedo evitarlo. Estoy seguro de que hay una manera de hacerlo con el código de pygame, pero Google no me ayuda.


Si su imagen tiene un fondo de color sólido que desea que se vuelva transparente, puede establecerlo como el valor de color_key , y pygame lo hará transparente al blitting de la imagen.

p.ej:

color = image.get_at((0,0)) #we get the color of the upper-left corner pixel image.set_colorkey(color)


podría considerar cambiar a usar imágenes png donde puede hacer cualquier tipo de transparencia que desee directamente en la imagen.


Después de cargar la imagen, deberá habilitar un canal alfa en la Surface . que se verá un poco así:

background = pygame.Display.set_mode() myimage = pygame.image.load("path/to/image.bmp").convert_alpha(background)

Esto cargará la imagen y la convertirá inmediatamente a un formato de píxel adecuado para la mezcla alfa en la superficie de la pantalla. Podrías usar otra superficie si necesitas ajustar a otro buffer fuera de la pantalla en otro formato.

Puede establecer alfa por píxel lo suficiente, digamos que tiene una función que toma un valor de color de 3 tuplas para rgb y devuelve el 4tuple deseado de rgba color + alpha, puede alterar la superficie por píxel:

def set_alphas(color): if color == (255,255,0): # magenta means clear return (0,0,0,0) if color == (0,255,255): # cyan means shadow return (0,0,0,128) r,g,b = color return (r,g,b,255) # otherwise use the solid color from the image. for row in range(myimage.get_height()): for col in range(myimage,get_width()): myimage.set_at((row, col), set_alphas(myimage.get_at((row, col))[:3]))

Hay otras maneras más útiles de hacer esto, pero esto te da la idea, espero.


Puede que no haya sido claro en mi pregunta original, pero creo que lo descubrí por mi cuenta. Lo que estaba buscando resultó ser el método set_alpha () de Surface, así que todo lo que tenía que hacer era asegurarme de que las imágenes translúcidas estuvieran en su propia superficie.

Aquí hay un ejemplo con mi código reducido:

import pygame, os.path from pygame.locals import * class TranslucentSprite(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self, TranslucentSprite.container) self.image = pygame.image.load(os.path.join(''data'', ''image.bmp'')) self.image = self.image.convert() self.image.set_colorkey(-1, RLEACCEL) self.rect = self.image.get_rect() self.rect.center = (320,240) def main(): pygame.init() screen = pygame.display.set_mode((640,480)) background = pygame.Surface(screen.get_size()) background = background.convert() background.fill((250,250,250)) clock = pygame.time.Clock() transgroups = pygame.sprite.Group() TranslucentSprite.container = transgroups """Here''s the Translucency Code""" transsurface = pygame.display.set_mode(screen.get_size()) transsurface = transsurface.convert(screen) transsurface.fill((255,0,255)) transsurface.set_colorkey((255,0,255)) transsurface.set_alpha(50) TranslucentSprite() while 1: clock.tick(60) for event in pygame.event.get(): if event.type == QUIT: return elif event.type == KEYDOWN and event.key == K_ESCAPE: return transgroups.draw(transsurface) screen.blit(background,(0,0)) screen.blit(transsurface,(0,0)) pygame.display.flip() if __name__ == ''__main__'' : main()

¿Es esta la mejor técnica? Parece ser el más simple y directo.