Buenas!!, tengo un objeto(obj_boton) que tiene varias instancias en la room, es un boton para acceder a cada room de cada nivel, despues he creado para cada instancia una variable, esta variable va ha otro objeto que dibuja un numero, si se aprieta el boton el numero de que dibuja ese objeto tiene un aplha diferente. El problema lo tengo que en el boton nivel uno si que funciona, pero en el boton nivel 2 no y en el resto tampoco. En el evento del obj_boton step tengo esto:
// Boton Nivel 1
if id = inst_C50AC646
{
// Cambio de sprite
if collision_point(mouse_x, mouse_y, obj_boton_niveles, 1, 0) = id and device_mouse_check_button(0, mb_left)
{
if stars = 0
{
image_index = 2;
}
if stars = 1
{
image_index = 4;
}
if stars = 2
{
image_index = 6;
}
if stars = 3
{
image_index = 8;
}
nivel_1_inst_C50AC646 = 1;
}
if collision_point(mouse_x, mouse_y, obj_boton_niveles, 1, 0) = id and device_mouse_check_button_released(0, mb_left)
{
if stars = 0
{
image_index = 1;
}
if stars = 1
{
image_index = 3;
}
if stars = 2
{
image_index = 5;
}
if stars = 3
{
image_index = 7;
}
nivel_1_inst_C50AC646 = 0;
accion = 1;
}
if !collision_point(mouse_x, mouse_y, obj_boton_niveles, 1, 0)
{
if stars = 0
{
image_index = 1;
}
if stars = 1
{
image_index = 3;
}
if stars = 2
{
image_index = 5;
}
if stars = 3
{
image_index = 7;
}
nivel_1_inst_C50AC646 = 0;
}
// Accion
if accion = 1
{
accion = 0;
room_goto(rm_nivel_1);
}
}
// Boton Nivel 2
if id = inst_E291164E
{
// Cambio de sprite
if collision_point(mouse_x, mouse_y, obj_boton_niveles, 1, 0) = id and device_mouse_check_button(0, mb_left)
{
if stars = 0
{
image_index = 2;
}
if stars = 1
{
image_index = 4;
}
if stars = 2
{
image_index = 6;
}
if stars = 3
{
image_index = 8;
}
nivel_2_inst_E291164E = 1;
}
if collision_point(mouse_x, mouse_y, obj_boton_niveles, 1, 0) = id and device_mouse_check_button_released(0, mb_left)
{
if stars = 0
{
image_index = 1;
}
if stars = 1
{
image_index = 3;
}
if stars = 2
{
image_index = 5;
}
if stars = 3
{
image_index = 7;
}
nivel_2_inst_E291164E = 0;
accion = 1;
}
if !collision_point(mouse_x, mouse_y, obj_boton_niveles, 1, 0)
{
if stars = 0
{
image_index = 1;
}
if stars = 1
{
image_index = 3;
}
if stars = 2
{
image_index = 5;
}
if stars = 3
{
image_index = 7;
}
nivel_2_inst_E291164E = 0;
}
// Accion
if accion = 1
{
accion = 0;
room_goto(rm_nivel_2);
}
}
y en objeto que dibuja los numeros esto:
if global.room_existente = (rm_menu_0)
{
// Numero Normal
if obj_boton_niveles.nivel_1_inst_C50AC646 = 0
{
posicion_x = floor(view_wview[0] / 2 - 324);
draw_text(view_xview[0] + posicion_x, view_yview[0] + 72, "1");
}
if obj_boton_niveles.nivel_2_inst_E291164E = 0
{
posicion_x = floor(view_wview[0] / 2 + 60);
draw_text(view_xview[0] + posicion_x, view_yview[0] + 72, "2");
}
if obj_boton_niveles.nivel_3_inst_BD48D8C3 = 0
{
posicion_x = floor(view_wview[0] / 2 - 324);
draw_text(view_xview[0] + posicion_x, view_yview[0] + 192, "3");
}
if obj_boton_niveles.nivel_4_inst_D80DF68B = 0
{
posicion_x = floor(view_wview[0] / 2 + 60);
draw_text(view_xview[0] + posicion_x, view_yview[0] + 192, "4");
}
if obj_boton_niveles.nivel_5_inst_B8420442 = 0
{
posicion_x = floor(view_wview[0] / 2 - 324);
draw_text(view_xview[0] + posicion_x, view_yview[0] + 312, "5");
}
if obj_boton_niveles.nivel_6_inst_6D286C12 = 0
{
posicion_x = floor(view_wview[0] / 2 + 60);
draw_text(view_xview[0] + posicion_x, view_yview[0] + 312, "6");
}
// Numero Pulsado
draw_set_alpha(0.4);
if obj_boton_niveles.nivel_1_inst_C50AC646 = 1
{
posicion_x = floor(view_wview[0] / 2 - 324);
draw_text(view_xview[0] + posicion_x, view_yview[0] + 72, "1");
}
if obj_boton_niveles.nivel_2_inst_E291164E = 1
{
posicion_x = floor(view_wview[0] / 2 + 60);
draw_text(view_xview[0] + posicion_x, view_yview[0] + 72, "2");
}
if obj_boton_niveles.nivel_3_inst_BD48D8C3 = 1
{
posicion_x = floor(view_wview[0] / 2 - 324);
draw_text(view_xview[0] + posicion_x, view_yview[0] + 192, "3");
}
if obj_boton_niveles.nivel_4_inst_D80DF68B = 1
{
posicion_x = floor(view_wview[0] / 2 + 60);
draw_text(view_xview[0] + posicion_x, view_yview[0] + 192, "4");
}
if obj_boton_niveles.nivel_5_inst_B8420442 = 0
{
posicion_x = floor(view_wview[0] / 2 - 324);
draw_text(view_xview[0] + posicion_x, view_yview[0] + 312, "5");
}
if obj_boton_niveles.nivel_6_inst_6D286C12 = 1
{
posicion_x = floor(view_wview[0] / 2 + 60);
draw_text(view_xview[0] + posicion_x, view_yview[0] + 312, "6");
}
draw_set_alpha(1);
}
Hay otra forma de comprimir esto de las instancias o hay que hacerlo todo asi. Muchas Gracias
Yo veo dos alternativas.
1) En lugar de usar un botón con 10 instancias, usar 10 botones con una instancia. Dentro de cada botón se puede especificar a qué room se debe ir al hacer click. Tienes más objetos, pero hay menos código apilado en un mismo lugar
2) Colocar código en el evento CREATION CODE de cada instancia en el editor de rooms. Por ejemplo, una variable que guarde el índice de habitación relacionado con esa instancia. De esa manera, esa variable se puede usar al hacer click sobre esa instancia, para cambiar de habitación.
Como mencionó penumbra, te conviene usar el "Creation code". (en el editor de rooms da click derecho en la instancia, y en el menú que aparece elige "Creation code")
El principal error es que estás comparando la variable id con inst_.... La variable id es un número que es mayor o igual a 100001 y el identificador inst_ sólo se usa en el editor de rooms, dentro del juego no tiene utilidad.
Además no es recomendable hacer referencia directa al id dentro del código porque es muy fácil confundirse y obtener un resultado inesperado.
Gracias por contestar, he puesto el codigo en cada instancia de ese objeto en la room, en el codigo de cada instancias, pero no me funciona el boton.
Podria crear un objeto por boton, pero si tengo 100 niveles tengo que crear 100 objetos y no se si eso ocupara mucha memoria, no se que es mejor, crear un objeto con muchas instancias o un objeto por boton?????
Los objetos en si, ocupan poco. Yo tengo un juego con 800 objetos, y en principio sin problemas.
Nos se exactamente la distribución de tu juego, pero podrías tener 4 o 10 botones, y en función de la room en la que estes vaya a un sitio o a otro.
If room = rmNivel1 {room_goto(rmNivel2)}
If room = rmNivel2 {room_goto(rmNivel3)}
Y asi sucesivamente, o para atrás. Según convenga.
Ahh, otro truco que uso yo mucho, es cuando los objetos son inmóviles, que siempre están en el mismo sitio, hago que ejecuten un código en función de sus coordenadas.
If x = 10 and y = 10 {room_goto(rmNivel3)}
If x = 20 and y = 10 {room_goto(rmNivel4)}
Pienso que hacer un objeto por botón donde sólo se cambian unas cuantas variables es demasiado. Yo haría un sólo objeto botón con muchas instancias en la room creadas con un ciclo for.
Cita de: Clamud en Mayo 27, 2015, 08:06:26 PM
Pienso que hacer un objeto por botón donde sólo se cambian unas cuantas variables es demasiado. Yo haría un sólo objeto botón con muchas instancias en la room creadas con un ciclo for.
Estoy de acuerdo, asi hago yo en algunos sitios, pero luego hay que asignarles un código diferente a cada una. Hay es donde esta el problema. Por eso digo si son fijos, usar las coordenadas para usar un código u otro.
El método de CREATION CODE a mi me parece el mejor. Si no te funciona es por que debe haber algún error en el código que utilizas, no porque el principio lógico esté mal.
Otra manera es mediante estructuras de datos, guardar la id de cada botón y su correspondiente habitación, y luego, al hacer click en el botón, buscar la id en la estructura e ir a la habitación correspondiente (ya sea que se use una estructura para guardar ambos campos o estructuras separadas).
este es mi codigo que pongo en cada instancia
if collision_point(mouse_x, mouse_y, obj_boton_niveles, 1, 0) = id and device_mouse_check_button(0, mb_left)
{
if stars = 0
{
image_index = 2;
}
if stars = 1
{
image_index = 4;
}
if stars = 2
{
image_index = 6;
}
if stars = 3
{
image_index = 8;
}
}
if collision_point(mouse_x, mouse_y, obj_boton_niveles, 1, 0) = id and device_mouse_check_button_released(0, mb_left)
{
if stars = 0
{
image_index = 1;
}
if stars = 1
{
image_index = 3;
}
if stars = 2
{
image_index = 5;
}
if stars = 3
{
image_index = 7;
}
accion = 1;
}
if !collision_point(mouse_x, mouse_y, obj_boton_niveles, 1, 0)
{
if stars = 0
{
image_index = 1;
}
if stars = 1
{
image_index = 3;
}
if stars = 2
{
image_index = 5;
}
if stars = 3
{
image_index = 7;
}
}
// Accion
if accion = 1
{
accion = 0;
room_goto(rm_nivel_1);
}
Lo del ciclo for como es??
Gracias
Usar CREATION CODE implica que se debe cambiar la lógica del código original.
CREATION CODE:
[gml]habitacion = room_xx //Aquí se escribe el índice de la habitación a la cual ir, según la instancia del botón[/gml]
EVENTO MOUSE LEFT PRESSED/RELEASED del objeto botón
[gml]room_goto(habitacion)[/gml]
Para cambiar image_index, es mejor usar una estructura switch/case que multiples if (esto tambien se haría en el evento mouse left pressed, y te ahorras el uso de collision_point)
Gracias ya se por donde tirar, voy a probar
Muchas Gracias
Para que funcionen las cosas en el creation code de la instancia?? me explico, en cada boton tengo dibujado un numero mediante draw en otro objeto(obj_menu) y cuando presiona el objeto le envia una variable a ese objeto para que lo dibuje en alpha 0.4, como puedo hacer en creation code todo esto?
Gracias
No entiendo lo que quieres decir. El creation code es independiente de draw y no interfiere con cómo se dibujan las cosas. tampoco entiendo lo que envías una variable a otro objeto para que dibujo no sé que cosa. El creation code, a diferencia de draw, no se ejecuta una y otra vez, sólo una vez, después de crear la instancia. En resumen, creation code es como un evento CREATE secundario o de soporte, por lo que no se puede usar para tomar decisiones en tiempo de ejecución (detectar clicks )
voy totalmente perdido, me explico, yo tengo 6 instancias(boton) de un objeto en la room, que cada boton lleva a una room, todo eso me funciona bien, tengo otro objeto que controla todas las cosas del menu, en este objeto dibujo el numero de cada boton, para que cada boton tenga su numero. Cuando aprieto cualquier boton cambia el sprite a transparente, y quiero que cambie tambien el numero de ese boton a transparente, habia creado una variable para cada instancia, como en el codigo que puse arriba. pero solo afecta al boton numero 1, y al l 2 el 3,..... no van. no se si me explico bien. Gracias
Cita de: pacne en Mayo 27, 2015, 10:54:13 PM
voy totalmente perdido, me explico, yo tengo 6 instancias(boton) de un objeto en la room, que cada boton lleva a una room, todo eso me funciona bien, tengo otro objeto que controla todas las cosas del menu, en este objeto dibujo el numero de cada boton, para que cada boton tenga su numero. Cuando aprieto cualquier boton cambia el sprite a transparente, y quiero que cambie tambien el numero de ese boton a transparente, habia creado una variable para cada instancia, como en el codigo que puse arriba. pero solo afecta al boton numero 1, y al l 2 el 3,..... no van. no se si me explico bien. Gracias
Creo que ya entendí lo que pretendías en el mensaje anterior. No es necesario usar el objeto menu para dibujar el número de cada botón, ya que cada botón puede dibujar su propio número. En ese caso:
CREATE del objeto botón
[gml]ON = false //true indica que se esta pulsando el botón[/gml]
CREATION CODE de cada instancia del objeto botón
[gml]numero = 1 //Cambiar el valor según la instancia del botón[/gml]
EVENTO MOUSE LEFT BUTTON
[gml]ON = true[/gml]
EVENTO MOUSE LEFT RELEASED
[gml]ON = false[/gml]
DRAW del objeto botón
[gml]
draw_self()
if (ON == true)
draw_text_colour(x, y, numero, c_white, c_white, c_white, c_white, 0.4 )
else
draw_text_colour(x, y, numero, c_white, c_white, c_white, c_white, 1)
[/gml]
ahora si, ademas me has hecho pensar en cambiar otras cosas utilizando el metodo de creation code.
MUCHAS GRACIAS