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 - bygdle

316
Preguntas y respuestas / Re:Tengo un par de problemillas...
Septiembre 11, 2017, 02:19:42 AM
¿O sea, que la animación de caminar del personaje, son solamente las subimágenes 0 y 1? ¿o todas las subimágenes del sprite forman la animación del personaje?

Te explico el código:
Cita de: NiuWeb en Septiembre 11, 2017, 01:39:39 AM
[gml]
///Evento create
velocidadY = 0; //La velocidad de caída
gravedadY  = 1; //La gravedad
[/gml]
Aquí simplemente declaro dos variables: velocidadY será la velocidad vertical, y gravedadY será la gravedad, es decir, una aceleración para velocidadY. Esto significa que cada fotograma se le sumará gravedadY a velocidadY.

Cita de: NiuWeb en Septiembre 11, 2017, 01:39:39 AM
[gml]
///Evento step
repeat(abs(velocidadY)) //Ciclo para comprobación pixel-perfect
{
    if(place_free(x, y + sign(velocidadY))) //Si no hay nada un pixel abajo
        y += sign(velocidadY); //Moverse un pixel
    else //De lo contrario
    {
        velocidadY = 0; //Frenar velocidad
        break; //Detener el ciclo
    }
}
velocidadY += gravedadY; //Aceleración
[/gml]
Comencemos con el repeat: Éste es un ciclo, de la forma repeat(n){acciones;}. Permite ejecutar una serie de acciones en el mismo fotograma n veces.

el sign(velocidadY) devuelve 0, 1 o -1 dependiendo de la dirección de la velocidad. Si la velocidad va hacia arriba (velocidadY negativa), devuelve -1. Si es hacia abajo (velocidadY positiva) devuelve 1... Cuando velocidadY es 0 el ciclo simplemente no se ejecuta.

Esto con el fin de ir comprobando pixel por pixel hacia abajo o hacia arriba (dependiendo de la velocidad), para evitar que el juegador se atasque en los sólidos, y después moverse pixel por pixel en dicha dirección gracias al ciclo.

El velocidadY += gravedadY es la aceleración, lo que mencioné arriba.

Por cierto, ten cuidado con la máscara de colisión del jugador. Hazla rectangular y pon las coordenadas del sprite justo en medio de ella.
317
Preguntas y respuestas / Re:Tengo un par de problemillas...
Septiembre 11, 2017, 01:39:39 AM
Varias cositas:

[spoiler=cosita 1]En el código de la tecla derecha, esta parte:
[gml]
image_index = 1
image_index = 0   
[/gml]
No tiene absolutamente ninguna función. ¿Qué intentas hacer?[/spoiler]

[spoiler=cosita 2]En el mismo código, esta parte:
[gml]
if vk_left
{
    speed = 0
}
[/gml]
Supongo que quieres comprobar si se presiona la tecla izquierda, pero esa no es la forma. La keyword vk_left es una constante de valor 37, por lo que básicamente estás escribiendo esto:
[gml]
if 37
{
    speed = 0
}
[/gml]
Condición que siempre se ejecutará. Además, estás realizando el movimiento horizontal directamente de la variable x, por lo que es mejor no tocar speed (terminaría afectando el movimiento vertical).

En todo caso, tendrías que comprobar algo así:
[gml]
if keyboard_check(vk_left)
{
    //Lo que necesites
}
[/gml][/spoiler]

[spoiler=cosita 3]
Cuando dices:
Cita de: LorenzoRD en Septiembre 11, 2017, 01:22:23 AM
Genial. Ahora a hacer los objetos invisibles sólidos. Luego de esto, lo que ocurre es que quiero ponerlos de color para asegurarme de donde están, cambio el sprite, todo bien. Ahora viene el problema y es que al presionar las flechas solamente se gira el personaje (lo del x_scale) pero no se mueve.

Digo "bueno, no hay problema, debe ser el color del sprite" pero, curiosamente, al ponerlo con el sprite invisible, directamente el personaje se va para abajo, ignorando la colisión del objeto.

He llegado a estas suposiciones, que el primer error es que toma el objeto sólido de abajo como la colisión (dejo screenshot de la room), pero al segundo no, ya que no hubo ninguna diferencia entre las propiedades de los sprites.
Entiendo que tienes dos sprites: Uno con color (rojo, según la imagen) y otro... ¿vacío? Si es así, entonces ahí está el problema: Un sprite vacío no tiene máscara de colisión. Mejor simplemente deja el sprite rojo, y cuando quieras que en juego no se vean las instancias, desmárcale la opción visible al objeto.

Así, podrás ver las instancias del objeto suelo en el editor de salas, pero no durante el juego.
[/spoiler]

