Hola. Al crear los objetos puedes asignar una variable global, por ejemplo, global.opcion=0. El cero indica que no se ha seleccionado ninguna opción, y al presionar alguno de los botones cambiar el valor de global.opcion. En cada step el objeto que tiene la imagen principal debe reaccionar dependiendo del valor de la variable global.
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
1622
Preguntas y respuestas / Re:Determinar posición a seguir por la bala usando el motor de físicas de GMS
Noviembre 12, 2014, 10:39:22 PM
Hola. Para hacer algo similar a move_towards_point se me ocurren dos métodos; uno sería aplicando una fuerza como lo que escrïbí en este tema: http://www.comunidadgm.org/preguntas-y-respuestas/mover-objeto-con-el-mouse-en-room-fisica-resuelto/, y otra forma sería modificar directamente las variables de velocidad en el sistema de físicas como en el código que sigue:
[gml]
rapidez = valor; //se asigna un valor a la rapidez
distancia = point_distance( x,y, obj_asteroide.x, obj_asteroide.y );
if( distancia < rapidez ) rapidez = distancia; //para no pasarse del punto
angulo = point_direction( x,y, obj_asteroide.x, obj_asteroide.y );
phy_speed_x = lengthdir_x( fuerza, angulo ); //cuando la distancia sea cero
phy_speed_y = lengthdir_y( fuerza, angulo ); //la rapidez será cero
[/gml]
Puedes cambiar phy_speed por phy_linear_velocity si quieres indicar la velocidad en metros por segundo en vez de pixeles por step.
El efecto que se consigue es diferente en los dos métodos; al aplicar una fuerza el cambio de velocidad es gradual, pero calcular la velocidad a la que se moverá la nave y posicionarla en un punto específico es difícil; al usar el segundo método el cambio de velocidad es instantáneo, pero en algunos casos el movimiento no es suave.
También puedes cambiar los parámetros del if para que la nave se pare a cierta distancia.
Para encarar la nave con el asteroide debes comparar el ángulo de la nave con el ángulo de la linea que va desde la nave al asteroide, es decir, comparar image_angle con el ángulo obtenido en el código anterior (también se puede usar phy_rotation pero es en dirección contraria):
[gml]
giro = angulo - image_angle;
if( giro > 180 ) giro -= 360;
if( giro <= 180 ) giro += 360;
[/gml]
Gracias a los ifs se obtiene un valor que es mayor a -180 y menor o igual a 180, para que siempre se haga el giro mas corto posible (el giro más largo es media vuelta, o sea 180 grados).
Aquí también se pueden emplear dos métodos, uno es aplicar una fuerza con physics_apply_torque, y el otro es modificar la variable phy_angular_velocity. A continuación está un ejemplo del segundo método:
[gml]
rapidez_angular = valor;
if( abs(giro) > rapidez_angular ) phy_angular_velocity = rapidez_angular * sign(giro);
else phy_angular_velocity = giro;
[/gml]
Los métodos para hacer el giro tienen mas o menos los mismos pros y contras que en el movimiento lineal.
Las balas deben recibir un impulso en la misma dirección o ángulo que la nave.
Eso sería el movimiento básico, espero que se entienda. Si quieres hacer que la nave tenga torretas automáticas, determinar el ángulo de disparo sería similar a lo de arriba, pero tal vez se tenga que restringir el ángulo dependiendo del ángulo de la nave.
Hasta luego.
[gml]
rapidez = valor; //se asigna un valor a la rapidez
distancia = point_distance( x,y, obj_asteroide.x, obj_asteroide.y );
if( distancia < rapidez ) rapidez = distancia; //para no pasarse del punto
angulo = point_direction( x,y, obj_asteroide.x, obj_asteroide.y );
phy_speed_x = lengthdir_x( fuerza, angulo ); //cuando la distancia sea cero
phy_speed_y = lengthdir_y( fuerza, angulo ); //la rapidez será cero
[/gml]
Puedes cambiar phy_speed por phy_linear_velocity si quieres indicar la velocidad en metros por segundo en vez de pixeles por step.
El efecto que se consigue es diferente en los dos métodos; al aplicar una fuerza el cambio de velocidad es gradual, pero calcular la velocidad a la que se moverá la nave y posicionarla en un punto específico es difícil; al usar el segundo método el cambio de velocidad es instantáneo, pero en algunos casos el movimiento no es suave.
También puedes cambiar los parámetros del if para que la nave se pare a cierta distancia.
Para encarar la nave con el asteroide debes comparar el ángulo de la nave con el ángulo de la linea que va desde la nave al asteroide, es decir, comparar image_angle con el ángulo obtenido en el código anterior (también se puede usar phy_rotation pero es en dirección contraria):
[gml]
giro = angulo - image_angle;
if( giro > 180 ) giro -= 360;
if( giro <= 180 ) giro += 360;
[/gml]
Gracias a los ifs se obtiene un valor que es mayor a -180 y menor o igual a 180, para que siempre se haga el giro mas corto posible (el giro más largo es media vuelta, o sea 180 grados).
Aquí también se pueden emplear dos métodos, uno es aplicar una fuerza con physics_apply_torque, y el otro es modificar la variable phy_angular_velocity. A continuación está un ejemplo del segundo método:
[gml]
rapidez_angular = valor;
if( abs(giro) > rapidez_angular ) phy_angular_velocity = rapidez_angular * sign(giro);
else phy_angular_velocity = giro;
[/gml]
Los métodos para hacer el giro tienen mas o menos los mismos pros y contras que en el movimiento lineal.
Las balas deben recibir un impulso en la misma dirección o ángulo que la nave.
Eso sería el movimiento básico, espero que se entienda. Si quieres hacer que la nave tenga torretas automáticas, determinar el ángulo de disparo sería similar a lo de arriba, pero tal vez se tenga que restringir el ángulo dependiendo del ángulo de la nave.
Hasta luego.
1623
Preguntas y respuestas / Re:Clip plane
Noviembre 12, 2014, 09:07:14 PM
Gracias por responder elviskelley, no es exactamente lo que buscaba, pero creo que no expliqué bien mi problema. Adjunto una imagen para que vean lo que sucede.
Lo bueno es que ya se cómo resolverlo (se me ocurrió cuando intentaba resolver un problema similar). Para saber qué objetos se encuentran detrás del espejo es necesario saber cuál es la ecuación del plano.
Dividir los modelos sería útil en modelos grandes o alargados, lo tendré en cuenta si después le doy utilidad a éste experimento.
Cuando termine el código subo el ejemplo. Saludos.
Lo bueno es que ya se cómo resolverlo (se me ocurrió cuando intentaba resolver un problema similar). Para saber qué objetos se encuentran detrás del espejo es necesario saber cuál es la ecuación del plano.
Dividir los modelos sería útil en modelos grandes o alargados, lo tendré en cuenta si después le doy utilidad a éste experimento.
Cuando termine el código subo el ejemplo. Saludos.
1624
Preguntas y respuestas / Re:¿Como hacer para que un objeto no rebote con las propiedades físicas?
Noviembre 11, 2014, 03:29:44 AM
Debes disminuir la propiedad "Restitution".
1625
Preguntas y respuestas / Clip plane
Noviembre 10, 2014, 03:31:47 PM
Hola comunidad.
Lo que voy a pedir es algo difícil pero tal vez me puedan dar algunas ideas para resolverlo. Lo que quiero hacer es un "clip plane" o "plano de recorte" en 3D.

