Guardar máscara de imagen en pygame

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Guardar máscara de imagen en pygame

Notapor Juanxo » Mié May 06, 2009 11:04 pm

Buenas a todos:
Estoy haciendo ejemplillos para ver un poco todo sobre scroll, colisiones y demás, y tengo un problema.

El problema es que el personaje que manejo, choca de manera inverosimil con los enemigos, así que quería probar con colisiones de máscaras. Pero antes me gustaria ver la máscara que tiene asociada mi personaje.

Se que mediante el comando x.image.get_mask() se puede obtener la máscara de una imagen y me preguntaba si existe la posibilidad de guardar esa imagen como mapa de bits para luego poder verla y modificarla.

Gracias
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor hugoruscitti » Jue May 07, 2009 3:12 am

Saludos, he buscado en la documentación de pygame pero no
encontré una función para hacer eso...

Aún así, como a mí también me interesaba "ver" la máscara
de una superficie, escribí esta función que construye
una superficie en blanco y negro a partir de una máscara
de colisión.

Cabe aclarar que se puede optimizar mucho, pero es irrelevante
ahora, esto es solo ilustrativo:

Código: Seleccionar todo
def make_surface_from_mask(mask):
    """
    Genera una nueva superficie representando una mascara de bits.
    """
    white = (255, 255, 255)
    black = (0, 0, 0)

    width, height = mask.get_size()

    # inicia una superficie completamente negra.
    surface = pygame.surface.Surface((width, height))
    surface.fill(black)

    # imprime en blanco los bits colisionables.
    for x in range(width):
        for y in range(height):
            if mask.get_at((x, y)):
                surface.set_at((x, y), white)

    return surface


también dejo un código de ejemplo que puede servir para
probar la función:

Código: Seleccionar todo
import pygame
screen = pygame.display.set_mode((320, 240))

# carga la imagen original.
image = pygame.image.load('example.png')

# genera la mascara y la superficie en blanco y negro.
mask = pygame.mask.from_surface(image)
mask_surface = make_surface_from_mask(mask)

# Genera el archivo con la mascara de "example.png"
# y la guarda en el disco.
pygame.image.save(mask_surface, "mascara.bmp")


Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Juanxo » Jue May 07, 2009 7:55 am

Vaya @#€%&

Muchas gracias hugo, la verdad es que no parecía tan dificil una vez que lo ves.
Ahora mi problema es el siguiente, toda la imagen es colisionable jajajajaj

EDITO: He conseguido solucionar el problema, mas o menos.
Lo que hice fue crearme una imagen de superficie, poniendo negro todo el lo que fuera del color del fondo, y mas tarde tendré que usar esa imagen como mask.

Es algo guarro, pero no hay otra manera de hacerlo si la Mask me sale todo blanco(todo colisiona) no?
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor hugoruscitti » Jue May 07, 2009 11:23 pm

Si, si sale toda la imagen blanca estaríamos ante una
superficie completamente colisionable.

Aparentemente, para la función "pygame.mask.from_surface"
hay dos tipos de transparencia para generar una mascara.


1 - si la imagen tiene transparencia incorporada, también
llamado canal alpha, entonces la función interpreta uno a uno
todos los pixels e identifica como no colisionables a los pixels
mas transparentes.

2 - si a la imagen se le ha aplicado la función "set_colorkey" entonces
interpretará como no colisionable a los pixels que coincidan con
el color clave.


Por lo que me dices, tu imagen tiene definido como color clave
el color negro, por lo tanto solo se identifica como no colisionable
lo que está en color negro...

Tal vez te resulte mas útil abrir la imagen con un programa como
Gimp y aplicar transparencia usando un canal alpha. Al menos
para mí es lo mas sencillo.

Otra posibilidad es que nos muestres la imagen original, y vemos
otra forma de resolverlo.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Juanxo » Sab May 09, 2009 12:48 am

Buenas Hugo, gracias por la ayuda.
No, yo tengo definido como colorkey el color de fondo, asi que ya no hay problemas.
Probaré lo del Gimp

Muchas Gracias
Juanxo
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron