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

1156
Siempre se tiene que definir la textura a partir de un background o sprite, los modelos de GM no guardan la textura con la que fueron diseñados, sólo almacenan las coordenadas dentro de la textura, eso simplifica la tarea de cambiar la textura de un modelo dentro del juego, pero complica la aplicación de varias texturas al modelo.

Sobre los programas, puedes usar prácticamente cualquier software de modelado en 3D, y después usar un convertidor para pasar los modelos al formato compatible con GM, o usar una extensión que permita importar un formato diferente, todo eso lo puedes encontrar la GameMakerComunity. Creo que esto ya se ha preguntado antes, usa el buscador para encontrar sugerencias de programas; algunos son Wings 3d y Sketchup.
1157
Lo más fácil es usar la acción Step Avoid, que está en la pestaña Move.
1158
Preguntas y respuestas / Re:duda ansi_char(val);
Agosto 25, 2015, 11:10:18 PM
Para concatenar usa el operador +
[gml]
cadena = "a"+"a"+"a";
cadena = ansi_char(97)+ansi_char(97)+ansi_char(97);
[/gml]
las dos líneas generan la cadena "aaa".
1159
Los dos devuelven el tiempo que ha pasado desde que se inició el juego, pero current_time lo devuleve en mili segundos y get_timer en micro segundos. Es decir, al pasar 1 segundo, con el primero se obtiene 1000 y con el segundo 1000000.
1160
En GML
[gml]
if( xx >= 90 and xx <= 180 )
{
    // ...
}
[/gml]
Con acciones puedes usar Test expression y escribir lo de arriba, o usar dos acciones Test variable.
1162
Que bien, con cada actualización se ve mejor.

Es buena idea la del cronómetro, pero prefiero que no sea configurable, en vez de eso, que inicie desde cero al oprimir el botón mezclar y termine de contar al completar el rompecabezas. Los puntos, premios o records se calcularían tomando en cuenta el tiempo y la cantidad de piezas.

Ya revisé los bugs que mencionaste hace tiempo:
Para que la pieza no se quede pegada al puntero, cambia el evento del botón mezclar por Left Pressed. Sería conveniente cambiar el evento en todos los botones.
El problema de congelamiento sucede siempre que se usa un 2 como cantidad de piezas, ya sea horizontal o vertical, y se debe a que el ciclo para asignar las variables xfinal y yfinal trata de encontrar un lugar donde la pieza no se salga de la ventana y no esté dentro del marco, como la pieza es muy grande nunca se encuentra. Una solución es hacer el marco más pequeño, otra es nunca usar el número 2, y otra es crear otro algoritmo.

Para jugar con imágenes previamente cargadas no hay que cambiar mucho código, sólo hay que agregar los objetos correspondientes al menú de selección de imágenes, eso dependerá del diseño del menú, ¿qué propuestas tienes?
1163
Al probar en GMS noté un comportamiento extraño: algunas veces se muestra parte del fondo, y parece que ese resultado cambia dependiendo de la versión de GMS. Para solucionarlo he invertido el orden de dibujo y el "modo de mezcla"
[gml]
///Metodo 2

if( not surface_exists(sf) ) //si superficie borrada
sf = surface_create(w,h); //crear otra vez

surface_set_target( sf ); //dibujar en superficie
draw_clear_alpha(0,0); //superficie transparente
draw_sprite( sprite_index, image_index, 0,0 ); //sprite

//Los sectores no aportan color (bm_zero), pero
// multiplican los colores del sprite (bm_src_colour)
draw_set_blend_mode_ext( bm_zero, bm_src_color );
a += 2; //incrementar angulo principal

//dibujar primer sector
draw_set_color( c_red );
dibujar_sector( w2,h2,r, a,a+45,10, false );

//dibujar segundo sector
draw_set_color( c_blue );
dibujar_sector( w2,h2,r, a+90,a-45,10, false );

//volver a la normalidad
draw_set_blend_mode( bm_normal );
surface_reset_target();
[/gml]
1164
Hice un script para dibujar ese tipo de figuras, llamadas sectores circulares, usando pr_trianglefan como mencionó Guacusio.
[spoiler=dibujar_sector]
[gml]
///dibujar_sector( x,y,r, a1,a2,a3, contorno );
/*                 0 1 2  3  4  5   6
DIBUJAR UN SECTOR CIRULAR
Dibuja un sector circular con vertice en (x,y), el vertice
es el centro del circulo, con radio r. El area dibujada va
desde el angulo 1 (a1) hasta el angulo 2 (a2), en el sentido
contrario a las manecillas del reloj, en incrementos iguales
al angulo 3 (a3). Si se intercambian los valores de a1 y a2
el sector resultante es el conjugado del primero.

Argumentos
    x,y: vertice del sector
    r: radio
    a1: angulo inicial
    a2: angulo final
    a3: angulo incremento (precision)
    contorno: dibujar solo contorno o llenar poligono
   
Devuelve: nada
*/
var xx, yy, r, a1, a2, a3, i;
xx = argument0; //vertice
yy = argument1;
r  = argument2; //radio

