[Pygame] Cómo puedo mover un mapa de fondo basado en tiles?

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

[Pygame] Cómo puedo mover un mapa de fondo basado en tiles?

Notapor xRodak » Dom Jul 15, 2012 6:39 pm

Bueno, soy nuevo en el foro, y estoy comenzando hace poco con pygame, anteriormente solo sabía python, y por esto mismo he querido introducirme en pygame, para expandir mis conocimientos, y luego de ello, pienso ir por Java o por C/C++, pero por el momento, me mantengo al margen con esto hasta saberlo muy bien.

Les comento mi problema, estoy diseñando un RPG en 2D, en donde el mapa de fondo está hecho con el conocido sistema de tiles (tilesets). Lo que quiero lograr es mantener el personaje estático mientras el mapa de fondo se mueve, para simular el movimiento del personaje. Por ahora tengo el movimiento del personaje, pero lo que no logro hacer, es que se mueva el mapa. Tengo las siguientes variables:

self.mapa: Lista tridimensional. Posee 3 capas del mapa (3 listas), cada capa posee una cantidad "self.height" de filas, y cada fila una cantidad "self.weigth" de imágenes (Surfaces obtenidas mediante Surface,subsurface), por lo que cada imagen debería representarse por self.mapa[c][fil][col]

self.recs: Lista tridimensional con el get_rect() de cada imagen de self.mapa. Por lo que es una lista de rectángulos de cada superficie de self.mapa.

Ahora, la función que utilizo para mover el mapa es la siguiente:


def update(self,screen,vx,vy):
x = 0 ; y = 0 ;z = 0
for capa in self.mapa:
for fila in capa:
for imagen in fila:
if imagen!=None:
self.recs[z][y][x].move_ip(-vx,-vy)
screen.blit(imagen,self.recs[z][y][x])
print "sirve"
else:
pass
x += 1
x=0
y += 1
y = 0
z += 1


Screen es la variable de la pantalla de pygame, vx la velocidad con la que quiero mover el mapa en el eje X, lo mismo con vy. Bueno, obtengo el siguiente error al tratar de correr mi programa principal:

Traceback (most recent call last):
File "C:\Users\Ednar\Desktop\Tarea4enunciado\Tarea4 RPG\Tarea 3 RPG\PY Game\RPG\Test.py", line 124, in <module>
main()
File "C:\Users\Ednar\Desktop\Tarea4enunciado\Tarea4 RPG\Tarea 3 RPG\PY Game\RPG\Test.py", line 118, in main
mapa.update(vx, vy, screen)
File "C:\Users\Ednar\Desktop\Tarea4enunciado\Tarea4 RPG\Tarea 3 RPG\PY Game\RPG\maps.py", line 97, in update
self.recs[z][y][x].move_ip(-vx,-vy)
TypeError: bad operand type for unary -: 'pygame.Surface'


Me falla la linea "self.recs[z][y][x].move_ip(-vx,-vy)", desafortunadamente no puedo ver el problema, mi variable self.recs, son solamente rectángulos, y en algunos lugares su valor es None, pero no es una Surface como me indica el error.

Un problema que veo presente, es que no estoy utilizando la clase Sprite para las imagenes del fondo, por ello no me permite mover las imagenes mediante rect.move_ip(x,y), pero no estoy seguro. Dicha clases es:

class Sprite(pygame.sprite.Sprite):
def __init__(self,imagen):
self.imagen=imagen
self.rect=self.imagen.get_rect() #obtiene el rectángulo de dicha imagen


Esta es la función en donde dibujo el mapa por primera vez en la pantalla, y en donde creo los rectángulos de cada imagen:

def dibujar_mapa(self,screen):
x = 0 ; y = 0 ;z = 0
for capa in self.mapa:
for fila in capa:
for imagen in fila:
try:
self.recs[z][y][x]=imagen.get_rect()
self.recs[z][y][x].left=x*40
self.recs[z][y][x].top=y*40
screen.blit(imagen,self.recs[z][y][x])
except:
self.recs[z][y][x]=None
x += 1
x=0
y += 1
y = 0
z += 1


Esta función me funciona a la perfección, si utilizo esta función en el loop principal de pygame, me dibuja siempre el mismo mapa, sin movimiento, por lo tanto ésta la dejé antes de loop principal, para que me dibuje el mapa solamente una vez, luego en el loop principal, puede la función anterior (update) la que me da el error señalado.


Espero que me puedan ayudar con el problema, lo que quiero hacer es poder mover esa GRAN cantidad de pequeñas imágenes (tiles). Sé mover sprites, creados con la función Sprite, pero el mapa no logro moverlo, ojalá me ayuden con esto:

Saludos !
xRodak
 
Mensajes: 6
Registrado: Dom Jul 15, 2012 6:08 pm

Re: [Pygame] Cómo puedo mover un mapa de fondo basado en til

Notapor xRodak » Dom Jul 15, 2012 7:20 pm

Problema solucionado ! Ya logré mover el mapa, al parecer mi teoría estaba en lo correcto debía utilizar la función Sprite con los tiles de fondo de todas maneras.

Saludos.
xRodak
 
Mensajes: 6
Registrado: Dom Jul 15, 2012 6:08 pm

Re: [Pygame] Cómo puedo mover un mapa de fondo basado en til

Notapor kiketom » Lun Jul 16, 2012 7:49 am

Avatar de Usuario
kiketom
 
Mensajes: 82
Registrado: Lun Ene 03, 2011 3:01 pm
Ubicación: Valencia, España

Re: [Pygame] Cómo puedo mover un mapa de fondo basado en til

Notapor Barajas » Lun Jul 16, 2012 1:03 pm

Bueno, sinceramente, considero que es poco eficiente estar haciendo un bucle constantemente para estar dibujando el fondo... :roll:

Antes de comenzar el bucle del juego, yo prefiero crear una imagen de las dimensiones totales de todo el mapa de tiles, la lleno de un color magenta, pego sobre el todos los tiles, y después le hago transparencia al magenta.... y en el bucle solo pego la imagen.... :D

Bueno, cada quien hace lo que le funciona :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: [Pygame] Cómo puedo mover un mapa de fondo basado en til

Notapor xRodak » Lun Jul 16, 2012 6:28 pm

Gracias a los dos, la información de la web me será útil.

Y Barajas, perdón por mi gran estupidez, pero soy muy, pero muy nuevo, en el trabajo con tiles y pygame, por lo que hay cosas muy fáciles que las hago de manera compleja, pero para ello estoy aprendiendo, y gracias por la sugerencia, sin duda alguna, es la mejor de todas, ahora mismo cambiaré el sistema del mapa, gracias.
xRodak
 
Mensajes: 6
Registrado: Dom Jul 15, 2012 6:08 pm


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados