Razón Artificial

La ciencia y el arte de crear videojuegos

Engine X: La clase mapa III

Escrito por adrigm el 12 de junio de 2010 en Desarrollo Videojuegos, Noticias, Programación | 14 Comentarios.

Ya tenemos una array bidimensional llamada self.capas que contiene unos números que se corresponde con los tiles que ocupa y tenemos un array unidimensional llamado self.tileset que contiene los sptites de nuestro tilesets (los tiles). Pues el siguiente paso será crear un array bidimensional igual a self.capas, pero sustituyendo los valores por nuestros sprites que tenemos en self.tileset.

Esto lo haremos creando la variable de clase self.mapa y lo hacemos con el siguiente método de la clase mapa:

def crear_mapa(self):
	self.mapa = self.capas
	for i in range(len(self.capas)):
		for f in range(self.height):
			for c in range(self.width):
				if self.capas[i][f]1:
					self.mapa[i][f]1 = self.tileset[self.capas[i][f]1]
				else:
					self.mapa[i][f]1 = None

Lo primero que hace el metodo es una copia exacta de self.capas en self.mapa, así ya tenemos nuestra array col los valores que hay que sustituir. A continuación empezamos a recorres nuestra array tridimensional, para hacerlo para casa capa, con la variable i recorremos las capas y con las variables f y c las filas y las columnas (observad que sacamos los valores de los datos que extraemos del mapa. y a continuación tenemos un if. Si el valor de esa celda es distinto de none hace lo siguiente.

self.mapa[i][f]1 = self.tileset[self.capas[i][f]1]

osea sustituye el valor de la variable self.mapa de la casilla que este mirando por self.tileset[indice] donde indice es el valor de self.capa en se lugar, por tanto si en nuestro mapa, teniamos que hay iba el tile número 5 le estamos diciendo que en self.mapa[i][f][ c ] ponga el sprite self.tileset[5].

Si no se entiende decidmelo y lo explico mejor en los comentarios. Por ultimo si no hay nada en ese cuadro añadimos el valor None.

Con esto ya tenemos nuestro mapa creado y estaríamos listos para mostrarlo en pantalla, pero ahora hay que crear la camára, no se puede mostrar el mapa entero pues no cabe en pantalla, ya veremos como hacerlo.

14 Comentarios en "Engine X: La clase mapa III"

  1. inedit00 dice:

    admin, para mejorar el código, he hecho dos versiones, la molona y la otra, mas “procedimental” y mas fácil de entender. Las dos deberían hacer lo mismo ( aunque no he “compilado” ninguna de las dos ): La molona me ha quedado así:

    mapa, x, y, z = self.capas, xrange(len(self.capas)), xrange(self.height), xrange(self.width)
    evalua = lambda x: self.tileset(x) if x else None
    for i in x:
        for f in y:
            for c in z:
                mapa[i][f]1 = evalua(self.capas[i][f]1)
    self.mapa = mapa
    

    El modo mas “procedimental” queda así:

    self.mapa = self.capas
    for i in xrange(len(self.capas)):
        for f in xrange(self.height):
            for c in xrange(self.width):
                element = self.capas[i][f]1
                if element:
                    self.mapa[i][f]1 = self.tileset[element]
                else:
                    self.mapa[i][f]1 = None
    

    Que diferencia hay? Pues bueno, primero que utilizo XRANGE y no RANGE. Cual es la diferencia? Pues es algo substancial.

    Si yo hago un range(10000000) se computan todos sus elementos [1,2,3,4,5...1000000], y después se itera por cada uno de los elementos. Pero si lo hago con un XRANGE: xrange(1000000), tansolo se computa el elemento que necesita el FOR, osea, no se computa toda la lista entera, sinó que va creando elementos a medida que el FOR los va necesitando.

    Parece una tontería, pero así se optimiza el código. Estos procesos se llaman “lazy”. Y por otra parte, antes de llegar a la condición he guardado el valor de “element”. Esto se puede hacer así, otra vez, por un tema de rendimiento. Como “self.capas[i][f][ c ]” está repetido dos veces, Python tendrá que iterar dos veces para encontrar esta posición, en cambio si la guardamos, tan solo tiene que iterar la primera vez para tener el valor deseado. Esta segunda optimización no creo que se note demasiado ( a diferencia del RANGE o XRANGE ), pero seguro que también ayuda.

    Tan solo dejo ideas para resolver el mismo problema con diferentes enfoques. Saludos!!

  2. inedit00 dice:

    :S OWNED. No se que le ha pasado al formato de mi comentario, pero se ha editado con todo movido. Espero que se entienda algo.

  3. admin dice:

    El plugin de código ha leido y lo ha interptretado como que estabas escribiendo código C, ahora te lo arreglo.

    Por cierto, puedes usar las etiquetas ["python"] (sin comillas) para poner código.

    En cuando a lo que propones, en cuanto corrija el comentario comento.

  4. admin dice:

    Ya he hecho tu comentario más legible.

    En cuando a lo que dices con el uso de xrange, pues no lo sabía que python optimizaba su uso. Es algo a tener en cuenta, sobre todo para juegos donde es importante optimizar.

  5. Bline dice:

    A este paso te montas un rpgmaker antes de que lo terminen los chicos del easyrpg xD

  6. admin dice:

    Ohh el proyecto EasyRPG es más grande que esto, ojala sigan por buen puerto, conozco a varios de sus desarrolladores.

  7. Diego dice:

    Buenas, escribo aquí porque no se bien donde ubicar la pregunta: Actualmente estoy desarrollando una aplicación con pygame que sería del tipo plataformas, el escenario esta compuesto por tiles, o sea un map[][], me encuentro con el siguiente problema, quisiera ver como poder mover una plataforma compuesta de tiles, o sea si existe algún método en pygame, python, o algún ejemplo que muestre como afrontar el problema en el cual me encuentro. El movimiento tendría que ser horizontal, de ir y venir (no se si me explico bien). En mente tengo una solución pero realmente la veo compleja por eso mismo me gustaría averiguar si existe algún método que permita realizar el requerimiento de una forma “simple”. Muchas gracias!!

  8. adrigm dice:

    Diego, revisa los bloques móviles de este miniengine que hice en su día:

    http://razonartificial.com/2010/08/muestra-del-engine-de-pyia/

  9. Pedro dice:

    adrigm, uso Geany y tengo un error al ejecutar el código:

    File “maps.py”, line 61
    if self.capas[i][f]1:
    ^
    Syntax Error: Invalid syntax

    Cual es el problema?

  10. Pedro dice:

    Bueno, la flecha “^” señala al 1.

  11. Diego dice:

    adrigm, perdón que respondo recién ahora pero no había podido probar tu ejemplo, tengo una consulta, tu en ese ejemplo mueves de a un tile, y mi problema es como hacer para mover de a varios, o sea una plataforma que este compuesta por tiles de la siguiente forma: mapEscenario = [ [55][20], [56][20], [57][20], [58][20], [59][20], [60][20] ] no se si se entiende??, y bueno ver si existe algún algoritmo que reconozca la plataforma o sea 55,56,57,58,59,60 y pueda moverla horizontalmente de un lado a otra?, gracias!

  12. Diego dice:

    Hola!, he tenido unos cambios de rumbo en cuanto al juego de plataformas que estoy haciendo y decidí hacerlo con plataformas que son sprites, para así controlar las mismas (movimientos horizontales, verticales, girar sobre su eje, etc,) pero quisiera saber si existe algún ejemplo q muestre como es la mejor forma de trabajar con estas plataformas (sprites), se que existen distintos group en pygame, donde debería agrupar a mis plataformas, si las tengo que actualizar todo el tiempo al igual que lo hago con mi personaje sprite, etc, o sea como trabajar con sprites como plataformas. Saludos! Diego

  13. […] Engine X: La clase mapa III […]

Deja un comentario