Eso era lo que me hacia falta realmente, pero me surge un nuevo problema, que pasa, supongamos que en vez de un cofre, tenemos tres cofres y queremos que el primero se abra o cierre si apretamos space, y que los otros dos hagan los mismo si apretamos otras teclas respectivamente. Digo esto porque en mi juego tengo tres flores y la animacion no se pude ver en todas al mismo tiempo, sino en la flor donde el personeje le pase por encima, intente lograr esto pasandole a la funcion update del cofre el objeto de mi personaje, y el numero de la flor, para despues preguntar por la posicion de mi personaje y el numero de la flor valga la redundancia, pero no me pincha ningun invento.
import pygame
from pygame.sprite import Sprite
class Comedora(Sprite):
def __init__(self,x,y):
Sprite.__init__(self)
self.cargar_imagenes()
self.change_state(Cerrada(self))
self.rect = self.cerrada.get_rect()
self.rect.move_ip(x, y)
def cargar_imagenes(self):
self.cerrada = pygame.image.load('img/comedora_0.bmp')
self.cerrada.set_colorkey((255, 255, 255))
self.cerrada.convert_alpha()
self.abriendo = pygame.image.load('img/comedora_1.bmp')
self.abriendo.set_colorkey((255, 255, 255))
self.abriendo.convert_alpha()
self.abierta = pygame.image.load('img/comedora_2.bmp')
self.abierta.set_colorkey((255, 255, 255))
self.abierta.convert_alpha()
self.frames=[self.cerrada,self.abriendo,self.abierta]
def change_state(self, state):
self.state = state
def set_frame(self, index):
self.image = self.frames[index]
def update(self,zeek,n):
if(zeek.rect.x==213 and zeek.rect.y==2 and n==1):
self.state.update(zeek,n)
elif(zeek.rect.x==35 and zeek.rect.y==37 and n==2):
self.state.update(zeek,n)
if(zeek.rect.x==426 and zeek.rect.y==108 and n==3):
self.state.update(zeek,n)
class Cerrada:
def __init__(self, comedora):
self.comedora = comedora
self.comedora.set_frame(0)
def update(self,zeek,n):
if(zeek.rect.x==213 and zeek.rect.y==2 and n==1):
self.comedora.change_state(Abriendo(self.comedora))
elif(zeek.rect.x==35 and zeek.rect.y==37 and n==2):
self.comedora.change_state(Abriendo(self.comedora))
elif(zeek.rect.x==426,zeek.rect.y==108,n==3):
self.comedora.change_state(Abriendo(self.comedora))
- Código: Seleccionar todo
class Abierta:
def __init__(self, comedora):
self.comedora = comedora
def update(self,zeek,n):
if(zeek.rect.x==213 and zeek.rect.y==2 and n==1):
self.comedora.change_state(Cerrando(self.comedora))
elif(zeek.rect.x==35 and zeek.rect.y==37 and n==2):
self.comedora.change_state(Cerrando(self.comedora))
elif(zeek.rect.x==426,zeek.rect.y==108,n==3):
self.comedora.change_state(Cerrando(self.comedora))
class Abriendo:
def __init__(self, comedora):
self.comedora = comedora
self.frames = [2,3]
self.delay = 0
def update(self,zeek,n):
self._update_animation()
def _update_animation(self):
self.delay -= 1
if self.delay <= 0:
self.delay = 20
try:
next_frame = self.frames.pop(0)
print next_frame
self.comedora.set_frame(next_frame -1)
except:
print "El cofre a terminado de abrirse."
self.comedora.change_state(Abierta(self.comedora))
class Cerrando:
def __init__(self, comedora):
print "Entrando en el estado:", self
self.comedora = comedora
#self.frames = [2, 3][::-1]
self.frames = [3, 2]
self.delay = 0
def update(self,zeek,n):
self._update_animation()
def _update_animation(self):
self.delay -= 1
if self.delay <= 0:
self.delay = 20
try:
next_frame = self.frames.pop(0)
self.comedora.set_frame(next_frame -1)
except:
print "El cofre ya se ha cerrado."
self.comedora.change_state(Cerrada(self.comedora))
En progama principal crearia mis flores comedoras
comedora1=Comedora(214,37)
comedora2=Comedora(34,72)
comedora3=Comedora(427,143)
En ciclo principal de juego tendria entonces que llamar a
comedora1.update(zeek,1)
comedora2.update(zeek,2)
comedora3.update(zeek,3)
pero este invento no me pincha