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

1291
Sólo coloca éste código
[gml]
if( obJugador.speed == 0 ) room_restart();
[/gml]
1292
Me refiero a hacer algo como esto: http://martincrownover.com/path-outta-space-gamemakerstudio-example-updated/
Ya lo estuve analizando un poco, y si requiere bastante trabajo, sobre todo porque hay que restringir ciertas dimensiones; como la longitud total de la serpiente y tal vez el ancho del cuerpo en cada posición, es probable que se aplique algo de Calculus.
Mientras tanto voy a estudiar el ejemplo que puse arriba. Si se me ocurre otra cosa te comento.
1293
Para hacer esa animación con eslabones y que no se noten tanto, los eslabones tendrían que ser cortos, pero al final sí se llegarían a notar. Otra método que se me ocurre es hacer la forma de la serpiente con primitivas y ponerle una textura, así no se notarían los eslabones, pero puede ser más difícil de hacer. Voy a intentar hacer un ejemplo del segundo método, espero no tardar demasiado.
1294
El único error que he encontrado es que el código está repetido dos veces, lo demás parece estar bien.
¿Cómo sabes que sólo se ejecuta el segundo caso, si los dos reproducen el mismo sonido?
1295
Mejor usa una tecla más común. Yo estoy usando un teclado en inglés y no encuentro ese código de tecla.
1296
Bajé el editable pero me apareció un error en el número de argumentos del script scr_minimapa, así que no puede probar el juego.

Yo creo que lo más fácil para evitar colisiones entre los enemigos es usar la función mp_potential_step o alguna de las variaciones que se muestran en el manual: Motion Planning. Lo importante es poner el argumento checkall como true para esquivar todos los objetos.

El inconveniente es que consume muchos recursos, ya que cuando se tienen máscaras de colisión precisas la detección de colisión se hace por pixel. Un sistema más eficiente debe usar alguna descripción geométrica para planear el movimiento, sin embargo eso resulta algo difícil de hacer. Dejo unos artículos que te pueden dar ideas:
http://es.wikipedia.org/wiki/B%C3%BAsqueda_de_ruta
http://www.comunidadgm.org/articulos/pathfinding-(programaci243n)/
http://www.gamedev.net/page/resources/_/technical/math-and-physics/simple-but-effective-collisions-part-1-radial-collision-handling-r3147

Un último comentario. Evita usar caracteres especiales (no usar vocales con tilde) en los nombres de los recursos de tu juego (ni en las variables), porque :GM8: codifica el texto y algunos caracteres no se muestran correctamente y tal vez se puede perder información.
1297
Ahora es más difícil trabajar con archivos externos, aquí puedes ver las limitaciones y las ubicaciones de los archivos externos (incluyendo archivos ini): http://docs.yoyogames.com/source/dadiospice/002_reference/file%20handling/file%20system%20limits.html
1298
El script puede ser lento porque usa la función surface_getpixel, que es una de las funciones más lentas en GM, y el tiempo se multiplica al modificar sprites grandes. Lo mejor es usar la función al inicio del juego o en las transiciones entre niveles para evitar retardos a mitad del juego.

Aquí hay otro script que es un poco más rápido, en ese sript se cambian los modos de mezcla al dibujar en superficies, y parece extraño, pero eso se hace más rápido en GM. Además el script cambia el color en todas las sub-imágenes del sprite. Hay una advertencia de bug en :GMS:, pero es completamente compatible con :GM8:

También he leído de una extensión para :GM8: que permite utilizar shaders, pero creo que eso ya es complicarse demasiado.

EDITO: Los siento, había olvidado poner el enlace: http://www.gmlscripts.com/script/sprite_replace_color
1299
Puedes revisar qué view es la que está activa, para eso está la variable (de sólo lectura) view_current. Ejemplo:
[gml]
if( view_current == 0 ) //vista 0
draw_healthbar(...); //barra del jugador 1
[/gml]
[gml]
if( view_current == 1 ) //vista 1
draw_healthbar(...); //barra del jugador 2
[/gml]
1300
Preguntas y respuestas / Re:Gusano
Mayo 02, 2015, 07:14:37 PM
El problema es que a todos las instancias se les asigna la misma velocidad, por eso no se ajustan a la path.
Resolví el problema asignando valores a la variable path_position. El paso más importante es obtener la relación del diámetro del objeto entre la longitud de la ruta, esa relación se resta a la posición de los objetos colindantes. Y se toman algunas consideraciones para que el valor de path_position siempre esté entre 0 y 1.
El ejemplo está adjunto.
1301
¿Te refieres a que se acceda a la variable por medio de una cadena?
Lo único que se me ocurre es usar ds_maps, en los que se pueden definir "llaves" que pueden ser cadenas o números reales y asignarles valores que también pueden ser cadenas o reales. Ejemplo:
[gml]
//Crear mapa
b = ds_map_create();

