class Defensor(object): url_imagen = None imagen = None cuadro_alpha = 0 cantidad = (1, 1) def __new__(cls, *args, **kargs): if not cls.imagen: cls.imagen = engine.cargar_imagen(cls.url_imagen, True) return object.__new__(cls, *args, **kargs) def __init__(self, i, j): self.i = i self.j = j self.grilla = Grilla(self.url_imagen, self.cantidad[0], self.cantidad[1]) self.rect = engine.pygame.Rect(0, 0, self.grilla.ancho, self.grilla.alto) self.rect.right = 50 + engine.obtener_director().escena_actual.ancho_cuadro * (j + 1) self.rect.bottom = 120 + engine.obtener_director().escena_actual.alto_cuadro * (i + 1) self.intervalo_animacion = 0.15 self.crono_i_a = engine.pygame.time.get_ticks() self.salud = 100 self.actual = 0 self.habilidades = [] @property def cuadro_actual(self): return self.grilla.obtener_cuadro(self.cuadros[self.actual]) def aprender_habilidad(self, classname, *args): habilidades_actuales = [habilidad.__class__ for habilidad in self.habilidades] if classname not in habilidades_actuales: self.habilidades.append(classname(self, args)) def olvidar_habilidad(self, classname): for h in self.habilidades: if h.__class__ == classname: self.habilidades.remove(h) break def dibujar(self, superficie): superficie.blit(self.imagen, self.rect, self.cuadro_actual) def actualizar(self, tiempo): if self.salud <= 0: if engine.obtener_director().escena_actual.tablero[self.i][self.j].__class__ == Nenufar and engine.obtener_director().escena_actual.tablero[self.i][self.j].contenido: engine.obtener_director().escena_actual.tablero[self.i][self.j].contenido = None else: engine.obtener_director().escena_actual.tablero[self.i][self.j] = 0 if engine.pygame.time.get_ticks() - self.crono_i_a > self.intervalo_animacion * 1000: self.crono_i_a = engine.pygame.time.get_ticks() self.actual += 1 if self.actual > len(self.cuadros) - 1: self.actual = 0 self.actualizar_habilidades(tiempo) def actualizar_habilidades(self, tiempo): for h in self.habilidades: h.actualizar(tiempo) def sincronizar_cronos_pausa(self, t): nroh = 0 for h in self.habilidades: for i in h.__dict__: if re.match("\Acrono_i_.*", i): exec("self.habilidades[nroh].{}=self.habilidades[nroh].{}+t".format(i, i)) nroh += 1
class Atacante(object): url_imagen_1 = None url_imagen_2 = None imagen1 = None imagen2 = None cantidad = (1, 1) def __new__(cls, *args, **kargs): if not cls.imagen1: cls.imagen1 = engine.cargar_imagen(cls.url_imagen_1, True) cls.imagen2 = engine.cargar_imagen(cls.url_imagen_2, True) return object.__new__(cls, *args, **kargs) def __init__(self, i, w, h): self.w = w self.h = h self.i = i self.j = 10 self.grilla = Grilla(self.url_imagen_1, self.cantidad[0], self.cantidad[1]) self.rect_real = engine.pygame.Rect(0, 0, self.grilla.ancho, self.grilla.alto) self.rect_real.centerx = self.w * (self.j + 1) self.rect_real.bottom = 120 + self.h * (i + 1) self.rect = engine.pygame.Rect(0, 0, 15, self.grilla.alto) self.intervalo_movimiento = 0.8 self.intervalo_animacion = 0.1 self.crono_i_m = 0 self.crono_i_a = 0 self.salud = 100 self.danio = 30 self.detenido = False self.congelado = False self.duracion_congelado = 2 self.crono_i_c = 0 self.imagen = self.imagen1 @property def cuadro_actual(self): return self.grilla.obtener_cuadro(self.cuadros[self.actual]) def dibujar(self, superficie): superficie.blit(self.imagen, self.rect_real, self.cuadro_actual) def actualizar(self, tiempo): if self.congelado and engine.pygame.time.get_ticks() - self.crono_i_c > self.duracion_congelado * 1000: self.descongelar() def congelar(self): self.crono_i_c = engine.pygame.time.get_ticks() if not self.congelado: for i in self.__dict__: self.congelado = True if re.match("\Aintervalo_.*", i): exec("self.{}=self.{}*4".format(i, i)) self.imagen = self.imagen2 def descongelar(self): if self.congelado: self.congelado = False self.imagen = self.imagen1 for i in self.__dict__: if re.match("\Aintervalo_.*", i): exec("self.{}=self.{}/4.0".format(i, i))
class Disparo(object): imagen = None sombra = None url_imagen = None url_sombra = "sombra.png" cantidad = (1, 1) def __new__(cls, *args, **kwargs): if not cls.imagen: cls.imagen = engine.cargar_imagen(cls.url_imagen, True) cls.sombra = engine.cargar_imagen(cls.url_sombra, True) return object.__new__(cls, *args, **kwargs) def __init__(self, x, y): self.grilla = Grilla(self.url_imagen, self.cantidad[0], self.cantidad[1]) self.rect = engine.pygame.Rect(0, 0, self.grilla.ancho, self.grilla.alto) self.rect.x = x self.rect.y = y self.velocidad = 3 self.crono_i_m = 0 self.crono_i_a = 0 self.intervalo_movimiento = 0.001 self.intervalo_animacion = 0.1 self.actual = 0 self.cuadros = [0] @property def cuadro_actual(self): return self.grilla.obtener_cuadro(self.cuadros[self.actual]) def dibujar(self, superficie): superficie.blit(self.imagen, self.rect, self.cuadro_actual) def dibujar_sombra(self, superficie): superficie.blit(self.sombra, (self.rect.right - self.sombra.get_width(), self.rect.y + 78)) def actualizar(self, tiempo): if engine.pygame.time.get_ticks() - self.crono_i_m > self.intervalo_movimiento * 1000: self.crono_i_m = engine.pygame.time.get_ticks() self.mover() if engine.pygame.time.get_ticks() - self.crono_i_a > self.intervalo_animacion * 1000: self.crono_i_a = engine.pygame.time.get_ticks() self.actual += 1 if self.actual > len(self.cuadros) - 1: self.actual = 0 if self.rect.left >= 1200: engine.obtener_director().escena_actual.balas.remove(self) self.hacer_danio() def mover(self): pass def hacer_danio(self): atc = engine.pygame.sprite.spritecollideany(self, engine.obtener_director().escena_actual.atacantes) if atc: atc.salud -= self.danio engine.obtener_director().escena_actual.balas.remove(self)
class Defensor(object): url_imagen = None imagen = None cuadro_alpha = 0 cantidad = (1, 1) def __new__(cls, *args, **kargs): if not cls.imagen: cls.imagen = engine.cargar_imagen(cls.url_imagen, True) return object.__new__(cls, *args, **kargs) def __init__(self, i, j): self.i = i self.j = j self.grilla = Grilla(self.url_imagen, self.cantidad[0], self.cantidad[1]) self.rect = engine.pygame.Rect(0, 0, self.grilla.ancho, self.grilla.alto) self.rect.right = 50 + engine.obtener_director( ).escena_actual.ancho_cuadro * (j + 1) self.rect.bottom = 120 + engine.obtener_director( ).escena_actual.alto_cuadro * (i + 1) self.intervalo_animacion = 0.15 self.crono_i_a = engine.pygame.time.get_ticks() self.salud = 100 self.actual = 0 self.habilidades = [] @property def cuadro_actual(self): return self.grilla.obtener_cuadro(self.cuadros[self.actual]) def aprender_habilidad(self, classname, *args): habilidades_actuales = [ habilidad.__class__ for habilidad in self.habilidades ] if classname not in habilidades_actuales: self.habilidades.append(classname(self, args)) def olvidar_habilidad(self, classname): for h in self.habilidades: if h.__class__ == classname: self.habilidades.remove(h) break def dibujar(self, superficie): superficie.blit(self.imagen, self.rect, self.cuadro_actual) def actualizar(self, tiempo): if self.salud <= 0: if engine.obtener_director().escena_actual.tablero[self.i][ self.j].__class__ == Nenufar and engine.obtener_director( ).escena_actual.tablero[self.i][self.j].contenido: engine.obtener_director().escena_actual.tablero[self.i][ self.j].contenido = None else: engine.obtener_director().escena_actual.tablero[self.i][ self.j] = 0 if engine.pygame.time.get_ticks( ) - self.crono_i_a > self.intervalo_animacion * 1000: self.crono_i_a = engine.pygame.time.get_ticks() self.actual += 1 if self.actual > len(self.cuadros) - 1: self.actual = 0 self.actualizar_habilidades(tiempo) def actualizar_habilidades(self, tiempo): for h in self.habilidades: h.actualizar(tiempo) def sincronizar_cronos_pausa(self, t): nroh = 0 for h in self.habilidades: for i in h.__dict__: if re.match("\Acrono_i_.*", i): exec( "self.habilidades[nroh].{}=self.habilidades[nroh].{}+t" .format(i, i)) nroh += 1
class Atacante(object): url_imagen_1 = None url_imagen_2 = None imagen1 = None imagen2 = None cantidad = (1, 1) def __new__(cls, *args, **kargs): if not cls.imagen1: cls.imagen1 = engine.cargar_imagen(cls.url_imagen_1, True) cls.imagen2 = engine.cargar_imagen(cls.url_imagen_2, True) return object.__new__(cls, *args, **kargs) def __init__(self, i, w, h): self.w = w self.h = h self.i = i self.j = 10 self.grilla = Grilla(self.url_imagen_1, self.cantidad[0], self.cantidad[1]) self.rect_real = engine.pygame.Rect(0, 0, self.grilla.ancho, self.grilla.alto) self.rect_real.centerx = self.w * (self.j + 1) self.rect_real.bottom = 120 + self.h * (i + 1) self.rect = engine.pygame.Rect(0, 0, 15, self.grilla.alto) self.intervalo_movimiento = 0.8 self.intervalo_animacion = 0.1 self.crono_i_m = 0 self.crono_i_a = 0 self.salud = 100 self.danio = 30 self.detenido = False self.congelado = False self.duracion_congelado = 2 self.crono_i_c = 0 self.imagen = self.imagen1 @property def cuadro_actual(self): return self.grilla.obtener_cuadro(self.cuadros[self.actual]) def dibujar(self, superficie): superficie.blit(self.imagen, self.rect_real, self.cuadro_actual) def actualizar(self, tiempo): if self.congelado and engine.pygame.time.get_ticks( ) - self.crono_i_c > self.duracion_congelado * 1000: self.descongelar() def congelar(self): self.crono_i_c = engine.pygame.time.get_ticks() if not self.congelado: for i in self.__dict__: self.congelado = True if re.match("\Aintervalo_.*", i): exec("self.{}=self.{}*4".format(i, i)) self.imagen = self.imagen2 def descongelar(self): if self.congelado: self.congelado = False self.imagen = self.imagen1 for i in self.__dict__: if re.match("\Aintervalo_.*", i): exec("self.{}=self.{}/4.0".format(i, i))