Mostrar Mensajes

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.

Mensajes - Clamud

1141
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.
1142
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.
1143
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
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.
1145
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]
1146
La función de :GM8: es sound_fade()
y su equivalente en :GMS: es audio_sound_gain()
1148
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.
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]
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.
1151
Falta una diagonal en el nombre de archivo
[gml]
fname = working_directory + "\sub.txt";
[/gml]
1152
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.
1153
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
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
Te falta establecer una proyección en el evento Draw con d3d_set_projection o sus variantes.