El objetivo es hacer que sólo se dibujen los polígonos de un lado del plano. Una forma de hacer un clip plane es reducir el rango znear-zfar en la función d3d_set_projection_ext pero me gustaría que se pudiera hacer con un plano en un ángulo oblicuo a la proyección.
La aplicación que le quiero dar es hacer un espejo móvil en 3D. Ya tengo un espejo que funciona (usando surfaces), lo puedo mover y orientar, pero cuando hay objetos cercanos detrás del espejo aparecen en la imagen de reflejo, por eso quiero recortarlos.
Lo que voy a pedir es algo difícil pero tal vez me puedan dar algunas ideas para resolverlo. Lo que quiero hacer es un "clip plane" o "plano de recorte" en 3D.

El objetivo es hacer que sólo se dibujen los polígonos de un lado del plano. Una forma de hacer un clip plane es reducir el rango znear-zfar en la función d3d_set_projection_ext pero me gustaría que se pudiera hacer con un plano en un ángulo oblicuo a la proyección.
La aplicación que le quiero dar es hacer un espejo móvil en 3D. Ya tengo un espejo que funciona (usando surfaces), lo puedo mover y orientar, pero cuando hay objetos cercanos detrás del espejo aparecen en la imagen de reflejo, por eso quiero recortarlos.
1626
Preguntas y respuestas / Re:Enemigo con IA (disparar y seguir)
Noviembre 09, 2014, 05:15:41 AMCita de: TheSandBoxMKG en Noviembre 09, 2014, 03:13:00 AMEn ese caso tendrás que hacer algo más elaborado dependiendo de cómo quieres que se mueva. Lo más fácil es usar la función move_towards_point.
Regresar volando, no teletransportandose -_-
1627
Preguntas y respuestas / Re:AL CREAR UNA INSTANCIA, COMPROBAR SI LA POSICION ESTA LIBRE
Noviembre 09, 2014, 12:03:30 AM
Primero, sobre lo que dijo venus, es porque las funciones place_free y move_random evalúan la variable solid de las instancias, entonces si hay una instancia (u objeto) que no está marcado como sólido se puede crear otra instancia encima; una forma de evitar eso sería cambiar la función place_free por place_empty.
En tu código, el problema principal es que para entrar en el primer if no debe existir una instancia de objectMOTORISTA y por lo tanto las variables objectMOTORISTA.x y objectMOTORISTA.y no existen y no pueden usarse en el while. Para que funcione, el código debe dividirse en dos y usarse en dos objetos diferentes: el primer objeto debe revisar si no existe una instancia de objectMOTORISTA y crearla, en el evento create de objectMOTORISTA debe ir alguno de los códigos que te mencionamos anteriormente.
En tu código, el problema principal es que para entrar en el primer if no debe existir una instancia de objectMOTORISTA y por lo tanto las variables objectMOTORISTA.x y objectMOTORISTA.y no existen y no pueden usarse en el while. Para que funcione, el código debe dividirse en dos y usarse en dos objetos diferentes: el primer objeto debe revisar si no existe una instancia de objectMOTORISTA y crearla, en el evento create de objectMOTORISTA debe ir alguno de los códigos que te mencionamos anteriormente.
1628
Preguntas y respuestas / Re:AL CREAR UNA INSTANCIA, COMPROBAR SI LA POSICION ESTA LIBRE
Noviembre 08, 2014, 04:12:31 PM
Mejor, en vez de crear y destruir, puedes cambiar la posición de la instancia con la función "move_random", o usar éste código que viene en el manual de GM8:
[gml]
while (!place_free(x,y))
{
x = random(room_width);
y = random(room_height);
}
[/gml]
[gml]
while (!place_free(x,y))
{
x = random(room_width);
y = random(room_height);
}
[/gml]
1629
Preguntas y respuestas / Re:enemigo camina y cambia de sprite
Noviembre 07, 2014, 04:07:08 AM
Depende de cómo sea la perspectiva en el juego; ¿es cenital?, ¿isométrico?, ...
1630
Preguntas y respuestas / Re:efecto gravedad cero
Noviembre 06, 2014, 05:32:45 AM
Para que el movimiento se cambie lentamente puedes modificar el evento "flecha arriba" usando la función "motion_add":
[gml]
motion_add( image_angle, 1 );
if( speed > 8 ) speed = 8;
[/gml]
[gml]
motion_add( image_angle, 1 );
if( speed > 8 ) speed = 8;
[/gml]
1631
Preguntas y respuestas / Re:Como cambiar la dimensión de la pantalla
Noviembre 05, 2014, 05:08:02 AM
Hola.
Puedes darle el tamaño que quieras cambiando el tamaño de la "room" o de la "view" activa. Si quieres hacer que el tamaño se adapte a la pantalla lee el tutorial que viene con el GMS; "reslolution and scalling".
Puedes darle el tamaño que quieras cambiando el tamaño de la "room" o de la "view" activa. Si quieres hacer que el tamaño se adapte a la pantalla lee el tutorial que viene con el GMS; "reslolution and scalling".
1632
Preguntas y respuestas / Re:Almacenar objeto en una variable
Noviembre 04, 2014, 05:55:50 PM
Muestra el error que te aparece por favor.
1633
Preguntas y respuestas / Re:busco un engine plataforma bien preciso
Noviembre 04, 2014, 03:14:42 PM
Lo que debes hacer es guardar la posición del personaje (y demás objetos) en unas variables diferentes a xy, haciendo el movimiento sin utilizar las variables predefinidas de GM (como en tu script de plataformas). Cuando vas a dibujar el personaje asignas las variables xy redondeando las posiciones con punto flotante (función round), así el personaje queda dibujado dentro de pixeles enteros.
1634
Preguntas y respuestas / Re:Error que me extraña con un scrips en draw
Noviembre 04, 2014, 03:04:39 PM
Ya encontré el problema, la condición en el if debe ser así:
[gml]
if mouse_x > x and mouse_x < (x+sprite_width) and mouse_y > y and mouse_y < (y+sprite_height)
[/gml]
[gml]
if mouse_x > x and mouse_x < (x+sprite_width) and mouse_y > y and mouse_y < (y+sprite_height)
[/gml]
1635
Preguntas y respuestas / Re:Crear instancias usando variables
Noviembre 03, 2014, 07:08:53 AM
Hola. El mensaje de error aparece porque en la función "instance_create" estás usando una variable de tipo cadena (string) para indicar el objeto, cuando debe ser de tipo entero (si te fijas en la penúltima linea dice "illegal type").
Lo mejor sería leer un número desde el archivo ini y después usar una estructura "switch-case":
[gml]
p1 = ini_read_real( "Planetas", "p1tipo", 0 );
switch( p1 )
{
case 1: instance_create( Player.x, Player.y, obj_planeta_1 ); break;
case 1: instance_create( Player.x, Player.y, obj_planeta_2 ); break;
//...
default: instance_create( Player.x, Player.y, obj_planeta_0 );
}
[/gml]
Lo mejor sería leer un número desde el archivo ini y después usar una estructura "switch-case":
[gml]
p1 = ini_read_real( "Planetas", "p1tipo", 0 );
switch( p1 )
{
case 1: instance_create( Player.x, Player.y, obj_planeta_1 ); break;
case 1: instance_create( Player.x, Player.y, obj_planeta_2 ); break;
//...
default: instance_create( Player.x, Player.y, obj_planeta_0 );
}
[/gml]