a1 = argument3; //angulo inicial
a2 = argument4; //angulo final
while( a1 >= a2 ) a2 += 360; //evitar sectores mayores
while( a2-a1 > 360 ) a1 += 360; // a 360 grados

if( argument5 == 0 ) a3 = 10; //la precision debe
else a3 = abs(argument5); // ser mayor a cero

//iniciar primitivas (contorno o lleno)
if( argument6 ) draw_primitive_begin( pr_linestrip );
else draw_primitive_begin( pr_trianglefan );

draw_vertex( xx, yy ); //primer vertice
while( a2 > a1 ) //hacer un barrido desde a2 hasta a1
{
    draw_vertex(
    xx + lengthdir_x(r,a2),
    yy + lengthdir_y(r,a2) );
    a2 -= a3;
}
draw_vertex( //vertice en a1
xx + lengthdir_x(r,a1),
yy + lengthdir_y(r,a1) );

if( argument6 ) draw_vertex( xx, yy ); //vertice final
draw_primitive_end();
[/gml]
[/spoiler]

El sprite y el sector circular se pueden combinar de muchas formas, pero si quieres obtener el mismo color que se obtiene con image_blend se puede usar el siguiente método. Antes se debe crear una superficie.
[gml]
surface_set_target( sf ); //dibujar en superficie
draw_clear( c_white ); //blanco solido

//dibujar sector
draw_set_color( c_red );
dibujar_sector( w2,h2,r, a1,a2,10, false );

//los colores del sprite se multiplican
// por el color de fondo (bm_dest_color)
// y el fondo se elimina (bm_zero)
draw_set_blend_mode_ext( bm_dest_color, bm_zero );
draw_sprite( sprite_index, image_index, 0,0 );

//volver a la normalidad
draw_set_blend_mode( bm_normal );
surface_reset_target();
[/gml]

Hay un ejemplo adjunto.
1165
En un evento de presión de botón cambia la velocidad horizontal
[gml]
hspeed = 2;
[/gml]
¿Eso es todo o quieres programar un comportamiento especial?
1166
Las variables normales no se pueden eliminar, sólo se eliminan las que son declaradas con la palabra var o van precedidas con local., esas variables se eliminan al terminar el bloque de código en el que se declaran. Si sólo son unas decenas de variables la memoria que usan es muy poca, no debería afectar el rendimiento. Otra opción es meter los valores en estructuras de datos, como ds_maps o ds_lists, que si se pueden borrar.
1167
¿Cómo es que colapsa? Hice pruebas y parece que funciona normalmente.
Después reviso los otros bugs.
1168
Preguntas y respuestas / Re:Lio con los mandos.
Agosto 15, 2015, 03:36:18 PM
Las funciones para leer los ejes también me devuelven -0.1, yo creo que es un error de GameMaker, o incompatibilidad con el controlador del mando.
Como mencioné en un mensaje previo, una solución es programar una zona muerta: hasta que se rebasa un umbral alrededor del centro de la palanca se detecta como desplazada.
He implementado dos formas diferentes para hacer la zona muerta, voy a mostrar la que parece más apropiada para tu caso:
[gml]
ejex = joystick_xpos(0); //leer ejex
ejey = joystick_ypos(0); //leer ejey
d = point_distance( 0,0, ejex, ejey ); //desplazamiento de la palanca

if( d < umbral ) { //si no se rebasa el umbral
ejex = 0; //es como si no
ejey = 0; // estuviera desplazada
}

if( d > 1 ) { //si el desplazamiento es mayor a 1
    ejex /= d; //reducir el desplazamiento para tener la
    ejey /= d; // misma velocidad en cualquier direccion
}
[/gml]

El movimiento de la nave se haría de esta forma (en Step):
[gml]
x += rapidez * ejex;
y += rapidez * ejey;
[/gml]

He notado que la función joystick_exists es lenta, no debería usarse en cada Step.
1169
Puedes revisar si todas las variables del ini existen con ini_key_exists; si una no existe se escribe con el valor por defecto.
Otra opción es leer todas las variables del ini, borrar el archivo y exportar el que se encuentra en Included Files, después escribir las variables guardadas en el nuevo archivo. Este método serviría principalmente para mantener el diseño del archivo (sangrías, espacios, saltos de linea).
1170
Si usas GMS, ve a la pestaña Import que aparece al iniciar GMS, o selecciona Import en el menú File. En tipo de archivo o filtro selecciona .gm81