//Asignar valores
a = 10;
b[?a] = 20.3;
b[?"entero"] = 7;
b[?"cadena"] = "hola";

//Leer valores
valor = b[?10];
digito = b[?"entero"];
palabra = b[?"cadena"];
[/gml]
1302
Uno de los detalles que hay que tomar en cuenta es que el script ya ocupa el número máximo de argumentos (16 argumentos), por lo que se necesita un modo diferente de meter los datos. Una opción es usar un arreglo, pero en :GM8: los arreglos no se pueden pasar por referencia, así que la mejor opción es usar una ds_list. He modificado el script y ahora no hay límite de objetos.

Primero se debe crear una lista y agregarle los parámetros de los objetos, ejemplo:
[gml]
datos = ds_list_create();

//Primer objeto
ds_list_add( datos, parent_player); //objeto
ds_list_add( datos, c_lime);        //color
ds_list_add( datos, 1 );            //radio

//Segundo objeto
ds_list_add( datos, parent_enemy ); //objeto
ds_list_add( datos, c_red );        //color
ds_list_add( datos, 1 );            //radio

//Tercer objeto
ds_list_add( datos, parent_other ); //objeto
ds_list_add( datos, c_gray );       //color
ds_list_add( datos, 1 );            //radio
[/gml]

Después el script se debe usar con la lista como argumento, ejemplo:
[gml]
scrMinimap( 200/room_width, 0.5, c_black, 0, 0, false, true, datos );
[/gml]

Dentro del script he modificado la parte que dibuja los puntos
[gml]
// Dibujar puntos para cada objeto
draw_set_alpha(argument1)
for( i=0; i<ds_list_size(argument7)/3; i+=1 )
{
    with ds_list_find_value(argument7,i*3)
    {
        draw_set_color( ds_list_find_value(argument7,i*3+1) );
        draw_circle( view_xview[0] + argument3 + x * argument0,
                     view_yview[0] + argument4 + y * argument0,
                     ds_list_find_value(argument7,i*3+2), false)
    }
}
[/gml]

El script completo está dentro del spoiler, no lo he probado, cualquier error me avisas.
[spoiler]
[gml]
// Tyranic-Moron's Minimap Script
// Modificado por Clamud

// No hay límite de equipos
// Just credit me if you use it, and I'll be happy :)
// PM me for more help if you need it (my username is tyranic-moron)

// Para usar primero es necesario crear una lista con tres parámetros consecutivos para cada equipo, ejemplo:
/*
    datos = ds_list_create();
   
    //Primer objeto
    ds_list_add( datos, parent_player); //objeto
    ds_list_add( datos, c_lime);        //color
    ds_list_add( datos, 1 );            //radio
   
    //Segundo objeto
    ds_list_add( datos, parent_enemy ); //objeto
    ds_list_add( datos, c_red );        //color
    ds_list_add( datos, 1 );            //radio
   
    //Tercer objeto
    ds_list_add( datos, parent_other ); //objeto
    ds_list_add( datos, c_gray );       //color
    ds_list_add( datos, 1 );            //radio
*/
// después se debe proporcionar la lista como argumento, además de otros parámetros
// scrMinimap( ratio, alpha, color, xoffset, yoffset, usesprite, usepulse, lista );

// Example:
// scrMinimap(200/room_width, 0.5, c_black, 0, 0, false, true, datos );

// ratio = room to minimap ratio (use desired width / room_width) (argument0)
// alpha = alpha level for drawing (transparency) (argument1)
// color = colour of map (argument2)
// xoffset = the x-offset of the minimap (argument3)
// yoffset = the y-offset of the minimap (argument4)
// usesprite = whether or not to use a sprite (true/false) (argument5)
// usepulse = whether or not to pulse the area currently being viewed (true/false) (argument6)
// lista = indice de la lista que contiene los parámetros para los objetos (argument7)

var pulsecolor, dir, i;

draw_set_alpha(argument1)
draw_set_color(argument2)

