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.


em.. creo que podrias hacer lo siguiente:

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


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

#3 Octubre 02, 2013, 02:03:36 AM Ultima modificación: Octubre 02, 2013, 02:06:08 AM por Zela
... 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
Fracasar no significa un fin sino un comienzo

#4 Octubre 03, 2013, 07:24:49 AM Ultima modificación: Octubre 03, 2013, 06:06:31 PM por klys
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!  :)
Battlefield Galactic (Nombre piloto) Alpha 1.7.5.0
Juego Genero: Multiplayer Online Battle Arena!
Is more than 9000 APM!!