Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
colision y destrucion de objetos
#1
Hola,no he encontrado ningun ejemplo de pytilengine que me explique como hacer las colisiones con otros objetos y tampoco hay nada para saber como destruir objetos.

Podrias ponerme un ejemplo sencillote donde un objeto colisione con otro y se destruya.
Reply
#2
Hola,

El concepto de creación y destrucción de objetos pertenece a la lógica del juego, no a Tilengine, que no tiene soporte explícito para ello ya que sólo gestiona gráficos. Para tilengine sólo hay una lista fija de sprites que pueden moverse por la pantalla, cambiar su aspecto y habilitarse o deshabilitarse. Esa funcionalidad se construye por encima. Por eso no hay forma de hacer un ejemplo sencillo. Pero sí que hay algunos ejemplos hechos:

Distribución base Tilengine:
El ejemplo shooter utiliza el módulo Actor.c, que implementa gestión basica de actores de juego (creación, destrucción, colisión...). Está hecho para ser reutilizable, no está ligado explícitamente al ejemplo shooter sino que puedes utilizarlo tal cual.

SuperMarioClone
El módulo Actor.cs tiene una funcionalidad similar al anterior: lista de entidades de juego que se utilizan en la gestión del juego

TilenginePythonPlatformer
Dentro del módulo principal platformer.py, tienes la clase Actor, con las mismas funciones básicas, y que sirve de base para las clases Player, Eagle y Opossum, que son los diferentes tipos de entidades que gestiona la demo.

Así pues no hay una forma fácil y rápida de hacerlo, pero ahí hay 3 ejemplos funcionando en los 3 lenhuajes principales: C, C# y Python
Reply
#3
Sabia que me ibas a responder con eso. Tongue 

Podrias pasar el ejemplo shooter a version python,yo no puedo estudiar este ejemplo porque es de c y sigo sin poder compilar los juegos y no puedo ir probando partes del codigo y viendo que hacen por que no puedo compilar con ningun editor.

Me gustaria hacer una demo como este ejemplo y me vendria bien para estudiarlo.
Reply
#4
Hola,ayer estuve intentando por mi cuenta lo de las colisiones y la destrucion.

La destrucion lo consegui con la funcion Sprite.disable(),no me dijistes que no habia en tilengine para eliminar objetos, y esta funcion que es exactamente.

La colision encontre la funcion pero no se muy bien que hacer con esto,ademas me surgio un problema.Yo cree dos clases con dos objetos y llame una en dentro de la otra y me funcionaba al poner solo el nombre de la clase pero no podia instanciar la clase del objeto en dentro de la otra clase.

De que forma voy a poder hacer una colision si no puedo guardar el valor dentro de una variable.
Reply
#5
En Tilengine no se crean ni destruyen sprites. Cuando inicias el motor con Engine.create(), uno de los parámetros que le pasas es el nº de sprites que vas a tener. En ese momento se crea una lista inmutable, el nº de sprites permanece inalterable. Lo que hace la función Sprite.disable() es desactivarlo para que no muestre nada, pero luego se puede reactivar con otros valores.

La forma de trabajo es la siguiente: tu motor de juego, el que gestiona la lógica, sí que debería tener una lista dinámica de entidades (o actores) que se van creando y destruyendo según va avanzando el juego. Pero para representarlos en pantalla lo que haces es ir reutilizando los sprites que te da Tilengine, reasignándolos a nuevos actores según se van necesitando. Es decir, que si por ejemplo inicias el motor con 80 sprites por decir algo, tu límite serán 80 sprites a la vez en pantalla, pero esos 80 sprites se van a ir reciclando muchas veces a medida que los actores a los que están asignados se vayan creando y destuyendo. Así es como funcionan en realidad los sistemas de videojuegos clásicos en 2D.

