Hola Makeros, como ya vieron en el titulo, tengo algunas dudas sobre el uso de las posiciones X e Y y la direction

Mi Razonamiento Basico:
Cuando hago un juego, uso las posiciones X e Y paras darle movimiento a mi personaje y a cualquier otro de forma horizontal y vertical. Ya que usar hspeed = 4 en un evento create es lo mismo que sumar 4 a X en el evento step
[gml]
/// Evento Create
hspeed = 4 //derecha
vspeed = -4 //izquierda

/// Evento Step
x += 4 //derecha
x -= 4 //izquierda
y += 4 //abajo
y -= 4 //arriba
[/gml]
Todos conocemos que al sumarle 4 seria positivo y eso indica a la derecha y restarle es negativo a la izquierda

De esa forma le doy movimiento a mi persona o a cualquier otro. Con la direction tambien entiendo el movimiento
[gml]
// 0/360 = derecha, 90 = arriba, 180 = izquierda, 270 = abajo
direction = 270;
speed = 4;
[/gml]
Las 2 formas son realmente buenas para dar movimiento en general pero cuando hago un proyecto, solo me enfoco en una a la hora de programar para no confundirme con sus significados

Hay veces que veo algunos codigos que emplean ambos metodos y suelo entenderlos un poco por la forma en que lo usan. Por ejemplo el siguiente codigo es para rotar un objeto:
[gml]
direction += 4;
x = obj_sphere.x + lengthdir_x(64, direction)
y = obj_sphere.y + lengthdir_y(64, direction)
[/gml]
Pero me confunde... Ya entiendo para que pero no el como, la funcion lengthdir_ te devuelve el angulo y la longitud a la que asignar la X o Y dependiendo de las propiedades, pero mi concepto no me deja entender muy bien la logica

Otro ejemplo es el de crear la bala segun la direction
[gml]
/// Event Step obj_player
if (keyshoot && ammo > 0)  {
   with(instance_create(x, y, obj_bullet) ) {
      direction = image_angle;
      speed = 7;
   }

/// Event Create obj_bullet
x = x + (2*hspeed);
y = y + (2*vspeed);
[/gml]
La parte de la bala me confunde un poco; tambien hay otros ejemplos en juegos 3D que he visto y que no entiendo

Seria mas facil poner lengthdir_ en vez de eso y ya lo he hecho. Normalmente no le prestaria mucha atencion a eso y simplemente seguiria haciendo lo que llevo pero muy seguido he intentado hacer un 3D ligero y al llegar a la parte en la que me topo con alguna X sumandole una direction y..., en fin, hay mas dudas que resaltaria pero me tardaria mucho mas, asi que lo dejare hasta ahi

Disculpa si no se entendieron mis ejemplos o si las dudas no quedaron claras

1. direction y speed son la dirección y magnitud del vector velocidad, respectivamente, y hspeed/vspeed son sus componentes. Además, el signo de speed representa el sentido del vector.

2. Las funciones lengthdir_x(d, r) y lengthdir_y(d, r) son simplificaciones de las funciones trigonométricas, así:
[gml]
lengthdir_x(d, r) == d*dcos(r);
lengthdir_y(d, r) == -d*dsin(r);
[/gml]
(dcos() y dsin() son equivalentes a cos() y sin(), con la diferencia de que reciben el ángulo en grados y no en radianes.)

La razón por la que se multiplica la función sin() por -1 es que el eje vertical en las computadoras está invertido (los positivos "bajan") respecto a como se representa normalmente en un plano cartesiano (los positivos "suben").



[spoiler=no me abras pls]

[/spoiler]

3. Este código:
[gml]/// Event Create obj_bullet
x = x + (2*hspeed);
y = y + (2*vspeed);[/gml]
Lo que hace es evitar que la bala "empiece a moverse" desde la misma ubicación que el jugador, con esa suma lo que se hace es posicionar de inmediato la bala a donde debería estar dentro de dos steps (adelantar el tiempo... (?)... ), considerando la velocidad que lleva.
alaberga regué el café.

BA:STFW&RTFM

Buena mi entendimiento sobre la direction,speed,hspeed,vspeed han cambiado un poco, aunque ya entendi bien el funcionamiento de esos codigos

Creo que me urge enserio repasar las clases de matematicas  :-[

Otra duda es que cuando se crea la bala y se le aplica la direction y la speed, ¿eso hace que los componentes que son hspeed y vspeed se adapten segun... La direcion y magnitud del vector?

Cita de: T789 en Agosto 18, 2020, 08:35:31 PM
¿eso hace que los componentes que son hspeed y vspeed se adapten segun... La direcion y magnitud del vector?
Sí, y viceversa. Las cuatro variables de velocidad se mantienen sincronizadas entre sí, cambias una y las otras tres se adaptan automáticamente.




Aunque ahora que lo mencionas, este código que pusiste no debería funcionar, porque el evento Create se ejecuta antes que lo del with, de modo que estarías moviendo la instancia antes de definir su velocidad.
Cita de: T789 en Agosto 18, 2020, 07:02:38 PM
[gml]
/// Event Step obj_player
if (keyshoot && ammo > 0)  {
   with(instance_create(x, y, obj_bullet) ) {
      direction = image_angle;
      speed = 7;
   }

/// Event Create obj_bullet
x = x + (2*hspeed);
y = y + (2*vspeed);
[/gml]
alaberga regué el café.

BA:STFW&RTFM

Gracias por resolver mis dudad y tienes razon, normalmente con codigos asi, suelo establecer una alarma de admenos 1 para que se carguen las variables de with pero como es una bala directa... Creo que habria que pulir el codigo un poco

Hola, la verdad es que yo tenia la misma duda que tu tenias y pues muchas gracias por hacer la pregunta que tenia que hacer yo.. Y que no hice por miedo a que me tildaran de bobo!

Sigue así y quiero que sepan a todas esas personas que nos han ayudado que son exclentes personas y que sigan asi porque van por un buen camino!!  :P :P