[spoiler=cosita 4]
Sólo un consejo: se supone que una caída vertical es acelerada, por lo que se vería bien que añadieras una "gravedad" a dicho movimiento.
[/spoiler]

EDIT:
Vi que te surgió un nuevo problema, y con él, de una vez te ayudo con la cuarta nota que te dije antes:
[gml]
///Evento create
velocidadY = 0; //La velocidad de caída
gravedadY  = 1; //La gravedad
[/gml]
[gml]
///Evento step
repeat(abs(velocidadY)) //Ciclo para comprobación pixel-perfect
{
    if(place_free(x, y + sign(velocidadY))) //Si no hay nada un pixel abajo
        y += sign(velocidadY); //Moverse un pixel
    else //De lo contrario
    {
        velocidadY = 0; //Frenar velocidad
        break; //Detener el ciclo
    }
}
velocidadY += gravedadY; //Aceleración
[/gml]
No entendí lo que quieres hacer con las escaleras.
318
Preguntas y respuestas / Re:Regeneración general
Septiembre 10, 2017, 06:11:57 AM
Puedes usar alarmas, y simplemente comprobar que la vida sea menor a 18 antes de regenerarle.
[gml]
///Evento create
global.vidab = 18; //Esta es la vida original, no debe modificarse en juego.
global.vida  = global.vidab; //Esta es la vida que se modificará en el juego
regenerador  = 1;
alarm[0] = room_speed; //Activar una alarma para regenerar cada segundo.
[/gml]
[gml]
///Evento alarm 0
alarm[0] = room_speed;
if(global.vida <= (global.vidab - regenerador)) //Si tiene menos vida de la original (vida máxima)
{
    global.vida += regenerador;
}
[/gml]
Obviamente, si ya tienes utilizando la alarma 0, debes usar otra.
319
Al iniciar el fade out, debes desactivar el fade in:
[gml]
///Create Event
fadein  = true;
fadeout = false;
alpha = 0;

///Step Event
if (fadein)
{
    alpha += 0.01;
    if alpha >= 1
    {
        fadeout = true;
        fadein  = false;
    }
}

if (fadeout)
{
    alpha -= 0.01
    if alpha <= 0
    {
        instance_destroy()
    }
}

///////////////Draw Event:
draw_text_transformed_color(90, room_height / 2, "Dungeon", 1, 1, 0, c_red, c_red, c_yellow, c_yellow, alpha);
draw_set_font(font_scene)
[/gml]
320
Desarrollo de Scripts / Obtener números primos.
Septiembre 09, 2017, 06:27:09 PM
Autor: NiuWeb.
Versión de GM: Studio 1.4.
Descripción: Obtiene un número primo en la posición dada.
[gml]
///prime_number(pos);
var pos = round(argument0);
var con = 0;
var num = 1;
var prm = true;

while(con < pos)
{
    prm = true;
    for(var i = 2; i < num; i++)
    {
        if(num % i == 0)
        {
            prm = false;
            break;
        }
    }
    if(prm) con++;
    num++;
}
return num - 1;
[/gml]
El único argumento es la posición del número primo a obtener.

Ejemplo:
[gml]
txt = "";
for(var i = 1; i <= 10; i++)
    txt += string(prime_number(i)) + "#";
show_message(txt);
[/gml]
Muestra lo siguiente:
321
Autor: NiuWeb.
Versión de GM: Studio 1.4.
Descripción: Crea una cadena de texto a partir de el arreglo y las propiedades dadas.
[gml]
///parse_array(array1d, open, pattern, separator, close)
var array     = argument0;
var opens     = argument1;
var pattern   = argument2;
var separator = argument3;
var close     = argument4;

var arrlen = array_length_1d(array);

var text, part;
var result = "";

for(var i = 0; i < arrlen; i++)
{
    text = string(array);
    part = split(pattern, "$n");
    parl = array_length_1d(part);
    for(var j = 0; j < parl; j++)
    {
        result += part[j];
        if(j < parl - 1) result += text;
    }
   
    if(i < arrlen - 1) result += separator;
}
return opens + result + close;
[/gml]
Para funcionar, este script requiere de éste: split()

Uso:
El argumento array1d es el arreglo original a convertir.

El argumento open es la cadena de texto que estará al inicio.

El arumento pattern es el que permite definir cómo se imprimirán los valores del arreglo. Se usa "$n" como base para insertarlos.

El argumento separator es un separador entre valores. No se inserta al final del último valor.

El argumento close es la cadena de texto que estará al final.

Ejemplo:
[gml]
arreglo[0] = "Elefante";
arreglo[1] = "Avestruz";
arreglo[2] = "Tiburón";
arreglo[3] = "Cocodrilo";

