es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Dibujando un sprite en la circunferencia de un círculo en función de la posición de otros objetos.

Estoy creando un juego estilo arcade de francotirador en Gamemaker Studio 2 y quiero que la posición de los objetivos fuera de la pantalla sea señalada por flechas que se mueven a lo largo de la circunferencia del alcance cuando se mueve. Estoy utilizando técnicas trigonométricas para determinar las coordenadas, pero la flecha está saltando alrededor y no parece apuntar al objetivo. Tengo el código dividido en dos partes: el código para determinar las coordenadas en el evento “step” de la clase “enemies” (los objetos a los que se apuntará) y un evento de dibujo en la misma clase. Además, cuando intento rotar la flecha para que también apunte al enemigo, no se dibuja en absoluto.

Aquí está el algoritmo para las coordenadas y el código para dibujar las flechas, respectivamente:

//determinar el ángulo que el objetivo forma con el jugador
delta_x = abs(ObjectPlayer.x - x);  //desplazamiento en el eje x
delta_y = abs(ObjectPlayer.y - y);  //desplazamiento en el eje y
angle = arctan2(delta_y, delta_x);   //ángulo en radianes
angle *= 180/pi;                     //ángulo en grados

//determinar la dirección basada en la dimensión más grande y
largest_distance = max(delta_x, delta_y);
plusOrMinus = (largest_distance == delta_x)? sign(ObjectPlayer.x - x) : sign(ObjectPlayer.y - y);

//definir las coordenadas de las flechas
chevron_x = ObjectPlayer.x + plusOrMinus * (cos(angle) + 20);
chevron_y = ObjectPlayer.y + plusOrMinus * (sin(angle) + 20);

El código de dibujo:

if(object_exists(ObjectEnemy)){
    draw_text(ObjectPlayer.x, ObjectPlayer.y - 10, string(angle));
    draw_sprite(Spr_Chevron, -1, chevron_x, chevron_y);
    // Spr_Chevron.image_angle = angle; //sSpr_Chevron.image_angle = angle;
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Posible solución y recomendaciones

    Basándonos en el código proporcionado, hay algunos problemas y posibles soluciones/recomendaciones para mejorar la funcionalidad del puntero de objetivo en el juego estilo arcade “sniper shooter” en Gamemaker Studio 2, específicamente:

    1. En el algoritmo de las coordenadas, el cálculo de signo(angulo) debería ser sin(angulo) para obtener el valor del seno del ángulo, que representa el desplazamiento vertical. Alternativamente, en lugar de utilizar sin(angulo) y 20 como desplazamiento vertical, se podría utilizar un valor fijo que se ajuste mejor al tamaño del visor, como una fracción de la altura de la vista o del visor.
    2. El cálculo de angulo *= 180/pi parece innecesario porque el código de dibujo utiliza string(angulo) para mostrar el ángulo en grados, y no afecta al cálculo de las coordenadas del puntero. Si se necesita el ángulo en grados en otra parte del código, se podría calcular por separado o almacenarlo en una variable.
    3. El cálculo de plusOrMinus asume que el desplazamiento más grande es igual al valor x o y del objeto enemigo, lo cual puede no ser cierto en todos los casos cuando el visor se mueve. En su lugar, se debería calcular el desplazamiento más grande entre los valores x e y del objeto enemigo y del jugador, y utilizar el signo de la diferencia entre las coordenadas del enemigo y del jugador en esa dimensión para determinar la dirección. Por ejemplo:
      desplazamiento_mas_grande = max(abs(ObjetoJugador.x - x), abs(ObjetoJugador.y - y));
      masOMenos_x = sign(ObjetoJugador.x - x);
      masOMenos_y = sign(ObjetoJugador.y - y);
    4. El código de dibujo debería utilizar los mismos valores de masOMenos que el algoritmo de las coordenadas para asegurarse de que el puntero se mueva en la dirección correcta y siga la misma lógica. Además, debería establecer la propiedad image_angle del sprite Spr_Puntero en angulo para girarlo en consecuencia. Por ejemplo:
      draw_sprite_ext(Spr_Puntero, -1, puntero_x, puntero_y, 1, 1, angulo, c_white, 1);

    En general, para mejorar la precisión y consistencia del mecanismo de apuntado del puntero, puede ser útil almacenar las coordenadas del puntero y el ángulo en variables de instancia del objeto enemigo, o en un objeto objetivo separado que contenga el objeto enemigo y su correspondiente puntero. Esto puede simplificar el código y permitir un acceso y manipulación más sencilla de la información del objetivo. Además, puede ser útil añadir algunos mensajes de depuración o retroalimentación visual, como dibujar líneas entre la posición del jugador, del enemigo y del puntero, para verificar los cálculos y detectar cualquier error o discrepancia.

Comments are closed.