Saludos;
Este es mi primer post ya que acabo de ser conocedor de la existencia de este foro, por lo visto aqui uno puede exponer sus dudas cual grito de socorro con la esperanza de que entendidos en la materia contesten a dichas dudas, como absoluto novato y desconocedor de la programacion que soy, he aqui mi primera de muchas dudas:
estoy creando un juego de scroll lateral en el que me gustaria que segun la altura a la que este el personaje en cuestion, los enemigos cambien su sprite, es decir, si consideramos el eje "y" del jugador como referencia, tan solo quiero que si el jugador esta mas bajo que el enemigo, el enemigo cambie el sprite a "mirando abajo", lo mismo pero a la inversa si el jugador esta por encima del enemigo, y uno mirando al frente si el jugador esta de frente al enemigo (indiferentemente de la distancia).
hasta ahora he logrado que el enemigo mire arriba y abajo en funcion a dicho movimiento del jugador, pero jamas mira en direccion recta al jugador, esto es lo que he puesto en el STEP del enemigo:
dy = ob_player.y - y
if (dy < 20) { sprite_index = spr_enemy_1_down depth = 1}
if (dy > 20) { sprite_index = spr_enemy_1_up depth = 1}
if (dy = 0) { sprite_index = spr_enemy_1 depth = 1}
Realmente creo que se trata de que no estoy dejando un margen suficiente entre una opcion y otra (arriba y abajo), pero es que realmente tampoco se como hacerlo o si directamente seria mejor cambiarlo todo.
Preferiria intentar siempre hacer las cosas mediante gml y no con drag and drop si puede ser, pues creo que es lo ideal para aprender a utilizar game maker como es debido.
Un Saludo, y Gracias.
dy = ob_player.y;
if (dy < y) { sprite_index = spr_enemy_1_down depth = 1}
else
if (dy > y) { sprite_index = spr_enemy_1_up depth = 1}
else
{ sprite_index = spr_enemy_1 depth = 1}
Gracias Elviskelley;
Pero con el codigo que me das me quedo exactamente con el mismo problema, si bien es cierto que parece que es mas correcto como tu lo pones, ya que solo se usa un "if" y el resto es "else", sigue ocurriendo que jamas mira al frente el enemigo, ten en cuenta que no es un juego lineal, por lo que estar en linea recta exactamente el jugador y el enemigo es algo que no ocurre.
Es decir: le di un valor de "<20" y ">20" pensando que asi, la diferencia entre uno y otro me pondria el sprite del enemigo mirando al frente, pero no ocurre en ningun momento, o mira arriba o mira abajo, con tu codigo pasa lo mismo.
Con lo que yo no logro dar es con lo que he de poner para que entre mirar arriba y mirar abajo haya un margen de unos 20 o 30 pixeles para que se ponga mirando al frente.
Sinceramente no se mi me estoy explicando debidamente, adjuntare un archivo de imagen a ver si asi se entiende mejor.
Mirando la imagen que adjunto, me refiero a que el espacio comprendido dentro del cuadrado rojo deberia ser la imagen del enemigo mirando recto (que es la suya predefinida), lo que pasa es que esta nunca tiene lugar, ya que o mira abajo o mira arriba.
Gracias.
En lugar de usar varios sprites, podrías usar uno solo que gire en dirección del jugador; para ello es necesario que el sprite se dibuje de forma horizontal, viendo a la derecha, y usar este código:
[gml]
image_angle = point_direction( x,y, obj_jugador.x,obj_jugador.y );
[/gml]
Si es necesario usar varios sprites, entonces también se debe calcular el ángulo y usar un sprite para cada intervalo:
[gml]
angulo = point_direction( x,y, obj_jugador.x,obj_jugador.y );
if( angulo < 135 ) sprite_index = spr_enemy_1_up;
else if( angulo > 225 ) sprite_index = spr_enemy_1_down;
else sprite_index = spr_enemy_1;
[/gml]
además no es necesario asignar la depth en cada step
No es posible hacerlo asi, ha de ser con sprites, ya que se trata de un muñeco con manos y pies que esta volando, por lo tanto, se ha de hacer con Sprites.
He visto el efecto que produce los giros de angulo de un sprite establecido y la verdad es que no me termina de convencer mucho el resultado, aun que a veces para salir del paso va bien (tambien depende del tipo de juego, perspectiva, etc).
Luego probare esa segunda opcion que me has dado a ver si logro hacerlo funcionar, ya te digo que "programacion:0", estoy ultra verde aun, pero bueno, a ver si lo logro con vuestra ayuda.
Un saludo y muchas gracias Clamud.
El codigo del compañero arriba es funcional, ya que no ha indicado giro por angulos (image_angle) solo uso las coordenadas para comparar posiciones.
Pero si lo quieres con un codigo como el tuyo se me ocurre usar un margen en la verificacion.
dy = ob_player.y;
if (y < (dy-32)) { sprite_index = spr_enemy_1_down depth = 1}
else
if (y > (dy+32)) { sprite_index = spr_enemy_1_up depth = 1}
else
{ sprite_index = spr_enemy_1 depth = 1}
Colocar el 32 da 64 pxl de margen entre arriba y abajo, lo que queda dentro de ese margen es el centro.
Perfecto !!;
Ambos metodos son validos, pero son bastante diferentes entre ellos, lo cierto es que me voy a quedar con el de Elviskelley por que se adapta al esquema que yo ya tenia hecho y es exactamente lo que buscaba, no obstante, el otro metodo ofrecido por Clamud es tambien muy interesante y valido, pero no es el que busco, es muy posible que me resulte util para otro tipo de juegos futuros.
Muchisimas gracias a los dos, me habeis ayudado mucho.