Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: francordoba en Septiembre 28, 2013, 10:43:25 PM

Título: ¿Alguna manera de simplificar este código?
Publicado por: francordoba en Septiembre 28, 2013, 10:43:25 PM
Estoy desarrollando un inventario. He conseguido cargar las casillas en esta disposición:


0000000000
0000000000
0000000000
0000000000
0000000000

las casillas son instancias del objeto "slot_obj".

Cada una lleva asignada la variable "orden" en +1. Por lo tanto, cada casilla dispone de la variable "orden" con un valor diferente y ordenado entre ellas.     

Con las teclas W,S,A,D declaro dos variables locales, "ejey" <--columnas, "ejex" <--filas.

Ejemplo: si pulso W ejey+=1. Si pulso D ejex+=1.  Entonces van oscialando los valores de las variables dentro de cada uno de los objetos.

Ahora viene lo gordo: 

De una manera rústica "la mía", con un switch voy detectando el valor de las variables y si el ejex es tal y el eje y es tal , corresponden a la casilla tal.


switch(orden){

case 1:if ejey=1 && ejex=orden{image_blend=c_red}else{image_blend=c_white};break;
case 2:if ejey=1 && ejex=orden{image_blend=c_red}else{image_blend=c_white};break;
case 3:if ejey=1 && ejex=orden{image_blend=c_red}else{image_blend=c_white};break;
case 4:if ejey=1 && ejex=orden{image_blend=c_red}else{image_blend=c_white};break;

//.....hasta case 50...



Esto hace que dependiendo de como esten las variables, la casilla correspondiente se vuelva roja. Y funciona perfectamente.

¿Hay alguna manera de simplificar el código? Por que creo que es demasiado basto.

Algo parecido a:   

/**
if ejey=ceil(orden/10)&& ejex=ceil(orden/5){
image_blend=c_red;
}else{
image_blend=c_white}

**/


Intenté simplificarlo todo en solo estas 4 líneas pero es obvio que no es la formula matemática correcta, ni yo soy de matemáticas.

¿Alguna ayuda?

Espero que la parrafada os haya parecido interesante.
Un saludo makeros.

Título: Re:¿Alguna manera de simplificar este código?
Publicado por: romon_28 en Septiembre 29, 2013, 12:10:39 AM
em.. creo que podrias hacer lo siguiente:

C = ((ejex+(ejey*10))!=orden);
image_blend = make_color(1,C,C);

Título: Re:¿Alguna manera de simplificar este código?
Publicado por: Iros en Septiembre 29, 2013, 03:40:51 AM
Si no metele un for al switch hasta 50 y ya, es decir, el valor de la variable del for sería el de los casos. Es lo que se me ocurre xD
Título: Re:¿Alguna manera de simplificar este código?
Publicado por: Zela en Octubre 02, 2013, 02:03:36 AM
... No se si Quieres Algo Como Esto (Archivo Adjunto) ...
El movimiento es con los cursores...


PD: En Mi Opinión, no me gusta mucho la idea que manipules instancias ordenadas para un inventario, ya que si tienes muchas instancias puedes ralentizar mucho el programa.

Saludos.

Nota : Me Acabo de Dar Cuenta Q Lo Pedias Para El GMS, Cree El Ejemplo En GM8, Pero Creo Q Te Correrá Igual
Título: Re:¿Alguna manera de simplificar este código?
Publicado por: klys en Octubre 03, 2013, 07:24:49 AM
Segun lo que entiendo que quieres hacer es que con A,S,D y W poder movertre entre un inventario de dos dimensiones en donde cada object se llama slot_obj, lo renombrare a obj_Inventario_slot

Seguramente debes tener un objeto que control el inventario, a este le llamare obj_Inventario_control

Le asignare la letra I para abrir/cerrar el inventario.

con las variables "xx" y "yy" asignaremos la posicion actual del cursor dentro del inventario.

con "altura" y "anchura" puedes configurar diferentes tamaños.

Lo que haremos para simplificar ese codigo es simplemente usar la tecnologia with(obj) en ves un switch con 50 casos   :o (Que tambien es valido pero no simplificado  :D)

en las letras A, S, D y W asignaremos los diferentes valores posibles de xx y yy para luego buscar entre los obj_Inventario_slot cual tiene el xx y yy igual al obj_Inventario_control, finalmente reasignamos las casillas en blanco y reasignamos una sola casilla a negro, y todo con la facilidades de with(obj)  ;D

Eh aqui un ejemplo: (GM:Studio)
https://dl.dropboxusercontent.com/u/33603247/InventarioEjemplo.gmx(v2).rar

--------------------------------------------------------------- adicionalmente:

Si quieres que el mouse tambien pueda afectar el inventario podemos agregar dos o tres eventos mas....

Mouse Enter Event   (obj_Inventario_slot)

color = c_orange


Mouse Leave Event  (obj_Inventario_slot)

if xx == obj_Inventario_control.xx and yy == obj_Inventario_control.yy
{
       color = c_black
}
else color = c_white


Mouse Click Event (obj_Inventario_slot)
with(obj_Inventario_control)
{
       xx = other.xx
       yy = other.yy
       event_user(0) // reasignacion de casilla seleccionada
}


y done!  :)