Tiles - Mover una plataforma

Tiles - Mover una plataforma

Notapor diego_g_09 » Mar Sep 27, 2011 3:50 am

Buenas, estoy actualmente investigando como mover una plataforma formada en tile, por ejemplo horizontalmente, se me ocurre una forma de hacerlo pero considero que es media compleja, por lo tanto quisiera preguntar si alguien conoce alguna función para realizar este requerimiento, algo que ya este creado, aclaro la plataforma no es un Sprite, son tiles.
Estoy utilizando pygame.

Gracias!!
diego_g_09
 
Mensajes: 21
Registrado: Sab Ago 07, 2010 11:58 pm

Re: Tiles - Mover una plataforma

Notapor kaiser » Mar Sep 27, 2011 7:25 pm

Hola diego! En primer lugar decirte que yo no utilizo pygame sino pySFML, pero espero poder ayudarte.

Los tiles son pequeñas imágenes que se utilizan, en conjunto, para crear escenarios. Que yo sepa pygame no incluye métodos "especiales" para trabajar con tiles, sino que trata a los tiles como si fuesen imágenes igual que los sprites.

Si tu plataforma está formada por una única imagen (tile) moverla horizontalmente sería tan sencillo como modificar ligeramente su coordenada x, como de grande sea esa modificación dependerá de como de rápido quieres que se mueva la plataforma. Con un simple if puedes comprobar cuando la plataforma llega al final de su recorrido y en ese momento hacer que la plataforma se pare o invertir la modificación de la coordenada x para que la plataforma se mueva en sentido inverso.

En caso de que tu plataforma esté formada por varias imágenes simplemente tendrás que hacer lo anterior pero en bucle, de tal forma que la modificación de la coordenada x se aplique a todas las imágenes. Y por supuesto para detectar el final de recorrido tendrás que utilizar los valores de las coord x de las imágenes de los extremos.

Un Saludo!
De la API al IDE y del IDE a la API.
Avatar de Usuario
kaiser
 
Mensajes: 121
Registrado: Mié Nov 24, 2010 7:47 pm
Ubicación: Madrid (España)

Re: Tiles - Mover una plataforma

Notapor Barajas » Mar Sep 27, 2011 9:33 pm

