Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: arcangelcaos en Enero 24, 2016, 11:09:19 AM

Título: Error duplicar instancias
Publicado por: arcangelcaos en Enero 24, 2016, 11:09:19 AM
Hola, tengo un error y no tengo ni idea donde.

Tengo un menú, que al darle a un botón, destruye ese objeto y crea otro para el control de volumen.
En ese objeto control de volumen en el evento Global Mouse Pressed left tengo esto
SelectGeneral = point_in_rectangle(mouse_x,mouse_y,x-(sprite_get_width(SprCheckPoint)/2),y-(sprite_get_height(SprCheckPoint)/2),x+(sprite_get_width(SprCheckPoint)/2),y+(sprite_get_height(SprCheckPoint)/2))

SelectMusica = point_in_rectangle(mouse_x,mouse_y,x,y+90-(sprite_get_height(SprBarraVolumen)/2),x+(sprite_get_width(SprBarraVolumen)),y+90+(sprite_get_height(SprBarraVolumen)/2))

SelectSonido = point_in_rectangle(mouse_x,mouse_y,x,y+150-(sprite_get_height(SprBarraVolumen)/2),x+(sprite_get_width(SprBarraVolumen)),y+150+(sprite_get_height(SprBarraVolumen)/2))

SelectAceptar = point_in_rectangle(mouse_x,mouse_y,x+300-(sprite_get_width(SprAceptar)/2),y+250-(sprite_get_height(SprAceptar)/2),x+300+(sprite_get_width(SprAceptar)/2),y+250+(sprite_get_height(SprAceptar)/2))

if SelectGeneral
{
if global.VolumenG = true
    {global.VolumenG = false
     global.VolumenM = false
     global.VolumenS=false
    }
    else
    {global.VolumenG = true
     global.VolumenM = true
     global.VolumenS=true
    }
}

if SelectMusica
{
punto = point_distance(x,y,mouse_x,y)
punto=punto/300
global.VolumenM=punto
}

if SelectSonido
{
punto = point_distance(x,y,mouse_x,y)
punto=punto/300
global.VolumenS=punto
}

if SelectAceptar
{
ini_open("Heroe")
ini_write_real("CONFIG","volg",global.VolumenG)
ini_write_real("CONFIG","volm",global.VolumenM)
ini_write_real("CONFIG","vols",global.VolumenS)
ini_close()
instance_create(930,345,ObjCtrlSurfaceMenu)
audio_stop_all()
sonido= audio_play_sound(MusicaMenuInicio,1,true)
ScrCtrolVolumen(sonido,"M")
instance_destroy()
SelectAceptar=false
}


la cosa es que cuando salgo crea el doble de instancias de ObjCtrlSurfaceMenu, comprobado con un control.
La primera vez crea 2, la segunda 4, luego 8, y así sucesivamente, siempre el doble de lo que había anteriormente
Y también he comprobado que cuando esta el control de volumen no hay instancias ObjCtrlSurfaceMenu, se destruye, comprobado.

En el ObjCtrlSurfaceMenu tengo este código para llamar al control de volumen
if SelectOpciones= true and Seleccionado = false
{
instance_create((room_width/2)-100,(room_height/2)-100, ObjCtrlVolumen)
with(ObjLamparaFuego){instance_destroy()}
surface_free(global.light)
instance_destroy()
Seleccionado = true
}



Alguien tiene idea de porque se me duplican las instancias?????????????????????????????


EDIT: No he encontrado el fallo, pero he puesto esto en el CREATE
if instance_number(ObjCtrlSurfaceMenu)> 1 {instance_destroy()}
Con esto lo soluciono, pero sigo sin saber el fallo
Título: Re:Error duplicar instancias
Publicado por: elviskelley en Enero 24, 2016, 06:01:11 PM
No copiare todo tu codigo, cuando puedo simplemente explicarte como cometes los errores.
antes de llamar a una instancia  (crearla) es bueno siempre hacer una comprobacion de que la misma no existe ejem:
if not instance_exists(obj....)
{instance_create(x,y,obj....);}
esto evitara duplicados.

Otro error que vi y mejor explico.
Luego de codigos como: instance_change, instance_destroy, room_goto, room_restart, etc. No deben haber codigos, por el simple hecho de que no se ejecutaran.
ejemplo: si colocas esto:
if (sentencia) then
{
codigos...
instance_destroy()
variable=false;  //Esto no se va a ejecutar, por que ya la instancia fue destruida.
}
Título: Re:Error duplicar instancias
Publicado por: arcangelcaos en Enero 24, 2016, 06:18:49 PM
Gracias por las sugerencias.
Ya se que después de destruirla no se ejecuta código, pero no afecta a nada ese código.

Lo tendre en cuenta para los próximos scripts