Buenas!
Estoy preparando ya mi nuevo juego, en los que ciertos actores se mueven siguiendo el click de mouse, y me surje un problema con las colisiones…
Lo que necesito es que el actor SE MUEVA LENTAMENTE hasta colisionar, y una vez colisionado se pare y se situe en una posicion concreta respecto al otro actor colisionado. Si se hace a velocidad “normal” no hay problema, pero si intento pasarle parametros de velocidad si empieza a ir mal.
El problema viene cuando el click_de_mouse se hace sobrepasado del actor a colisionar, ya que el mono “se empeña” en seguir su camino hasta el punto donde se hizo el click…
Habria alguna manera de pasar parametros de velocidad de otra forma que no diera ese problema???
Desde ya muchas gracias.
import pilasengine
pilas=pilasengine.iniciar()
aceituna=pilas.actores.Aceituna()
aceituna.x = 50
mono=pilas.actores.Mono()
mono.x = -200
def moverse_a_este_punto(evento):
mono.x = [evento.x] #Si aqui pongo un valor el mono continua
mono.y = [evento.y] #despues de colisionar !!!
#mono.x = [evento.x],3
#mono.y = [evento.y],3
def reir_mono():
mono.sonreir()
mono.x = [aceituna.x-100]
mono.y = [aceituna.y]
pilas.eventos.click_de_mouse.conectar(moverse_a_este_punto)
pilas.colisiones.agregar('Mono','Aceituna', reir_mono)
pilas.ejecutar()
Hola @jordinur, se me ocurre una forma medio “rara” pero muy simple de resolver:
Tal vez podrías eliminar el actor en cuanto colisiona e inmediatamente reemplazarlo por otro. El usuario
no va a percibir que un objeto queda reemplazado por otro, si tienen la misma apariencia van a parecer
el mismo.
Por ejemplo, en videojuego “caza de patos” que aparece en los ejemplos de pilas, al dispararle a un pato
aparece un efecto visual muy interesante, como si el pato saliera saltando…
Mientras que en realidad, en el código del juego, lo que sucede es que el patito amarillo se elimina, y en
su misma coordenada se genera otro actor (el patito gris saltando) para que el usuario vea el efecto, como
si el actor se “transformara” en otra cosa:
Me imagino que podrías hacer lo mismo en tu juego, eliminar al actor Mono que tiene la interpolación y luego crear
otro Mono en la misma coordenada, pero sonriendo.
Hola, Hugo !
Gracias por la respuesta.
De hecho ya había probado esta opción, pero (por las circunstancias especiales de mi juego) no es exactamente lo que necesito (o al menos no sé como hacer que funcione correctamente).
Me ha pasado varias veces creando mis juegos que una cosa es lo que yo quiero que haga un personaje, y otra muy diferente lo que mis conocimientos sobre programación alcanzan. Pero sea como sea ya he pensado en una alternativa que me parece más factible, y que sin ser al 100 % lo que yo queria si funciona correctamente y cumple su función.
Como mínimo, espero que esta solución si ayude a otros con un problema similar!
De nuevo muchas gracias y un abrazo.
Buenas!
A fuerza de prueba-error y muuuucha paciencia he logrado un 99 % de lo que queria.
Lo único que faltaria es que al colisionar el mono se colocara en una posición concreta, pero eso me daba un error tonto (la posición X Y del mono se definia con decimales tipo x = 50,000000001, lo que impedia que se finalizara la tarea mover).
Tambien estaria mejor que el mono siguiera los clicks aún estando en movimiento, dejo ese reto a quien lo quiera recojer
Me he visto obligado a hacer 4 tareas diferentes, dos para las X y dos para las Y. Esto no es que sea muy elegante, pero todas las variaciones que he probado, siendo más elegantes, no funcionaban correctamente.
Aun así creo que puedo vivir con esos pequeños “problemas” y doy el asunto por solucionado.
Dejo el código por si a alguien más le sirviera de ejemplo.
Un abrazo
import pilasengine
pilas=pilasengine.iniciar()
aceituna=pilas.actores.Aceituna()
aceituna.x = 50
mono=pilas.actores.Mono()
mono.x = -200
mono.velocidad = 1/6 #cuantas veces/segundo se mueve el mono 1 pixel
mono.colisionado = False
mono.en_movimiento = False
def moverse_a_este_punto(evento):
if mono.en_movimiento == False: #Hasta que no llegue a destino
print('moviendo mono') #no se pueden dar nuevas
#coordenadas x y al mono
def mover_a_x_d():
if mono.x < evento.x and mono.colisionado == False:
mono.en_movimiento = True
print('mono x d:',mono.x)
print('destino x:',evento.x)
mono.x += 1 # No tocar este valor !!!!!!!!!!!!!!
else:
tarea_x_d.eliminar()
print('tarea x_d finalizada')
mono.en_movimiento = False
tarea_x_d = pilas.tareas.siempre(mono.velocidad, mover_a_x_d)
def mover_a_x_i():
if mono.x > evento.x and mono.colisionado == False:
mono.en_movimiento = True
print('mono x i:', mono.x)
print('destino x:', evento.x)
mono.x -= 1 # No tocar este valor !!!!!!!!!!!!!!
else:
tarea_x_i.eliminar()
print('tarea x_i finalizada')
mono.en_movimiento = False
tarea_x_i = pilas.tareas.siempre(mono.velocidad, mover_a_x_i)
def mover_a_y_h():
if mono.y < evento.y and mono.colisionado == False:
mono.en_movimiento = True
print('mono y h:',mono.y)
print('destino y:',evento.y)
mono.y += 1 # No tocar este valor !!!!!!!!!!!!!!
else:
tarea_y_h.eliminar()
print('tarea y_h finalizada')
mono.en_movimiento = False
tarea_y_h = pilas.tareas.siempre(mono.velocidad, mover_a_y_h)
def mover_a_y_d():
if mono.y > evento.y and mono.colisionado == False:
mono.en_movimiento = True
print('mono y d:', mono.y)
print('destino y:', evento.y)
mono.y -= 1 # No tocar este valor !!!!!!!!!!!!!!
else:
tarea_y_d.eliminar()
print('tarea y_d finalizada')
mono.en_movimiento = False
tarea_y_d = pilas.tareas.siempre(mono.velocidad, mover_a_y_d)
else:
print('El mono ya estaba en movimiento')
def descolisionar_mono():
mono.colisionado = False
print('mono descolisionado')
mono.en_movimiento = False
print ('mono listo para moverse')
def reir_mono():
mono.colisionado = True
mono.sonreir()
pilas.tareas.agregar(1, descolisionar_mono)
pilas.eventos.click_de_mouse.conectar(moverse_a_este_punto)
pilas.colisiones.agregar('Mono','Aceituna', reir_mono)
pilas.ejecutar()