He usado un poco el "3D animator". Sus ventajas son que no necesitas extensiones para correr las animaciones en GM, el código generado consume pocos recursos y puede convertir varios formatos. Las desventajas son que las piezas no se interconectan, en realidad no se anima un esqueleto, se animan piezas separadas, y el proceso de animación es bastante tardado.
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.
1141
Preguntas y respuestas / Re:Cual es el DLL para leer animaciones de personajes ???
Septiembre 25, 2015, 04:23:09 AM1142
Preguntas y respuestas / Re:(ayuda) Torreta que apunta y dispara a diversos enemigos.
Septiembre 24, 2015, 07:55:55 PM
Puedes usar este código para rotar suavemente
[gml]
///Rotar
d = point_direction( x,y, EnemigoFijado.x,EnemigoFijado.y ); //calcular dirección
d = angle_difference( image_angle, d ); //diferencia de ángulos
image_angle += min(abs(d), VelocidadDeRotacion )*sign(d); //rotar
[/gml]
está basado en el ejemplo que aparece en la ayuda de la función angle_difference, debes cambiar VelocidadDeRotacion por el que valor que quieras. Sería conveniente escribir el código anterior en un script para usarlo como se muestra a continuación.
Para fijar un sólo enemigo mientras esté en el rango de alcance se me ocurre esto. Primero creamos la variable EnemigoFijado en el evento Create
[gml]
EnemigoFijado = noone;
[/gml]
Después, en el evento Step, se hace lo siguiente
[gml]
if instance_exists(EnemigoFijado) //si hay objetivo y no se ha destruido
{
d = point_distance( x,y, EnemigoFijado.x,EnemigoFijado.y ); //calcular distancia
if( d <= RangoDeDeteccion ) Rotar(); //si está en el rango de detección, rotar
else //si el enemigo ha salido del rango de detección
EnemigoFijado = noone; //fijar nada
}
else //si no hay enemigo fijado o se ha destuido
{
EnemigoCercano = instance_nearest(x,y,obj_enemigo); //buscar el más cercano
if instance_exists(EnemigoCercano) //si existe
{
d = point_distance( x,y, EnemigoCercano.x,EnemigoCercano.y ); //calcular distancia
if( d <= RangoDeDeteccion ) //si está en el rango de detección
{
EnemigoFijado = EnemigoCercano; //fijar objetivo
Rotar();
}
}
}
[/gml]
es necesario cambiar RangoDeDeteccion por un valor adecuado.
[gml]
///Rotar
d = point_direction( x,y, EnemigoFijado.x,EnemigoFijado.y ); //calcular dirección
d = angle_difference( image_angle, d ); //diferencia de ángulos
image_angle += min(abs(d), VelocidadDeRotacion )*sign(d); //rotar
[/gml]
está basado en el ejemplo que aparece en la ayuda de la función angle_difference, debes cambiar VelocidadDeRotacion por el que valor que quieras. Sería conveniente escribir el código anterior en un script para usarlo como se muestra a continuación.
Para fijar un sólo enemigo mientras esté en el rango de alcance se me ocurre esto. Primero creamos la variable EnemigoFijado en el evento Create
[gml]
EnemigoFijado = noone;
[/gml]
Después, en el evento Step, se hace lo siguiente
[gml]
if instance_exists(EnemigoFijado) //si hay objetivo y no se ha destruido
{
d = point_distance( x,y, EnemigoFijado.x,EnemigoFijado.y ); //calcular distancia
if( d <= RangoDeDeteccion ) Rotar(); //si está en el rango de detección, rotar
else //si el enemigo ha salido del rango de detección
EnemigoFijado = noone; //fijar nada
}
else //si no hay enemigo fijado o se ha destuido
{
EnemigoCercano = instance_nearest(x,y,obj_enemigo); //buscar el más cercano
if instance_exists(EnemigoCercano) //si existe
{
d = point_distance( x,y, EnemigoCercano.x,EnemigoCercano.y ); //calcular distancia
if( d <= RangoDeDeteccion ) //si está en el rango de detección
{
EnemigoFijado = EnemigoCercano; //fijar objetivo
Rotar();
}
}
}
[/gml]
es necesario cambiar RangoDeDeteccion por un valor adecuado.
1143
Preguntas y respuestas / Re:[Duda]Uso de la función place_meeting
Septiembre 24, 2015, 07:14:12 PM
Así es, detecta si dos máscaras de colisión se empalman. Una máscara es de la instancia que llama a la función y la otra es la del objeto que se pone como argumento. Las máscaras de colisión se definen en los sprites. Si los sprites tienen colisiones precisas desactivadas, la función comprueba una colisión entre dos rectángulos, en caso contrario los sprites se recorren pixel por pixel hasta encontrar un empalme.
1144
Preguntas y respuestas / Re:alguien que me explique cómo se utilizan los tiles set?
Septiembre 24, 2015, 06:47:41 PM
La resolución de las hojas de tiles deben ajustarse al tamaño de las páginas de textura, para que no se hagan demasiados cambios de página mientras corre el juego.
Las imágenes extrañas aparecen cuando la cache de GMS se corrompe, se soluciona oprimiendo el botón con forma de brocha que está en la barra de herramientas, a la izquierda del botón para crear sprite.
Las imágenes extrañas aparecen cuando la cache de GMS se corrompe, se soluciona oprimiendo el botón con forma de brocha que está en la barra de herramientas, a la izquierda del botón para crear sprite.
1145
Preguntas y respuestas / Re:(ayuda) Torreta que apunta y dispara a diversos enemigos.
Septiembre 23, 2015, 09:02:07 PM
En el primer bloque de código se ve que la torreta es creada por otro objeto y se asignan dos variables, el problema es que esas variables no se asignan a la torreta, sino al objeto que la crea, por eso aparece el error. El código debería ser así:
[gml]
with instance_create( x,y, obj_torreta_base1 )
{
EnemigoFijado = 0;
image_angle = 90;
}
[/gml]
En el segundo bloque sería más fácil usar la función instance_nearest, ejemplo:
[gml]
Enemigo = instance_nearest( x,y, obj_enemigo_terrestre1 );
if( Enemigo <> noone )
if( point_distance(x,y,Enemigo.x,Enemigo.y) < 100 )
image_angle = point_direction( x,y, Enemigo.x,Enemigo.y );
[/gml]
[gml]
with instance_create( x,y, obj_torreta_base1 )
{
EnemigoFijado = 0;
image_angle = 90;
}
[/gml]
En el segundo bloque sería más fácil usar la función instance_nearest, ejemplo:
[gml]
Enemigo = instance_nearest( x,y, obj_enemigo_terrestre1 );
if( Enemigo <> noone )
if( point_distance(x,y,Enemigo.x,Enemigo.y) < 100 )
image_angle = point_direction( x,y, Enemigo.x,Enemigo.y );
[/gml]
1146
Preguntas y respuestas / Re:[Ayuda]Función para que un sonido se detenga gradualmente
Septiembre 23, 2015, 08:44:28 PM
La función de :GM8: es sound_fade()
y su equivalente en :GMS: es audio_sound_gain()
y su equivalente en :GMS: es audio_sound_gain()
1147
Preguntas y respuestas / Re:Problema con Colisiones
Septiembre 21, 2015, 03:50:34 PM1148
Preguntas y respuestas / Re:objeto vida
Septiembre 19, 2015, 07:55:21 PM
Aquí hay unos temas parecidos:
http://www.comunidadgm.org/preguntas-y-respuestas/recordar-objetos-encontrados-segun-nivel-(solucionado)/msg113643/#msg113643
http://www.comunidadgm.org/preguntas-y-respuestas/crear-una-global-por-instancia/
Si sólo quieres guardar el estado de una habitación, te puede servir el ejemplo de 3dgeminis, si quieres guardar el estado de varias habitaciones, usa el ejemplo del segundo enlace.
Lo anterior es algo complicado, lo más sencillo sigue siendo lo que mencionó Guacusio, usar "jump to satart". Para que funcione no debes resetear la room.
http://www.comunidadgm.org/preguntas-y-respuestas/recordar-objetos-encontrados-segun-nivel-(solucionado)/msg113643/#msg113643
http://www.comunidadgm.org/preguntas-y-respuestas/crear-una-global-por-instancia/
Si sólo quieres guardar el estado de una habitación, te puede servir el ejemplo de 3dgeminis, si quieres guardar el estado de varias habitaciones, usa el ejemplo del segundo enlace.
Lo anterior es algo complicado, lo más sencillo sigue siendo lo que mencionó Guacusio, usar "jump to satart". Para que funcione no debes resetear la room.
1149
Preguntas y respuestas / Re:Pantalla Debug
Septiembre 15, 2015, 05:36:22 PM
Otra opción es la siguiente, sin embargo lo que menciona Guacusio me parece mejor.
[gml]
///Evento Game Start
global.debug = false;
instance_create( x,y, obj_debug );
[/gml]
[gml]
///Evento Step
if keyboard_check_pressed( vk_f3 ) //al presionar F3
{
if( global.debug ) { //si debug está activado
instance_deactivate_object( obj_debug );
global.debug = false; //desactivar
}
else { //si no está activado
instance_activate_object( obj_debug );
global.debug = true; //activar
}
}
[/gml]
El código debe ir en un objeto diferente a obj_debug.
Si sólo quieres depurar en Windows, puedes usar el debugger integrado en GMS.
Haciendo una optimización, en lugar de crear la variable activo se puede usar la variable visible, que todas las instancias tienen por defecto, entonces se sólo se tiene que poner una línea en el evento Press F3
[gml]
visible = !visible;
[/gml]
[gml]
///Evento Game Start
global.debug = false;
instance_create( x,y, obj_debug );
[/gml]
[gml]
///Evento Step
if keyboard_check_pressed( vk_f3 ) //al presionar F3
{
if( global.debug ) { //si debug está activado
instance_deactivate_object( obj_debug );
global.debug = false; //desactivar
}
else { //si no está activado
instance_activate_object( obj_debug );
global.debug = true; //activar
}
}
[/gml]
El código debe ir en un objeto diferente a obj_debug.
Si sólo quieres depurar en Windows, puedes usar el debugger integrado en GMS.
Haciendo una optimización, en lugar de crear la variable activo se puede usar la variable visible, que todas las instancias tienen por defecto, entonces se sólo se tiene que poner una línea en el evento Press F3
[gml]
visible = !visible;
[/gml]
1150
Preguntas y respuestas / Re:Views zoom
Septiembre 15, 2015, 07:05:41 AM
Hacer el efecto zoom es la parte sencilla, el verdadero problema sería determinar el momento en que se aplica.
Por ejemplo, se podría revisar la distancia con el piso y hacer que esa distancia sea proporcional al zoom (o a las dimensiones de la view). Si saltas hacia una plataforma más elevada la distancia cambia bruscamente, entonces es necesario usar una función de interpolación para que el zoom cambie lentamente, como mencionó penumbra. Si saltas hacia un precipicio, es posible que no haya piso, o que el piso esté muy abajo, entonces hay que determinar un límite para la distancia a la que se va a buscar el piso, de lo contrario el zoom sería exagerado y los objetos se verían extremadamente pequeños.
Otra opción sería calcular el zoom de acuerdo a la velocidad vertical del personaje, en este caso también se necesita limitar el zoom cuando la velocidad es muy grande, y usar interpolación para que el zoom cambie gradualmente.
Después muestro unos códigos.
Por ejemplo, se podría revisar la distancia con el piso y hacer que esa distancia sea proporcional al zoom (o a las dimensiones de la view). Si saltas hacia una plataforma más elevada la distancia cambia bruscamente, entonces es necesario usar una función de interpolación para que el zoom cambie lentamente, como mencionó penumbra. Si saltas hacia un precipicio, es posible que no haya piso, o que el piso esté muy abajo, entonces hay que determinar un límite para la distancia a la que se va a buscar el piso, de lo contrario el zoom sería exagerado y los objetos se verían extremadamente pequeños.
Otra opción sería calcular el zoom de acuerdo a la velocidad vertical del personaje, en este caso también se necesita limitar el zoom cuando la velocidad es muy grande, y usar interpolación para que el zoom cambie gradualmente.
Después muestro unos códigos.
1151
Preguntas y respuestas / Re:Saber el numero de lineas de un texto
Septiembre 13, 2015, 07:22:41 PM
Falta una diagonal en el nombre de archivo
[gml]
fname = working_directory + "\sub.txt";
[/gml]
[gml]
fname = working_directory + "\sub.txt";
[/gml]
1152
Preguntas y respuestas / Re:Saber el numero de lineas de un texto
Septiembre 13, 2015, 04:19:32 PM
No existe una función especial para eso. Puedes usar un script como el siguiente:
[gml]
archivo = file_text_open_read( "nombre" ); //abrir archivo
lineas = 0; //inicializar contador
while !file_text_eof( archivo ) //mientras no se alcance el final del archivo
{
lineas ++; //incrementar contador
file_text_readln( archivo ); //saltar línea
}
//file_text_close( archivo ); //opcional
[/gml]
al final la variable lineas contiene el resultado.
[gml]
archivo = file_text_open_read( "nombre" ); //abrir archivo
lineas = 0; //inicializar contador
while !file_text_eof( archivo ) //mientras no se alcance el final del archivo
{
lineas ++; //incrementar contador
file_text_readln( archivo ); //saltar línea
}
//file_text_close( archivo ); //opcional
[/gml]
al final la variable lineas contiene el resultado.
1153
Preguntas y respuestas / Re:Shader psicodelico / Variables en shaders
Septiembre 11, 2015, 07:31:26 PM
Se ve que ese shader hace una rotación del matiz (shift hue). Aquí hay uno para GMS: https://www.youtube.com/watch?v=or6PHqBblGk. Con la imagen que tiene cargada no se aprecia bien, tiene colores muy planos, es mejor cambiarla por una fotografía. Además el cambio de matiz es muy lento, ve al evento Draw y cambia el número 50 por uno menor, por ejemplo 2. Ese valor (image_index/2) se puede asignar a una variable y usar esa variable como argumento, de esa forma se puede cambiar desde cualquier objeto. En este caso los valores del matiz van desde 0 hasta 255, un valor de 256 equivale a 0, el ciclo se repite.
1154
Preguntas y respuestas / Re:¿Cómo hago para que el 'player' del juego choque con lo que has pintado?
Septiembre 05, 2015, 01:24:06 AM
En vez de arreglos, se puede usar una path, como en el script que hice. Y adjunto otro ejemplo que te puede servir (no lo hice yo).
1155
Preguntas y respuestas / Re:Al usar comando 3D, pasa a ser un espejo.
Septiembre 01, 2015, 04:37:44 PM
Te falta establecer una proyección en el evento Draw con d3d_set_projection o sus variantes.