Problema con tileset

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

Problema con tileset

Notapor Juanxo » Mar Feb 10, 2009 11:06 am

Buenas!!
Estoy tratando de aprender ha hacer algo de animaciones con tiles en python-pygame. Para ello tngo un tileset(o grilla como dice hugo), pero no consigo recortar el cuadrado que quiero, sino que solo mueve la imagen entera.He estado mirando por ahí pero no encontre nada.Si alguno tiene algo de código para hacer este tipo de cosas os agradecería que me lo postearais.

Gracias

PD:ya mire el artículo de hugo en la sección referencias, pero no se como hacerlo en python
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: Problema con tileset

Notapor endaramiz » Mar Feb 10, 2009 11:56 am

Juanxo escribió:Buenas!!
Estoy tratando de aprender ha hacer algo de animaciones con tiles en python-pygame. Para ello tngo un tileset(o grilla como dice hugo), pero no consigo recortar el cuadrado que quiero, sino que solo mueve la imagen entera.He estado mirando por ahí pero no encontre nada.Si alguno tiene algo de código para hacer este tipo de cosas os agradecería que me lo postearais.

Gracias

PD:ya mire el artículo de hugo en la sección referencias, pero no se como hacerlo en python

Como pygame está basado en SDL, es bastante parecido. Ahora no tengo tiempo para hacer un ejemplo.
La clave para resolver el problema se encuentra en el tercer parámetro del blit (source area). Que es el rectángulo que representa el tile que quieres mostrar del tileset.

http://www.losersjuegos.com.ar/traducci ... rface#blit

Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Notapor Juanxo » Mar Feb 10, 2009 12:07 pm

Tio,Endaramiz, te debo una(más bien unas cuantas).No me hace falta ningún ejemplo, ya lo conseguí.El problema es que yo miraba la doc de rect e image, no sabía que se modificaba al imprimir

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

Notapor Juanxo » Mar Feb 10, 2009 2:56 pm

Esto no tiene demasiado que ver con lo anterior, pero veo tonteria abrir nuevo tema para ello.
Si yo hago una imagen con colorkey para solo ver al muñeco, si hago un image.get_rect()de esa imagen,toma como referencia todo(incluido sobre lo que he hecho colorkey), o solo toma los pixels con color??
En caso de que tome todo, ai alguna manera de conseguir que tome solo lo que yo kiero??
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor endaramiz » Mié Feb 11, 2009 12:11 am

Juanxo escribió:Esto no tiene demasiado que ver con lo anterior, pero veo tonteria abrir nuevo tema para ello.

Yo creo que es mejor crear un nuevo tema porque así, a la hora de buscar información en el foro, es más fácil.

Juanxo escribió:Si yo hago una imagen con colorkey para solo ver al muñeco, si hago un image.get_rect()de esa imagen,toma como referencia todo(incluido sobre lo que he hecho colorkey), o solo toma los pixels con color??
En caso de que tome todo, ai alguna manera de conseguir que tome solo lo que yo kiero??
Bueno... la respuesta es bien sencilla, solo tienes dibujar varias imágenes y hacer un print rect.
Con el colorkey, simplemente le dices a pygame que color no quieres que se copie a la hora de hacer un blit, pero lo que es el mapa de bits, sigue intacto.


Juanxo escribió:En caso de que tome todo, ai alguna manera de conseguir que tome solo lo que yo kiero??

Pues sinceramente, no se me ocurre ningún caso en el que sea necesario. ¿A ti sí?¿En qué consiste?
Igualmente he creado una función ya que me resultaba interesante el tema (nunca lo había tratado). Utilizo un algoritmo bastante lento aunque lo he conseguido optimizar un poco a base de escribir líneas.
Código: Seleccionar todo
import pygame
from pygame import *

def diferentes(color1, color2):
    for i in range(3):
        if color1[i] != color2[i]:
            return True
    return False

def minrect(surface):
    colork = surface.get_colorkey()
    array = pygame.surfarray.pixels3d(surface)

    encontrado = False
    i1 = 0
    while not encontrado and i1 < len(array):
        j1 = 0
        while not encontrado and j1 < len(array[0]):
            if (diferentes(array[i1][j1], colork)):
                encontrado = True
            else:
                j1 += 1
        if not encontrado:
             i1 += 1
    if not encontrado:
        return pygame.Rect((0,0,0,0))

    encontrado = False
    i2 = len(array)-1
    while not encontrado and i2 > 0:
        j2 = 0
        while not encontrado and j2 < len(array[0]):
            if (diferentes(array[i2][j2], colork)):
                encontrado = True
            else:
                j2 += 1
        if (not encontrado):
             i2 -= 1

    encontrado = False
    j3 = 0
    while not encontrado and j3 < len(array[0]):
        i3 = i1
        while not encontrado and i3 <= i2:
            if (diferentes(array[i3][j3], colork)):
                encontrado = True
            else:
                i3 += 1
        if (not encontrado):
             j3 += 1

    encontrado = False
    j4 = len(array[0])-1
    while not encontrado and j4 > 0:
        i4 = i1
        while not encontrado and i4 <= i2:
            if (diferentes(array[i4][j4], colork)):
                encontrado = True
            else:
                i4 += 1
        if (not encontrado):
             j4 -= 1

    return pygame.Rect(i1, j3, i2-i1+1, j4-j3+1)

def main():
    image = pygame.Surface((30,30))
    image.fill((255,255,0))
    image.fill((255,0,0), (10,11,12,13))
    #image.fill((255,0,0), (10,11,1,2))
    image.set_colorkey((255,255,0))
    rect = minrect(image)
    print rect

if __name__ == '__main__':
    main()


Al ser un tema que no había tratado, y que me he complicado un poco con el algoritmo, es probable que haya errores. Avisar si notáis algo raro.

Saludos.
Última edición por endaramiz el Mié Feb 11, 2009 1:37 am, editado 1 vez en total
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Notapor Juanxo » Mié Feb 11, 2009 12:16 am

El problema que tengo es que estoy probando con animaciones y estoi probando aver como hacer para que cuando un soldadito atake a otro, este ultimo se caiga.
Las animaciones por separado ya las tengo, pero si hiciera un simple rectcollide, chocarían a mucha distancia entre si los muñecos, porque los rectangulos del tile son grandecitos en comparación con los muñecos.

Gracias por la función, voy a probarla
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