Thread Rating:
  • 1 Vote(s) - 2 Average
  • 1
  • 2
  • 3
  • 4
  • 5
moverse hacia la posicion de un objeto
#1
Pues he intentado que el disparo de un enemigo vaya hacia mi personaje,lo que quiero es que al disparar el disparo vaya a la posicion de mi personaje,pero si muevo mi personaje el disparo no me persigue,simplemente seguira la trayectoria del principio y mi personaje podra esquivar el disparo.

Si miras un juego de naves veras que esto lo usan mucho los tanques que suelen disparar con el cañon hacia la posicion del jugador.

He probado esto pero no he conseguido nada,he copiado la funcion advance() y getAngle() de la libreria de c++ que utilizo de vez en cuando pero no funciona en python.
Las funciones de advance y getAngle estan en la clase disparo enemigo

Lo que yo hago para hacer esto es:
Code:
metodo init(){
  angle = getAngle(enemigo)
}
metodo update(){
  advance(velocidad,angle)
}
 

No se si quedo claro,te paso el archivo con el intento:
https://drive.google.com/file/d/12kFseLu...sp=sharing
Reply
#2
Veo que a pesar de definir DisparoEnemigo.getAngle() y DisparoEnemigo.advance(), no las ejecutas en ningún momento, ni en init() ni en update(), es como si no estuvieran... no será eso lo que te falta?
Reply
#3
Si que las he probado,y de muchas maneras pero no funciona,por eso no las uso en el ejemplo que te he pasado.
Pruebalas tu y veras que no funciona,coloca esto en el metodo update() del disparo enemigo "self.advance(self.velocidad,self.getAngle(jugador))",en el metodo update al disparar el enemigo el disparo no avanza y si colocas esta funcion en el metodo init() al ejecutar el programa da un error y se sale del mismo,otra cosa que faltaria seria una variable angle para poder rotar el sprite pero tilengine no la trae y tendria que crearla y no se como.
Reply
#4
Ya lo tienes funcionando, te comento los pequeños cambios:

En __init()__, velocidad y ángulo son locales y sólo se usan para calcular self.vx y self.vy (velocidad horizontal y vertical):

Code:
velocidad = 3
angulo = self.getAngle(jugador)
self.vx = math.cos(angulo) * velocidad
self.vy = math.sin(angulo) * velocidad

Como ya tienes calculada la velocidad, la función advance() puede eliminarse, con mover() es suficiente. El error de tipo que te daba, es que self.x y self.y están en punto flotante, mientras que Sprite.set_position() requiere que los parámetros sean enteros, para ello se usa la función python int(). Con ello la función mover() queda así:

Code:
def mover(self):
    self.x += self.vx
    self.y += self.vy
    engine.sprites[self.sprite_id].set_position(int(self.x),int(self.y))


Attached Files
.zip   pruebaTile.zip (Size: 1.58 KB / Downloads: 2)
Reply
#5
Muchas gracias. Wink

Ya esta probado y funciona muy bien,lo curioso es que en la funcion getAngle()  donde esta el calculo con atan2() habia que quitar lo de math.degrees() porque con esto los disparos van en angulos aleatorios,tambien en las funciones cos() y sin() hay que quitar lo de math.radians.Parece que en python no hace falta añadir estas funciones como en c++.

Pero hay una cosa que podrias probar,he probado a añadirle numeros a la variable angulo en vez de la funcion getAngle(),para ver si se mueve al angulo correcto,solo funciona bien en angulo 0,si pones 90 o 270 o 180 no va en esa direccion.¿Porque sera?
Reply
#6
Ya tengo solucionado lo de los angulos,simplemente habia que pasarlo a radianes.
Reply
#7
Más que pasarlo a radianes, es ahorrarte pasarlo a grados, las funciones matemáticas trabajan siempre con radianes.
Aprovecha para optimizar en los puntos que te comenté, intenta siempre ahorrar repetir cálculos innecesarios, y aprovechar código que ya tienes en vez de añadir nuevas funciones que hacen casi lo mismo.
Reply
#8
No estoy repitiendo codigo,lo tengo tal como me has dicho.Simplemente queria probar si podia lanzar el disparo a cualquier angulo en vez de obtener el angulo del jugador y no veo otra manera de hacerlo,si tu sabes como lanzar disparos a cualquier direccion sin utilizar angulos te agradeceria que me lo explicaras.

Basicamente solo estoy haciendo esto para lanzar a cualquier angulo.
Code:
angulo = math.radians(180)#angulo 180
Reply
#9
No entiendo bien. En tu código ya obtienes correctamente el ángulo (sí que hace falta) entre el enemigo y el jugador con la función atan2(), sólo que no hace falta pasarlo a grados y luego a radianes otra vez, te lo devuelve en radianes directamente que es lo que necesitas
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)