hola a todos hace mucho hice una pregunta de como agregar una gravedad en el centro de un planeta ya que mi juego es de naves y mi personaje es una nave hasta alli estubo bien hasta que me di cuenta que es muy incomodo jugar con gravedad en todo el room porque solo atrae el planeta con gravedad ,poreso se me ocurrio preguntar si es que le puedo asignar un rango de atraccion del planeta osea un radio de distancia (porque mi planeta es redondo), se me ocurrio hacer una condicional con verdadero y falso pero nose como aplicarlas al juego

Podrías probar con "distance_to_object(obj)" e ir varianado el rango.

Se puede simular la gravedad con diferentes grados de realismo; una forma sencilla y muy aproximada a la realidad sería manejar la gravedad como una función cuadrática de la distancia al centro del planeta, pero para un juego de naves sería incómodo ya que la gravedad se hará muy fuerte al acercarse a un planeta, es mejor usar una relación lineal entre gravedad y distancia.

En tu juego, no se si los planetas tienen el mismo tamaño o la misma fuerza de gravedad, si es así, el código puede ir dentro del objeto nave, si no, es mejor que cada planeta ejecute los siguientes códigos:
[gml]
///Create de un planeta

r = //radio del planeta
g = //gravedad máxima del planeta (la que se siente en la superficie)
a = //alcance de la gravedad
[/gml]
En el objeto nave se van a modificar las variables speed y direction a causa de la gravedad:
[gml]
///Step de un planeta

d = point_distance( x,y, obNave.x,obNave.y ); //distancia
if( d < r ) f = g; //fuerza de gravedad = gravedad máxima
else if( d > a ) f = 0; //a esa distancia la fuerza de gravedad es cero.
else f = (d-a)*g/(r-a); //si la distancia está entre el radio y el alcance, la fuerza es una función lineal

if( f > 0 )
{
    k = point_direction( obNave.x, obNave.y, x, y ); //dirección en la que actúa la gravedad
    with( obNave ) motion_add( other.k, other.f ); //agregar la fuerza de gravedad al movimiento de la nave
}
[/gml]
Con esos códigos la nave ya puede reaccionar a la gravedad de los planetas que estén en la room, pero no está especificado un método para detener la nave al colisionar con los planetas, ni la forma en que la nave se va a propulsar. Para no escribir el código en cada objeto planeta usa un objeto parent (padre), todos los objetos hijos deben tener su propio código en el evento Create.

Cita de: Clamud en Diciembre 19, 2014, 09:46:59 PM
Se puede simular la gravedad con diferentes grados de realismo; una forma sencilla y muy aproximada a la realidad sería manejar la gravedad como una función cuadrática de la distancia al centro del planeta, pero para un juego de naves sería incómodo ya que la gravedad se hará muy fuerte al acercarse a un planeta, es mejor usar una relación lineal entre gravedad y distancia.

En tu juego, no se si los planetas tienen el mismo tamaño o la misma fuerza de gravedad, si es así, el código puede ir dentro del objeto nave, si no, es mejor que cada planeta ejecute los siguientes códigos:
[gml]
///Create de un planeta

r = //radio del planeta
g = //gravedad máxima del planeta (la que se siente en la superficie)
a = //alcance de la gravedad
[/gml]
En el objeto nave se van a modificar las variables speed y direction a causa de la gravedad:
[gml]
///Step de un planeta

d = point_distance( x,y, obNave.x,obNave.y ); //distancia
if( d < r ) f = g; //fuerza de gravedad = gravedad máxima
else if( d > a ) f = 0; //a esa distancia la fuerza de gravedad es cero.
else f = (d-a)*g/(r-a); //si la distancia está entre el radio y el alcance, la fuerza es una función lineal

if( f > 0 )
{
    k = point_direction( obNave.x, obNave.y, x, y ); //dirección en la que actúa la gravedad
    with( obNave ) motion_add( other.k, other.f ); //agregar la fuerza de gravedad al movimiento de la nave
}
[/gml]
Con esos códigos la nave ya puede reaccionar a la gravedad de los planetas que estén en la room, pero no está especificado un método para detener la nave al colisionar con los planetas, ni la forma en que la nave se va a propulsar. Para no escribir el código en cada objeto planeta usa un objeto parent (padre), todos los objetos hijos deben tener su propio código en el evento Create.

esta muy bueno pero no se cuanto mide el radio de mi  planeta ni como asignarle el alcanse o la gravedad maxima a las variables

Si tu planeta es un círculo que cabe en un cuadro (sprite) de x pixeles por lado, el radio es la mitad de ese valor. La gravedad máxima y el alcance se tendrán que decidir a base de prueba y error, elige los valores que hagan que tu nave se comporte como quieres.

