Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Naitsabes0 en Septiembre 19, 2017, 05:28:40 AM

Título: Pequeña falla en este codigo [Solucionado]
Publicado por: Naitsabes0 en Septiembre 19, 2017, 05:28:40 AM
Esta pequeña falla pertenece al puzzle de colisiones (http://www.comunidadgm.org/preguntas-y-respuestas/puzzle-de-patrones-(solucionado)/) , funcionaba bien y todo, pero cuando volví a probarlo al día siguiente surgió esto.

(https://i.gyazo.com/b171f757a6eb67f4f6af39dcbac58ccd.gif)
FATAL ERROR in
action number 1
of  Step Event0
for object oPlayer:

Variable oBlockPattern.hecho(100004, -2147483648) not set before reading it.
at gml_Object_oPlayer_StepNormalEvent_1 (line 44) -                 ds_list_add(hecho, orden); //Meter el identificador en la lista, en orden de llegada.

El enlace del puzzle termina con este código.

oPlayer

STEP
[gml]
///Toooodo este código va en el step del jugador; ni más ni menos. Elimina el código antíguo y pega éste.
var vel = 5;
var hor = keyboard_check(ord("D")) - keyboard_check(ord("A"));
var ver = keyboard_check(ord("S")) - keyboard_check(ord("W"));
repeat(vel)
{
    if(place_free(x + hor, y))
        x += hor;
    else break;
}
repeat(vel)
{
    if(place_free(x, y + ver))
        y += ver;
    else break;
}
//Codigo encargado de los patrones alarma
var wall = instance_place(x, y, oBlock); //Encontrar el bloque con quien colisiona
if(instance_exists(wall)) //Si hay colisión
{
    with(wall)
    {
        if(!colliding) //Si no ha cambiado antes (para evitar parpadeo)
        {
            if(image_index == 0) //Si no está activo
                image_index = 1; //Activarlo
            else if(image_index == 1) //y viceversa
                image_index = 0;
               
            colliding = true; //Evitar nueva colisión
        }
    }
}
wall = instance_place(x, y, oBlockPattern); //Encontrar el bloque con quien colisiona
if(instance_exists(wall)) //Si hay colisión
{
    with(wall)
    {
        if(!colliding) //Si no ha cambiado antes (para evitar parpadeo)
        {
            if(image_index == 0) //Si no está activo
            {
                image_index = 1; //Activarlo
                ds_list_add(hecho, orden); //Meter el identificador en la lista, en orden de llegada.
            }
            else if(image_index == 1) //y viceversa
                image_index = 0;
               
            colliding = true; //Evitar nueva colisión
        }
    }
}
[/gml]

oBlock y oBlockPattern

CREATE
[gml]
image_speed = 0;
colliding = false;
[/gml]

STEP
[gml]
if(!place_meeting(x, y, oPlayer)) //Si no está colisionando con el jugador
    colliding = false; //Permitir colisión de nuevo
[/gml]

control

STEP
[gml]
///Y tooodo éste en el step del controlador; ni más ni menos. Borra el código antíguo y pega éste.
var completed = true; //Comenzamos pensando que todos están completos
with(oBlock)
{
    if(image_index == 0) //Si se encuentra uno incompleto
        completed = false; //No se ha completado el puzzle
}
if(completed) //Si se ha completado el puzzle
    with(oBlock)
    {
        image_index = 2; //Ponerles la imagen verde
    }


//Otro puzzle
var completed = true; //Comenzamos pensando que todos están completos
with(oBlockPattern)
{
    if(image_index == 0) //Si se encuentra uno incompleto
        completed = false; //No se ha completado el puzzle
}
if(completed) //Si se ha completado el puzzle
{
    with(oBlockPattern)
    {
        image_index = 2; //Ponerles la imagen verde
    }
   
    var correcto = true; //Comenzamos pensando que se hizo correctamente
    for(var i = 0; i < ds_list_size(base); i++) //Recorremos toda la lista
    {
        var bs = base[| i]; //Obtenemos el valor i de la lista original
        var he = hecho[| i]; //Obtenemos el valor i en el orden de activación
        if(bs <> he) //Si los valores son diferentes (si se activaron en un orden incorrecto)
        {
            correcto = false; //No se ha completado;
            break; //Ya con eso no tenemos que recorrer más la lista
        }
    }
    if(correcto)
    {
        //Algo si el puzzle es correcto
    }
    else
    {
        //Supongo que se reiniciará el puzzle
        with(oBlockPattern)
        {
            image_index = 0; //Ponemos su estado a 'desactivado'
        }
        ds_list_clear(hecho); //Vaciamos la variable `hecho`
    }
}
[/gml]
Título: Re:Pequeña falla en este codigo
Publicado por: bygdle en Septiembre 19, 2017, 05:35:21 AM
¿Y el código en donde declaras la variable hecho? (está en el controlador)
Título: Re:Pequeña falla en este codigo
Publicado por: Naitsabes0 en Septiembre 19, 2017, 05:55:33 AM
Cita de: NiuWeb en Septiembre 19, 2017, 05:35:21 AM
¿Y el código en donde declaras la variable hecho? (está en el controlador)
El controlador también tenia un create?  :o

El oBlock y el oBlockPattern no eran los únicos 2 de 4 objetos que lo tenían?  ???
Título: Re:Pequeña falla en este codigo
Publicado por: bygdle en Septiembre 19, 2017, 06:00:22 AM
XD.
[GML]
///Evento create del controlador
globalvar base, hecho;
base = ds_list_create(); //Lista para meter los identificadores en el orden correcto.
ds_list_add(base, 1, 2, 3, 4); //Se añaden los valores en ese orden.

hecho = ds_list_create(); //Lista para meter los identificadores de los bloques que se van activando
[/GML]
Ése era.
Título: Re:Pequeña falla en este codigo
Publicado por: Naitsabes0 en Septiembre 19, 2017, 06:34:32 AM
Cita de: NiuWeb en Septiembre 19, 2017, 06:00:22 AM
XD.
[GML]
///Evento create del controlador
globalvar base, hecho;
base = ds_list_create(); //Lista para meter los identificadores en el orden correcto.
ds_list_add(base, 1, 2, 3, 4); //Se añaden los valores en ese orden.

hecho = ds_list_create(); //Lista para meter los identificadores de los bloques que se van activando
[/GML]
Ése era.

Tenia que declararlo XD.

Honestamente alguien me apago el computador cuando me fui a dormir, por lo que tuve que ver los últimos códigos que vimos, y claro este no tenia el CREATE del controlador, lo raro es que no se me haya quedado guardado, vale todo funciona en su sitio.