Bueno, en la sección de ejemplos (http://www.losersjuegos.com.ar/referencia/ejemplos), encontraras un tutorial llamado mini RPG escrito en pygame.
En ese tutorial, se muestra una implementación de un mapa de tiles, y se añade movimiento desde el segundo ejemplo.
Creo que te puede servir :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Tiles - Mover una plataforma

Notapor diego_g_09 » Jue Sep 29, 2011 12:49 am

Hola, muchas gracias por la respuesta!, efectivamente mi plataforma se compone de varios tiles, la pregunta iba dirigida a ver si existe algún ejemplo donde se realice este movimiento especifico, el de mover varios tiles horizontalmente de un lado a otro, o sea la tipica plataforma en movimiento, ya que veo un poco complejo el realizar la función, capaz que existe algún ejemplo con funciones de pygame, o python que simplifique este requerimiento. Por ejemplo si tengo una plataforma que se encuentra en mi map en estas posiciones:
map[55][15], map[55][16], map[55][17], map[55][18], map[55][19], map[55][20], como y donde se debe realizar el procedimiento.

Muchas gracias por la ayuda.
diego_g_09
 
Mensajes: 21
Registrado: Sab Ago 07, 2010 11:58 pm

Re: Tiles - Mover una plataforma

Notapor kaiser » Jue Sep 29, 2011 7:22 pm

Hola diego. Aquí te dejo un ejemplo que acabo de hacer en pySFML de una plataforma formada por 3 tiles que se mueve horizontalmente. Creo que el código es bastante comprensible pero si tienes cualquier duda, pregunta. Adjunto también la imagen del tile por si te interesa.

#Importamos los modulos necesarios
from PySFML import sf

#Creamos y configuramos la ventana de juego
window = sf.RenderWindow(sf.VideoMode(640, 480), "Plataforma")
window.SetFramerateLimit(60) #Cantidad maxima de ticks por segundo

#Inicializamos las variables de juego
event = sf.Event() #Gestor de eventos
running = True #Mientras running = True ejecutaremos el juego
sentido = True #True = derecha | False = izquierda
velocidad = 5 #Cantidad de pixeles que avanzara la plataforma cada tick

#Cargamos las imagenes
tile1 = sf.Image()
tile1.LoadFromFile("tile.jpg")
tile1 = sf.Sprite(tile1)
tile1.SetPosition(0, 240)

tile2 = sf.Image()
tile2.LoadFromFile("tile.jpg")
tile2 = sf.Sprite(tile2)
tile2.SetPosition(20, 240)

tile3 = sf.Image()
tile3.LoadFromFile("tile.jpg")
tile3 = sf.Sprite(tile3)
tile3.SetPosition(40, 240)

#Iniciamos el bucle principal
while running:
while window.GetEvent(event):
if event.Type == event.Closed:
running = False

if tile1.GetPosition()[0] <= 0: #Si el primer tile se sale de la pantalla por la izquierda hacemos que la plataforma se dirija a la derecha
sentido = True
elif (tile3.GetPosition()[0] + 17) >= 640: #Si el ultimo tile se sale de la pantalla por la derecha hacemos que la plataforma se dirija a la izquierda
sentido = False

if sentido:
tile1.SetPosition(tile1.GetPosition()[0] + velocidad, 240)
tile2.SetPosition(tile2.GetPosition()[0] + velocidad, 240)
tile3.SetPosition(tile3.GetPosition()[0] + velocidad, 240)
else:
tile1.SetPosition(tile1.GetPosition()[0] - velocidad, 240)
tile2.SetPosition(tile2.GetPosition()[0] - velocidad, 240)
tile3.SetPosition(tile3.GetPosition()[0] - velocidad, 240)


window.Clear()
window.Draw(tile1)
window.Draw(tile2)
window.Draw(tile3)

window.Display()

window.Close()


Un Saludo!
De la API al IDE y del IDE a la API.
Avatar de Usuario
kaiser
 
Mensajes: 121
Registrado: Mié Nov 24, 2010 7:47 pm
Ubicación: Madrid (España)

Re: Tiles - Mover una plataforma

Notapor diego_g_09 » Vie Sep 30, 2011 4:01 am

Ok, muchas gracias por tomarte el tiempo para escribir el código, entiendo lo que hiciste pero no es exactamente lo que estoy precisando, lo que tu haces en el codigo es tener a los tiles como si fueran sprite, o sea "objetos" o imagenes "separadas", yo a mis tiles los tengo todos en un map [][], el problema es como ir modificando ese map[][] para realizar el movimiento, por ejemplo el map puede ser algo asi:

miEscenario = [
[0,0,0,0,1,1,1,1,0,0]
[0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,1,1,1,1,0,0]
[0,0,0,0,0,0,0,0,0,0]
]
donde los 1 serian las plataformas, el problema consiste en como "dentro del game loop" realizar el movimiento, ya que los tiles no se si pueden moverse pixel a pixel como en tu ejemplo -- atributo "velocidad", creo que un tile de 32x32 debe moverse de a 32 pixeles o eso creo, no lo se. Mi duda es si existe alguna función, o algo que simplifique la solución a este problema, el de mover los 1´s horizontalmente??

Gracias!
diego_g_09
 
Mensajes: 21
Registrado: Sab Ago 07, 2010 11:58 pm

Re: Tiles - Mover una plataforma

Notapor kaiser » Vie Sep 30, 2011 7:35 pm

Hola diego. Acabo de desarrollar éste código, a ver si te ayuda más. Los valores del array posiciones se calculan de la siguiente manera: (distancia_recorrida_por_la_plataforma / número_total_casillas_plataforma). En mi ejemplo la distancia recorrida es de 170px y la plataforma tiene un total de 10 casillas así que cada "salto" es de 17px (lo que coincide con el tamaño del tile), pero, por ejemplo, podrías hacer que la plataforma recorra 100px y que el número total de casillas de la plataforma sea 20, así cada salto será de tan solo 5px, lo que simulará un movimiento más fluido y menos "a saltos".

El código es bastante poco elegante, en vez de time.sleep() deberías usar las funciones de tiempo que implementa SDL, y alguna que otra mejora como, por ejemplo, que para desplazar los tiles en vez de desplazarlos todos puedes simplemente añadir una nueva casilla en un extremo y eliminar la última casilla del otro extremo. Y ya sabes si sigues teniendo dudas, pregunta xD.

#Importamos los modulos necesarios
from PySFML import sf
import time

#Creamos y configuramos la ventana de juego
window = sf.RenderWindow(sf.VideoMode(640, 480), "Plataforma")
window.SetFramerateLimit(60) #Cantidad maxima de ticks por segundo

#Inicializamos las variables de juego
event = sf.Event() #Gestor de eventos
running = True #Mientras running = True ejecutaremos el juego
sentido = [True, True, False] #True = derecha | False = izquierda
miEscenario = [[0,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,0], [0,0,0,1,1,1,1,0,0,0]] #Un escenario con tres plataformas
posiciones = [0,17,34,51,68,85,102,119,136,153] #Las posiciones en las que se dibujaran los tiles (17px)
posicion_horizontal = [100, 150, 400] #Nos permite situar la plataforma donde deseemos (horizontalmente)
posicion_vertical = [150, 220, 330] #Nos permite situar la plataforma donde deseemos (verticalmente)

#Cargamos la imagen
tile = sf.Image()
tile.LoadFromFile("tile.jpg")
tile = sf.Sprite(tile)

#Iniciamos el bucle principal
while running:
while window.GetEvent(event):
if event.Type == event.Closed:
running = False

nplat = 0 #Numero de plataforma
for plataforma in miEscenario:
if plataforma[0] == 1: #Si la plataforma llega a la izda hacemos que vaya a la dcha
sentido[nplat] = True
elif plataforma[9] == 1: #Si la plataforma llega a la dcha hacemos que vaya a la izda
sentido[nplat] = False

if sentido[nplat]: #Movemos todos los tiles 1 posicion a la dcha
index = 9
while index > 0:
plataforma[index] = plataforma[index - 1]
index -= 1
plataforma[0] = 0
else: #Movemos todos los tiles una pos. a la izda
index = 0
while index < 9:
plataforma[index] = plataforma[index + 1]
index += 1
plataforma[9] = 0
nplat += 1



window.Clear()
index = 0
nplat = 0
for plataforma in miEscenario:
for casilla in plataforma:
if casilla == 1: #Dibujamos el tile donde la plataforma este a 1
tile.SetPosition(posiciones[index] + posicion_horizontal[nplat], posicion_vertical[nplat])
window.Draw(tile)
index += 1
index = 0
nplat += 1

print miEscenario
time.sleep(0.3) #Las plataformas se moveran una pos. cada 0.3 segundos

window.Display()

window.Close()


Un Saludo!
De la API al IDE y del IDE a la API.
Avatar de Usuario
kaiser
 
Mensajes: 121
Registrado: Mié Nov 24, 2010 7:47 pm
Ubicación: Madrid (España)

Re: Tiles - Mover una plataforma

Notapor diego_g_09 » Lun Oct 03, 2011 10:58 pm

Hola muchas gracias por el ejemplo me va a servir de mucha ayuda, ahora no eh podido avanzar por un tema de tiempo pero ni bien tenga un rato libre me pongo a probar el ejemplo y ver si puedo adaptarlo, ni bien pueda hacerlo te lo comunico, gracias por la ayuda!! y por el tiempo que te tomaste en armar el ejemplo :D
diego_g_09
 
Mensajes: 21
Registrado: Sab Ago 07, 2010 11:58 pm


Volver a Videojuegos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado