Buenas a todos.
Utilizo ,en el evento draw de un objeto controlador, una llamada para mostrar una interfaz, de 5 disponibles, cada una con su sprite correspondiente.
¿Cómo puedo llamar en el draw_sprite_ext, el sprite correspondiente según la variable global.interfaz?
Es decir: si la variable global.interfaz es 1, quiero el interfaz1_spr, si es 2, el interfaz2_spr...
He probado con string pero no aparece...
draw_sprite_ext(string("interfaz" + global.interfaz + "_spr") ,0,3,3,1,1,0,c_white,1)
Cita de: Texic en Septiembre 27, 2013, 07:21:13 PM
Deberias calcular antes en el create la variable a dibujar, algo como
[gml]execute_string("spr=interfaz"+global.interfaz+"_spr")[/gml]
y luego dibujas spr
Hombre, es gm:studio :P.
Mira francordoba el nombre de un sprite es una variable (en realidad constante) que almacena un numero llamado sprite_index, así que solo escribir el nombre de un sprite como un string no va hacer que mágicamente esté devuelva el valor del sprite_index. En gm8 se podía como lo ha dicho texic (a pesar de que era MUY lento y apestoso xD).
Mi recomendación personal es que uses un array, es mucho más eficiente y quizá hasta ahorras algo de tiempo. Algo así:
ev_create de algún objeto controlador que esté se cree antes que el objeto interfaz.
[gml]
global.arrayInterfaz[0]="interfaz0_spr";
global.arrayInterfaz[1]="interfaz1_spr";
global.arrayInterfaz[2]="interfaz2_spr";
global.arrayInterfaz[3]="interfaz3_spr";
global.arrayInterfaz[4]="interfaz4_spr";
[/gml]
Y luego para dibujar el sprite haces esto.
[gml]draw_sprite_ext(global.arrayInterfaz( global.interfaz ) ) ,0,3,3,1,1,0,c_white,1)[/gml]
El segundo método sustituye perfectamente el uso de execute_string como lo usó texic, además es mucho más eficiente incluyendo en gm8, increíblemente aveces acceder a una variable común en gm8 puede llegar a ser menos eficiente que acceder a un mapa (he hecho pruebas).
El principio es algo pesado y de hecho algo problemático a veces, si tienes muchos sprites puede tardar algo.
Ev create obj control.
[gml]
global.spriteMap=ds_map_create();
///Ese 1000 cambíalo por un numero algo mayor al numero de sprites que tienes.
for(var i=0; i<1000; i++){
if sprite_exists(i){
ds_map_add(global.spriteMap, sprite_get_name(i), i);
}
}
[/gml]
Y luego puedes crear un script. algo como esto.
[gml]
///sprite_string
ds_map_find_value(global.spriteMap, argument0);
[/gml]
Y luego, finalmente:
[gml]draw_sprite_ext(sprite_string( "interfaz" + string( global.interfaz ) + "_spr") ,0,3,3,1,1,0,c_white,1);[/gml]
Suerte ;).
Gracias a los dos, probé el primer método y no funcionó como bien dijo Bruno. Al final cambie la forma de llamar al sprite y no tuve que liar tanto berengenal para que saliera una "carita " :-[.
Muchas gracias.