// Draws the minimap background
if (argument5 = true) {
    if (gamemaker_registered = true) {
        draw_sprite_ext(sprMinimap, 0, view_xview[0] + argument3, view_yview[0] + argument4, argument0*room_width, argument0*room_width, 0, argument2, argument1)
    } else {
        draw_sprite(sprMinimap, 0, view_xview[0] + argument3, view_yview[0] + argument4)
    }
} else {
    draw_rectangle(view_xview[0] + argument3, view_yview[0] + argument4, view_xview[0] + argument3 + room_width * argument0, view_yview[0] + argument4 + room_height * argument0, false)
}

// Draws a rectangle on the minimap, showing the current view in the room (if argument4 = true, it will pulse as well)
if (argument6 = true) {
    if (dir = 0 or pulsecolor = 0) {
        dir = 1
        pulsecolor = 100
    }
    if (pulsecolor < 255 and dir = 1) {
        pulsecolor += 5
    } else {
        dir = 2
    }
    if (pulsecolor > 100 and dir = 2) {
        pulsecolor -= 5
    } else {
        dir = 1
    }
    if (pulsecolor = 255) {
        dir = 2
    }
    if (pulsecolor = 100) {
        dir = 1
    }
} else {
    pulsecolor = 255
}
draw_set_alpha(argument1/2)
draw_set_color(make_color_rgb(pulsecolor,pulsecolor,pulsecolor))
draw_rectangle(view_xview[0] + argument3 + view_xview[0] * argument0, view_yview[0] + argument4 + view_yview[0] * argument0, view_xview[0] + argument3 + (view_xview[0] + view_wview[0]) * argument0, view_yview[0] + argument4 + (view_yview[0] + view_hview[0]) * argument0, false)

// Dibujar puntos para cada objeto
draw_set_alpha(argument1)
for( i=0; i<ds_list_size(argument7)/3; i+=1 )
{
    with ds_list_find_value(argument7,i*3)
    {
        draw_set_color( ds_list_find_value(argument7,i*3+1) );
        draw_circle( view_xview[0] + argument3 + x * argument0,
                     view_yview[0] + argument4 + y * argument0,
                     ds_list_find_value(argument7,i*3+2), false)
    }
}

// Move view to clicked point on minimap
if ((mouse_x >= view_xview[0] + argument3 and mouse_x <= view_xview[0] + argument3 + (argument0 * room_width)) and (mouse_y >= view_yview[0] + argument4 and mouse_y <= view_yview[0] + argument4 + (argument0 * room_height)) and mouse_check_button(mb_left)) {
        view_xview[0] = ((mouse_x - view_xview[0] - argument3) / argument0) - (view_wview[0] / 2)
        view_yview[0] = ((mouse_y - view_yview[0] - argument4) / argument0) - (view_hview[0] / 2)
}

// Stops the view going outside the room
if (view_xview[0] < 0) {
    view_xview[0] = 0
}
if (view_xview[0] > room_width - view_wview[0]) {
    view_xview[0] = room_width - view_wview[0]
}
if (view_yview[0] < 0) {
    view_yview[0] = 0
}
if (view_yview[0] > room_height - view_hview[0]) {
    view_yview[0] = room_height - view_hview[0]
}
[/gml]
[/spoiler]
1303
Preguntas y respuestas / Re:ayuda en un juego 3D
Abril 30, 2015, 12:59:49 PM
¿Piensas hacer un juego parecido a Minecraft?

Para crear un cubo en una posición determinada, primero crea un modelo con las funciones d3d_model_create y d3d_model_block, entonces crea una instancia que dibuje ese modelo en las coordenadas indicadas, la forma de introducir las coordenadas va a depender de tu juego
[gml]with instance_create( x,y, obCubo ) z=128;[/gml]
Lo más sencillo es introducir las coordenadas manualmente con cajas de texto, pero si quieres que las coordenadas se asignen en base a los objetos previamente creados necesitas un buen conocimiento de GML y de geometría analítica en 3D.

Éste es un juego hecho por un usuario de la comunidad
http://www.comunidadgm.org/juegos-completos/3d-city-builder/

Y aquí está un excelente ejemplo editable de juego estilo Minecraft, sin embargo se requiere modificar algunas cosas para que funcione bien en :GM8:
http://enigma-dev.org/edc/games.php?game=65
1304
Cuando se crea el ejecutable no se guarda con la tabla de puntuaciones, cuando se pruebe en una computadora diferente empezará con una tabla vacía.
Para borrar las puntuaciones en tu máquina usa la función highscore_clear(), tal vez se puede borrar el archivo, pero no sé dónde se guardan las puntuaciones de juegos hechos con :GM8:
1305
Aquí dejo un ejemplo que, como mencionó arcangelcaos, usa una ds_list para obtener las preguntas en orden aleatorio.