Tilengine - The 2D retro graphics engine forum

Full Version: como crear mas de un objeto
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hola Megamarc,espero que tu y tu familiia esteis bien con lo que esta pasando.

Estaba otra vez con otro intento de hacer algo con tilengine haber si por fin consigo algo y al crear una clase la llame 3 veces para que se creen tres objetos pero solo sale uno y no entiendo que es lo que pasa,tal vez habra que usar listas y guardar los objetos hay pero no se como.

Te agradeceria que me pusieras un pequeño ejemplo de como crear tres objetos con la misma clase,te pongo un ejemplo.
Code:
class jugador(object):
  def __init__(self,x,y):
      self.x = x
      self.y = y
      self.graficos = Spriteset.fromfile("hero")
      motor.sprites[0].setup(self.graficos)
      motor.sprites[0].set_position(self.x,self.y)
      self.animacionPack = SequencePack.fromfile("hero.sqx")
      self.animacionParado = self.animacionPack.sequences["seq_idle"]
      motor.animations[0].set_sprite_animation(0,self.animacionParado,0)
  def update(self):
      if ventana.get_input(Input.RIGHT):
          motor.sprites[0].set_position(self.x,self.y)
          self.x += 2
          motor.sprites[0].set_flags(0)
      elif ventana.get_input(Input.LEFT):
          motor.sprites[0].set_position(self.x,self.y)
          self.x -= 2
          motor.sprites[0].set_flags(Flags.FLIPX)
      if ventana.get_input(Input.BUTTON1):
          motor.sprites[0].disable()

jugador(60,160)
jugador(160,260)
jugador(260,360)
Hola Hokuto!

Gracias por tu interés. Aparte de tener que estar encerrados en casa y no saber qué va a pasar, afortunadamente ningún familiar cercano ni yo estamos contagiados -que sepamos-. Tu bien? Estás en Argentina?

Te comento el problema de tu ejemplo: en tu código referencias de forma constante a motor.sprites[0] y motor.animations[0], con lo que aunque crees 3 instancias, todas ellas utilizan el mismo sprite y la misma animación. Cada instancia debe usar un índice diferente, que puedes obtener cómodamente con motor.get_available_sprite() y motor.get_available_animation()

Code:
class jugador(object):
  def __init__(self,x,y):
      self.x = x
      self.y = y
      self.sprite = motor.get_available_sprite()
      self.animation = motor.get_available_animation()
      ...

Luego en el resto de la clase debes utilizar los self.sprite y self.animation obtenidos previamente.

Otro punto que puedes optimizar, es la carga de recursos: cada vez que creas la clase, cargas una copia nueva de "hero" y "hero.sqx". Sería mejor cargarlos una sola vez en algún init() global, y luego simplemente referenciarlos.

Espero haber aclarado tus dudas!
Jejejejeje,¿porque piensas que estoy en argentina?,soy español y estoy encerrado en casa como tu. Cry

Te pongo el codigo para ver si lo estoy haciendo bien,aunque se te olvido decirme que esas variables sustituian el numero 0.
Code:
import tilengine

engine = tilengine.Engine.create(640,480,2,64,4)
ventana = tilengine.Window.create()
ventana.disable_crt_effect()
engine.set_background_color(tilengine.Color(120,215,242))

class Jugador(object):
   def __init__(self,x,y):
       self.x = x
       self.y = y
       self.sprite = engine.get_available_sprite()
       self.imagen = tilengine.Spriteset.fromfile("hero")
       engine.sprites[self.sprite].setup(self.imagen)
       engine.sprites[self.sprite].set_position(self.x,self.y)
       engine.sprites[self.sprite].set_scaling(2,2)
       
   def update(self):
       pass


Jugador(60,160)
Jugador(160,260)
Jugador(260,360)
while(ventana.process()):
   ventana.draw_frame()

Lo que comentas para optimizar el codigo creando un init() global no lo he entendido,me podrias poner un ejemplo con este mismo codigo que te he puesto.
Supongo que como una vez me hablaste del Pilas Engine, que tiene base en Argentina, me debí quedar con eso Cry  asçí estamos más cerca entonces

Lo de los recursos globales no tiene mucha historia, simplemente que en vez de cargarlo dentro de la clase, se carguen fuera y pertenezcan a un objeto que sólo se inicializa una vez -o incluso que sean globales, sin pariente-. Así luego ya no hay que volver a cargarlos cada vez que se crea una nueva copia del objeto. De la misma forma que creas "engine" y "ventana" una sola vez al principio y luego los vas usando, pues los recursos también los cargarías ahí.
Vale,ya entiendo lo de los recursos,es algo en lo que no me habia fijado.Gracias por la ayuda Wink
De nada! Un placer, espero que puedas ir avanzando