Hola comunidad!
Estoy desarrollando un juego y necesito que mi personaje camine sobre un terreno irregular, pero no sé cómo darle una forma física que se adapte bien al terreno irregular; podría aproximar el terreno con círculos y cajas, pero seguramente hay alguna solución que sea más adecuada…
Muchas gracias!
Giovanni
Hola @giovannirescia, por el momento lo más viable en pilas es aproximar el terreno usando circunferencias y rectángulos como habías propuesto. No necesitas que sean actores, alcanzaría con hacerlo directamente desde el módulo de física, definiendo las figuras como “no dinámicas”.
Fisica - pilas-engine
En futuras versiones de pilas deberíamos implementar polígonos, que sería la forma ideal de resolverlo, pero aún no hemos tenido oportunidad de hacerlo andar.
Avisanos cualquier cosa.
Qué lástima! Estoy aproximando una pendiente con rectángulos en forma de escalones. El problema es que cuando mi Actor sube los escalones, por alguna razón cada escalón le cuesta más, y genera algo así como una fuerza centrípeta en dirección contraria a cómo sube los escalones, ie, si sube de derecha a izquierda, el personaje empieza a querer girar en sentido antihorario. Y cuando dejo de subir, de alguna manera “sale disparado” hacia la izquierda; en criollo, parece que le estoy dando cuerda… Acá el código:
pilas = pilasengine.iniciar(alto=900,ancho=1600)
class Pj(pilasengine.actores.Actor):
def iniciar(self):
self.radio_de_colision = 50
def actualizar(self):
aux = 4
if self.pilas.control.izquierda:
self.x -= aux
self.rotacion += aux
elif self.pilas.control.derecha:
self.x += aux
self.rotacion -= aux
pilas.actores.vincular(Pj)
pj = Pj(pilas)
c = pilas.fisica.Circulo(y=-300, x=-500, radio=50, amortiguacion=0,restitucion=0,)
pj.imitar(c)
xs = []
for i in range(0,5):
xs.append(pilas.fisica.Rectangulo(ancho=200, y=-350-20*i, x=500-100*i, plataforma=1, dinamico=0))
pilas.ejecutar()
Hola @giovannirescia, creo que ahí encontré como resolverlo:
Como el actor imita a la figura física, lo mejor es mover la figura en lugar del actor.
FIjate que cambiando la lineas que controlan la posición “x” por algo cómo “figura.velocidad_x” se evita el problema de la aceleración que observabas:
# coding: utf-8
pilas = pilasengine.iniciar(alto=900,ancho=1600)
class Pj(pilasengine.actores.Actor):
def iniciar(self):
self.radio_de_colision = 50
self.imagen = "pelota.png"
def actualizar(self):
aux = 1
if self.pilas.control.izquierda:
self.figura.velocidad_x -= aux
self.rotacion += aux
elif self.pilas.control.derecha:
self.figura.velocidad_x += aux
self.rotacion -= aux
else:
self.figura.velocidad_x = 0
pilas.actores.vincular(Pj)
pj = Pj(pilas)
c = pilas.fisica.Circulo(y=-300, x=-500, radio=50, amortiguacion=0,restitucion=0,)
pj.imitar(c)
xs = []
for i in range(0,5):
xs.append(pilas.fisica.Rectangulo(ancho=200, y=-390-20*i, x=500-100*i, plataforma=1, dinamica=False))
pilas.fisica.definir_gravedad_y(-100)
pilas.ejecutar()
Genial! Y buenísimo el hint de ‘empujar’!
Saludos,
Giovanni