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 !