Hola,
Te adjunto unas 3 imágenes graficas de la interpretación del código de Clamud.
La función lineal que menciona es sólo un valor que va de ]0,g[ de manera que se acerca al planeta dando la intensidad de la gravedad, o sea , si la nave esta más cerca al alcance su intensidad tenderá a 0, pero si se acerca al radio del planeta su intensidad aumenta hasta g.

Comparto lo que dice él
"... La gravedad máxima y el alcance se tendrán que decidir a base de prueba y error ..."

Saludos.
Fracasar no significa un fin sino un comienzo

Cita de: Zela en Diciembre 21, 2014, 04:17:57 AM
Hola,
Te adjunto unas 3 imágenes graficas de la interpretación del código de Clamud.
La función lineal que menciona es sólo un valor que va de ]0,g[ de manera que se acerca al planeta dando la intensidad de la gravedad, o sea , si la nave esta más cerca al alcance su intensidad tenderá a 0, pero si se acerca al radio del planeta su intensidad aumenta hasta g.

Comparto lo que dice él
"... La gravedad máxima y el alcance se tendrán que decidir a base de prueba y error ..."

Saludos.
gracias pero lo que no entiendo es porque mi nave se adentraria al planeta ,soloquiero que colicione con el borde y tenga el alcance ,¿o es que si  se nesestia el radio para especificar la distancia que tendra la gravedad? ,y lo de las variables me preguntaba si se nesesitan algun comando como gravity o algo asi ,o si solo son numeros

#7 Diciembre 21, 2014, 07:07:19 AM Ultima modificación: Diciembre 21, 2014, 07:15:12 AM por Zela
Cita de: marron400 en Diciembre 21, 2014, 06:45:46 AM
Cita de: Zela en Diciembre 21, 2014, 04:17:57 AM
Hola,
Te adjunto unas 3 imágenes graficas de la interpretación del código de Clamud.
La función lineal que menciona es sólo un valor que va de ]0,g[ de manera que se acerca al planeta dando la intensidad de la gravedad, o sea , si la nave esta más cerca al alcance su intensidad tenderá a 0, pero si se acerca al radio del planeta su intensidad aumenta hasta g.

Comparto lo que dice él
"... La gravedad máxima y el alcance se tendrán que decidir a base de prueba y error ..."

Saludos.
gracias pero lo que no entiendo es porque mi nave se adentraria al planeta ,soloquiero que colicione con el borde y tenga el alcance ,¿o es que si  se nesestia el radio para especificar la distancia que tendra la gravedad? ,y lo de las variables me preguntaba si se nesesitan algun comando como gravity o algo asi ,o si solo son numeros

"gracias pero lo que no entiendo es porque mi nave se adentraria al planeta ..." :
- No se adelanta, pues según el Código, "él Planeta" Le Ejerce Una Interacción (atracción) a la Nave, sin que esté en "el Código" en la misma nave.
with( obNave ) motion_add( other.k, other.f ); //agregar la fuerza de gravedad al movimiento de la nave

"... soloquiero que colicione con el borde y tenga el alcance ,¿o es que si  se nesestia el radio para especificar la distancia que tendra la gravedad? ..." :
- Pues, El Código Asemeja de una manera Simple "La Fuerza Gravitatoria" (Física), que en resumen seria ; a mas cerca más fuerte es la atracción y a más lejos débil (el radio del planeta y el alcance son los limites), por ende la función lineal del código hace el papel. en tanto la gravedad (g del código), es solo "un número" como referenciar de "que tan fuerte" puede llegar a ser la atracción a dicho planeta que es "independiente" de la variable "gravity" del código GML. En resumen el "Alcance y Radio" del planeta son fundamentales, para que funcione bien este código y no tienes que realizar una colisión extra, pues esto es como una "falsa colisión radial" en código.

"... ,y lo de las variables me preguntaba si se nesesitan algun comando como gravity o algo asi ,o si solo son números" :
- Pues son solo Números para usar bien la función "motion_add" que realiza los cálculos pertinentes manipulando las variables, speed, vspeed, hspeed, direction, entre otras complementarias, para el objeto "Nave".
Fracasar no significa un fin sino un comienzo

Coloqué un código para distancias menores al radio como protección, para que la fuerza de atracción que ejerce un planeta no pueda ser mayor a g, en caso de que al detectar colisiones la nave quede traslapada con un planeta o que necesites calcular una trayectoria, usando la misma fórmula en distancia menores a r (f = (d-a)*g/(r-a)) la fuerza de gravedad crecerá, aunque sería poco. Se supone que ningún objeto podrá traspasar los planetas, pero como dije, el código if( d < r ) f = g; está como mecanismo de protección.

La variable "r" (radio) indica a qué distancia se tendrá la mayor fuerza de gravedad, o sea, el borde del planeta, y a partir de ahí disminuye hasta donde indica la variable "a" (alcance), para distancias mayores la fuerza de gravedad es cero. El código se puede modificar para no contemplar el radio, y hacer que la fuerza de gravedad sea máxima en el centro del planeta y de ahí disminuya, se puede obtener el mismo resultado haciendo r=0, pero me parece que establecer los valores de "g" y "a" es más dificil de ese modo.

Usar la variable "gravity" no lo había pensado, es buena idea, pero el código queda un poco más largo. Sería casi lo mismo a usar la función motion_add(), pero en vez de modificar las variables "speed" y "direction" se modificarían las variables "gravity" y "gravity_direction". En unas horas, cuando tenga tiempo, te mostraré el código modificado.

Aquí está la otra versión del código.
En el evento Create de la nave es necesario definir 2 variables:
[gml]
///Create de la nave

//Componentes del vector gravedad
gravity_x = 0;
gravity_y = 0;
[/gml]
El evento Step del planeta se debe cambiar a Begin Step y modificar los siguiente:
[gml]
///Begin Step de un Planeta

//...

if( f > 0 )
{
    k = point_direction( obNave.x, obNave.y, x, y ); //dirección en la que actúa la gravedad
    obNave.gravity_x += lengthdir_x( f, k ); //sumar componente x de la gravedad
    obNave.gravity_y += lengthdir_y( f, k ); //sumar componente y de la gravedad
}
[/gml]
En el Step de la nave se asignan las variables de gravedad:
[gml]
///Step de la nave

gravity = point_distance( 0,0, gravity_x, gravity_y );
gravity_direction = point_direction( 0,0, gravity_x, gravity_y );
[/gml]
Y por último se restablecen las componentes de la gravedad en el evento End Step de la nave:
[gml]
///End Step de la nave

gravity_x = 0;
gravity_y = 0;
[/gml]