Tilengine - The 2D retro graphics engine forum

Full Version: camara y colision con un mapa
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Saludos.

He intentado hacer que la camara siga a mi personaje como en el juego de mario bross,pero como no se como se hace solo he dado movimiento al layer y al moverse el personaje da un salto de posicion,luego he intentado hacer que el personaje detecte una colision con el mapa al tocarlo pero me quede a medias porque la funcion get_tile() me da error con los parametros colocados y la verdad es que tampoco sabria que hacer despues de esto.

Te paso el archivo con el intento.
https://drive.google.com/file/d/1gJpvhGs...sp=sharing
Hola,

Ya ibas bien encaminado, pero hay algo que parece ser un poco confuso por la forma en que está hecho el wrapper python.

Puedes obtener información de un tile en el ámbito del Tilemap o de la capa (Layer) donde está aplicado.

Sobre un Tilemap
Tilemap.get_tile(row, col, ref Tile) te devuelve sólo la info del tile que hay definido en el archivo tmx. Le pasas la columna y la fila donde está situado el tile (fíjate que no son píixeles) y una estructura Tile, que sólo contiene un índice y unos flags de atributo

Soibre una capa Layer
Layer.get_tile(x, y, ref TileInfo) te devuelve la información sobre la capa inicializada. Le pasas las coordenadas x,y en píxeles y una estructura TileInfo que contiene mucha más información:
  • Fila, columna, índice y flags del tile dentro del mapa tmx (lo mismo que la estructura Tile de antes)
  • Puntos de corte dentro del tile (en qué pixel de dentro del tile estás exactamente)
  • Un flag indicando si es un tile vacío
  • Color del tile en ese punto (si hay)
  • Tipo del tile (si hay)
A nivel de gameplay, lo que te interesará siempre es usar esta segunda forma, pues te da mucha más información. El único requisito es que como lo aplicas sobre una capa, la capa debe estar previamente inicializada con un Tilemap, si no te dará error. En tu código deberás hacer:

Code:
informacion = tilengine.TileInfo()
engine.layers[0].setup(fondo0)
engine.layers[0].get_tile(self.x,self.y,informacion)

fíjate que la estructura es tipo TileInfo, y que el get_tile() se aplica sobre engine.layers[0], no sobre fondo0.
Gracias,lo probare haber si consigo algo. Wink

Y sobre manejar la camara,¿Como se hace?
A grandes rasgos puedes basarte en el proyecto de ejemplo https://github.com/megamarc/TilenginePythonPlatformer.

La idea es que tu gameplay utilice coordenadas de mundo, no de pantalla, tanto la "cámara" como los actores o personajes. Por ejemplo después de haber estado un rato avanzando hacia la derecha, puedes tener la cámara en cam_x = 3700 y un personaje en actor_x = 3850. Luego estableces la posición de la capa a cam_x, y la posición de los sprites en pantalla la obtienes restando la posición de la cámara menos la posición del actor. Sería algo así, para que te hagas una idea:
Code:
layer.set_position(cam_x, cam_y)
for actor in actores:
    actor.sprite.set_position(actor.x - cam_x, actor.y - cam_y)

De esta forma, al trabajar internamente en coordenadas de mundo, puedes usar directamente la función Layer.get_tile() (estructura TileInfo) que te comentaba antes.
El determinar cuándo y cómo se mueve la "cámara", o si va siguiendo a alguien, ya es cosa de tu gameplay
Ok,lo probare.

Ahora tengo otro problema, no se como hacer que se detecte una colision con el layers,me fije en un ejemplo que tengo de la version antigua de tilengine python,pero al hacerlo igual no funciona.

Te paso el archivo:
https://drive.google.com/file/d/1bcel0rM...sp=sharing