No entiendo las dudas que dices de las clases y las variables, lo mejor es que adjuntes aquí lo que tienes hecho para ver qué problema hay.
Reply
#6
Code:
#fondos------------------------------------------------
class Fondos(object):
   def __init__(self):
       #iniciar variables y cargar recursos
       self.fondo = Tilemap.fromfile("layer_foreground.tmx")
       self.fondo2 = Tilemap.fromfile("layer_background.tmx")
       motor.layers[0].setup(self.fondo)
       motor.layers[1].setup(self.fondo2)
#personaje----------------------------------------------
class jugador(object):
   def __init__(self):
       #iniciar variables y cargar recursos
       self.x = 60
       self.y = 186
       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)
       #llamamos a la clase fondo
       Fondos()
   def update(self):
       #mover objeto
       if ventana.get_input(Input.RIGHT):
           motor.sprites[0].set_position(self.x,self.y)
           self.x += 2
           #cambiar de lado imagen
           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)
       #destruir sprite
       if ventana.get_input(Input.BUTTON1):
           motor.sprites[0].disable()

Aqui tienes las dos clases,no he pegado todo el codigo solo lo esencial.

Como ves llamo al la clase Fondos() desde la clase jugador y de esa forma va perfecto,pero si hago esto: mifondo = Fondos() ,no me funciona,me refiero a hacerlo dentro de la clase jugador porque fuera si funciona.

Pero tampoco se si la variable mifondo es la que tengo que utilizar para hacer las colisiones con la funcion de colision,estoy un poco liado.
Reply
#7
Buenas!

He examinado tu ejemplo, te adjunto un par de cambios:
  • No es correcto crear el objeto de fondos dentro del de jugador, como si fuera subordinado. Son dos entidades independientes y deben crearse por separado.
  • En el bucle principal añado una llamada a jugador.update()
Te queda así:

Code:
#personaje----------------------------------------------
class Jugador(object):
   def __init__(self):
       #iniciar variables y cargar recursos
       self.x = 60
       self.y = 186
       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):
       #mover objeto
       if ventana.get_input(Input.RIGHT):
           motor.sprites[0].set_position(self.x,self.y)
           self.x += 2
           #cambiar de lado imagen
           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)
       #destruir sprite
       if ventana.get_input(Input.BUTTON1):
           motor.sprites[0].disable()

# inicia motor
motor = Engine.create(480, 360, 2,16,16)

# crea objetos de juego
jugador = Jugador()
mifondo = Fondos()

# crea ventana y bucle principal
ventana = Window.create()
while ventana.process():
    jugador.update()
    ventana.draw_frame()
Reply
#8
Entonces no se puede llamar una clase dentro de otra.Esto es algo que hacia en pilasengine y la clase escena,introducia las clases objeto dentro de la clase escena,tendre que ver otra manera para crear niveles.

Y como hago para que colisione un objeto con otro porque no se como se hace.
Reply
#9
No es que no se pueda, claro que se puede, pero no es formalmente correcto: el fondo no es propiedad del jugador, sino que tiene acceso él al igual que el resto de objetos.

El tema de la detección de colisiones no es un asunto trivial. Pertenece al ámbito de las mecánicas jugables y lógica de juego. Te recomiendo un par de excelentes artículos, aunque están en inglés:

Axis-aligned bounding box (AABB):
https://www.gamedev.net/articles/program...nse-r3084/

Guía para implementar plataformas 2D:
http://higherorderfun.com/blog/2012/05/2...atformers/

Un saludo
Reply
#10
Estan interersantes los articulos,aunque la mayoria de las cosas que se dicen en el articulo 2 ya las sabia porque hay que implementarlas en contruct 2.

Pero supongo que me has enseñado estos articulos porque tilengine no tiene un sistema de colisiones.

Por eso creo que tienes que crear un sistema de colisiones aunque sea simple para poder tener colisiones en tilengine, porque si no es un poco aburrido el crear pequeñas demos.

Seguramente me diras que tilengine es solo una libreria grafica y que no entra dentro de tus planes,pero si creas un sistema de input y de animaciones y no tienes uno de colisiones es un poco raro y la libreria queda un poco coja.

Creo que deberias de preguntar a toda la gente del foro si le gustaria que implementaras un sistema de colisiones aunque sea basico. Angel
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)