txt = parse_array(arreglo, "{", '"$n"', ",", "}");
show_message(txt);
[/gml]
Se muestra el siguiente mensaje:
322
Autor: NiuWeb.
Versión de GM: Studio 1.4.
Descripción: Crea un arreglo numérico a partir de los valores dados. Estos pueden ser secuencias numéricas (ver más adelante) para facilitar la creación del arreglo.
[gml]
///create_numarray(value0, ..., value16);
var result, index = 0;

var i, j, arg, nbp, scp;
for(i = 0; i < argument_count; i++)
{
    arg = string(argument);
    arg = string_replace_all(arg, " ", "");
    nbp = string_pos(":", arg);
    scp = string_pos("*", arg);
   
    if(nbp)
    {
        num1 = real(string_copy(arg, 1, nbp - 1));
       
        if(scp)
        {
            num2 = real(string_copy(arg, nbp + 1, scp - nbp - 1));
            num3 = abs(real(string_delete(arg, 1, scp)));
        }
        else
        {
            num2 = real(string_copy(arg, nbp + 1, string_length(arg) - nbp + 1));
            num3 = 1;
        }
           
       
        if(num3 == 0) num3 = 1;
       
        move = sign(num2 - num1);
       
        if(move == 0)
        {
            result[index++] = num1;
            continue;
        }
        else if(move == 1)
        {
            for(j = num1; j <= num2; j += num3)
            {
                result[index++] = j;
            }
        }
        else if(move == -1)
        {
            for(j = num1; j >= num2; j -= num3)
            {
                result[index++] = j;
            }
        }
    }
    else
        result[index++] = real(arg);
}
return result;
[/gml]
Uso:
La forma normal es crear el arreglo insertando como argumentos los números que se deseen guardar en él:
[gml]
arreglo = create_numarray(3, 7, 12.5, 4.11, 0.91); //etc...
[/gml]
Además, se pueden añadir (como cadena de texto) patrones sencillos para crear secuencias de números. La forma de estos patrones es min:max*step, donde min es el límite menor de la secuencia, max el mayor y step el aumento. Si min es mayor que max, se creará la secuencia en reversa. Si no se escribe el step (sólo min:max), el valor por defecto será 1.
[gml]
arreglo = create_numarray("2:8"); //2, 3, 4, 5, 6, 7, 8
arreglo = create_numarray("5.5:9*0.25"); //5.5, 5.75, 6, 6.25, 6.5, 6.75, 7, 7.25, 7.5, 7.75, 8, 8.25, 8.5, 8.75, 9
arreglo = create_numarray("11:-5*2"); //11, 9, 7, 5, 3, 1, -1, -3, -5
arreglo = create_numarray(1, 3, 5, "6:9"); //1, 3, 5, 6, 7, 8, 9
[/gml]
323
¿Usas código o acciones DnD?
Si el juego es de plataformas, ¿cuál es el valor de la gravedad?
324
La cosola de GM:S, donde se ve el registro de compilación; no en el juego.
325
Hasta aquí escribo, que ni te hayas tomado la molestia de pensar por qué la imagen que puse tiene un rectángulo rojo apuntando a algún signo por ahí hace ver que esto es una pérdida de tiempo, y si hubieras leído la documentación sabrías qué es el signo de interrogación.
326
¿pero qué se imprime en la consola?
327

¿Así tienes tu código en el proyecto?

Los mapas son muy eficientes, mírale la lógica al código antes de decir que son malos.
328
El código no hace nada distinto, era para que mirases los valores que imprimen en consola.
Además, la disminución de tiempo es de 1s por cada 60steps, mientras que en la colisión aumenta 30s en 1step, no deberían anularse, para eso son los debugs, para ver lo que realmente sucede.
329
Pero a ver, sé específico.
¿No corre? ¿Muestra un error o simplemente no se ejecuta nada? ¿Usas GM:S?

Y te puse ese código porque lo creo más intuitivo, más legible y más fácil de modificar.
http://docs.yoyogames.com/source/dadiospice/002_reference/data%20structures/ds%20maps/index.html
330
Pues qué optimismo tienes, no va ni una página de hilo y ya rindiéndote,  :-\

Intenta hacer pruebas en el evento de colisión, agrega un show_debug_message() antes de que le sumes al tiempo para ver qué valor imprime. Empieza haciendo eso para ubicar el error.
[gml]
show_debug_message("Original: " + string(global.tiempo));
global.tiempo += 30;
show_debug_message("nuevo: " + string(global.tiempo));

effect_create_above (ef_firework,x,y,1,c_red);
audio_play_sound (snd_Relog,50,false);
instance_destroy();
[/gml]

Y por cierto, sería bueno que agrupes el objeto bola , el objeto bola triple y bola estrella bajo un parent, para que uses un sólo evento de colisión con éste.