Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: kostra en Noviembre 21, 2015, 07:12:15 PM

Título: [Solusionaoh] Me lio al meter una array en un while xD
Publicado por: kostra en Noviembre 21, 2015, 07:12:15 PM
Como nunca uso bucles ni arrays, pos los uso mal y ya juntándolos ni te digo xDDD

a ver.. primero creo una array de 23 al inicio del juego
for (i=0;i<23;i++)
{
    global.buffact[i] = false;
}

así se hace?? xD

entonces... en el evento draw (me es más cómodo ahora que el step)
rune = 0;
while (global.buffact[rune] == false and rune < 23)
{
    rune++;
};
switch rune
{
    case 0:
        runename = "FEHU";
        break;
    case 1:
        runename = "WUNJO";
        break;
    case 2:
        runename = "TEIWAZ";
        break;
    case 3:
        runename = "URUZ";
        break;
    case 4:
        runename = "THURISAZ";
        break;
    case 5:
        runename = "KENAZ";
        break;
    case 6:
        runename = "BERKANA";
        break;
    case 7:
        runename = "MANNAZ";
        break;
    case 8:
        runename = "ANSUZ";
        break;
    case 9:
        runename = "ISA";
        break;
    case 10:
        runename = "JERA";
        break;
    case 11:
        runename = "INGUZ";
        break;
    case 12:
        runename = "DAGAZ";
        break;
    case 13:
        runename = "ALGIZ";
        break;
    case 14:
        runename = "PERTHRO";
        break;
    case 15:
        runename = "LAGUZ";
        break;
    case 16:
        runename = "RAIDO";
        break;
    case 17:
        runename = "NAUTHIZ";
        break;
    case 18:
        runename = "HAGALAZ";
        break;
    case 19:
        runename = "SOWULO";
        break;
    case 20:
        runename = "EIHWAZ";
        break;
    case 21:
        runename = "EHWAZ";
        break;
    case 22:
        runename = "GEBO";
        break;
    case 23:
        runename = "OTHILA";
        break;
}


draw_set_colour(choose(c_green));
draw_text(8,8+(8*7),"RUNE: "+string(runename));

//ENEMY AND BOSS
////////////////

if room == rplay
or (!instance_exists(oen) and !instance_exists(oboss))
    exit;
if room == renemy
{
    draw_set_halign(fa_right);
    //VIT
    draw_set_colour(c_ltgray);
    if envit > 0
        draw_text(room_width-8,8+(8*1),"HP: "+string(ceil((envit*10)))+"/"+string(ceil(oen.enhpnow*10)));
    else
        draw_text(room_width-8,8+(8*1),"HP: 0/"+string(round(enhpnow*10)));
    //ATK
    draw_text(room_width-8,8+(8*2),"ATK: "+string(ceil(enatk)));
    //DEF
    draw_text(room_width-8,8+(8*3),"DEF: "+string(ceil(endef)));
    //DEX
    draw_text(room_width-8,8+(8*4),"DEX: "+string(ceil(endex)));
    //HP
    draw_text(room_width-8,8+(8*5),"HP: "+string(enhp));
}

Pero pum, me sale el error de array out of range!

Lo que trato de hacer es que analice la array numero por numero hasta toparse con un true y en cuanto encuentra un true, deja la variable rune en el numero que está, y así poder asignar el nombre que le pertoca a la variable runename.

PD: aunque al principio haya puesto todos en false, al ejecutarse ese código sí hay alguna en true, de echo están todas para el testeo, ya lo cambiaré :P en el momento del juego real sin testeo podrá haber UNA SOLA activada (true) o NINGUNA (false), en el caso de ninguna, el runename = "NOTHING";

a ver quien me instruye un poco con esto, he pasado todos estos años rodeado de ifs, podría hacer esto con millones de ifs, pero es lo que quiero evitar, hay que evolucionar xD
Título: Re:Me lio al meter una array en un while xD
Publicado por: DarkKRuleR en Noviembre 21, 2015, 07:17:58 PM
for (i=0;i<23;i++)

Estás creando 23 posiciones, de la 0 a la 22 (es la forma correcta). No existe la posición 23, creo que ahí es donde fallas. Mira todo el código y arregla aquel donde accedas a las 23.
Título: Re:Me lio al meter una array en un while xD
Publicado por: kostra en Noviembre 21, 2015, 07:20:41 PM
hmmm... puse <=23 y me sigue saliendo el mismo error

___________________________________________
############################################################################################
FATAL ERROR in
action number 1
of Draw Event
for object ogui:

Push :: Execution Error - Variable Index [0,23] out of range [1,23] - -5.buffact(100027,23)
at gml_Object_ogui_DrawEvent_1 (line 34) - while (global.buffact[rune] == false and rune < 23)
############################################################################################
Título: Re:Me lio al meter una array en un while xD
Publicado por: bygdle en Noviembre 21, 2015, 07:48:47 PM
Y por qué no intentas con
[gml]
for (i=0;i<24;i++)
[/gml]
Título: Re:Me lio al meter una array en un while xD
Publicado por: DarkKRuleR en Noviembre 21, 2015, 07:50:18 PM
Cambia i++ por ++i. Es el único posible error que veo. Al hacer i++, no te está creando el elemento 0, es lo que entiendo del error.

Luego, cosillas

No uses variables globales. Lo joden todo... en su lugar pon un variable local en un objeto controlador importante y persistente
No hagas ( variable == true ) o ( variable == false ). Haz ( variable) y ( !variable ). Imagina la variable:

Hambriento = true;

Y queremos que ataque si No está hambriento:

if ( !Hambriento ) ataca

Si NO hambriento ataca

PD: i < 24 debería dar lo mismo que i <= 23, ya que i suma de uno en uno :D
Título: Re:Me lio al meter una array en un while xD
Publicado por: bygdle en Noviembre 21, 2015, 07:58:16 PM
Un momento... ++i?
¿Y eso se puede?

Yo que sepa, la estructura debe ser:
[gml]
i+=1
i++
[/gml]
Si se puede así no tenía la más mínima idea.

PD: No hay problema en usar variables globales, sólo asegurarse de que están bien organizadas, y además... recordemos que es un ciclo for, y ese maldito siempre intenta dañarlo todo, así que prueba con <24 si no te sirve... XD
Título: Re:Me lio al meter una array en un while xD
Publicado por: kostra en Noviembre 21, 2015, 07:59:51 PM
a ver a ver... por orden, esto es una horda xD

1.. ++i ??? watafak?? es la primera vez que lo veo así puesto, igual lo pruebo.. xD
2.. pk lo joden todo?? me es bien cómodo así, pues yo declaro todas las variables al inicio del juego, en una room aparte y luego cambio a la siguiente room, así bien ordenadito :3
3.. !hambriento... si, bueno... cierto que es más cómodo pero.. 1-Viene a ser lo mismo xD 2-... pfff la costumbre xD a ver si me acostumbro como tú dices, me gustaría hacerme más  fácil la vida, eso siempre xD, por eso trato de acostumbrarme a bucles y arrays ahora, ya va siendo hora xD
4.. ya sé perfectamente que es lo mismo xDDD, pero yo prefiero <=  ya sabes, cada uno sus manias y la mia y quiero ver un 23 bien bonito, no me cae bien el 24, me liaría en un futuro, bueno yo me entiendo xDD

bueno probando... aunque con lo que me has dicho, viene a ser... ningún cambio xD
bueno, en la parte del while, he cambiado 23 por 22, no sea que ahi salte a 24 que ya no existe.. y ya no me sale el error... pero... no entiendo pk, siempre sale la numero 22 y se le asigna siempre el nombre de "GEBO" en el switch... aunque ponga cualquier id anterior a ella en true, o todas... en el caso de estar todas, debería parar de analizar el while en el mismo 0 no????
Título: Re:Me lio al meter una array en un while xD
Publicado por: jmbs19 en Noviembre 21, 2015, 08:33:21 PM
te dice " array out of range!" porque estas llamando a un array que no existe, me explico:

[gml]
for (i=0;i<23;i++)
{
    global.buffact = false;
}
//aqui estas creando un array con el valor false de la posicion 0 a la 22, por ende hay 23 array contando el 0, pero la ultima posicion es la 22
[/gml]

[gml]
rune = 0;
while (global.buffact[rune] == false and rune < 23)//aqui esta ocurriendo lo siguiente, el while le suma a rune cuando esta en 22 uno y luego comprueba la variable, por lo que pregunta global.buffact[23]==false, y esta variable no existe.
{
    rune++;
};
switch rune
{
    case 0:
        runename = "FEHU";
        break;
    case 1:
        runename = "WUNJO";
        break;
    case 2:
        runename = "TEIWAZ";
        break;
    case 3:
        runename = "URUZ";
        break;
    case 4:
        runename = "THURISAZ";
        break;
    case 5:
        runename = "KENAZ";
        break;
    case 6:
        runename = "BERKANA";
        break;
    case 7:
        runename = "MANNAZ";
        break;
    case 8:
        runename = "ANSUZ";
        break;
    case 9:
        runename = "ISA";
        break;
    case 10:
        runename = "JERA";
        break;
    case 11:
        runename = "INGUZ";
        break;
    case 12:
        runename = "DAGAZ";
        break;
    case 13:
        runename = "ALGIZ";
        break;
    case 14:
        runename = "PERTHRO";
        break;
    case 15:
        runename = "LAGUZ";
        break;
    case 16:
        runename = "RAIDO";
        break;
    case 17:
        runename = "NAUTHIZ";
        break;
    case 18:
        runename = "HAGALAZ";
        break;
    case 19:
        runename = "SOWULO";
        break;
    case 20:
        runename = "EIHWAZ";
        break;
    case 21:
        runename = "EHWAZ";
        break;
    case 22:
        runename = "GEBO";
        break;
    case 23://aqui ocurre lo mismo de arriba el array 23 no existe
        runename = "OTHILA";
        break;
}
[/gml]
asi que si no me equivoco tansolo deberias de hacer lo siguiente
[gml]
for (i=0;i<=23;i++)
{
    global.buffact = false;
}//de esta manera se crearan 24 posiciones, del 0 al 23
[/gml]

ahora esto trae los siguientes problemas, tu comprobacion para el while dice buffet==false and rune <23, la posicion 23 no se evaluara, el problema aqui es tu manera de hacer esta comprobacion, puedes dejarlo asi y olvidarte de la posicion 23 o puedes hacer un do while, primero ejecuta y luego mira la condición, es lo contrario al while, que primero compara y luego ejecuta.

solo una cosa, esta pendiente siempre de que cuando evalues una condicional con un array o uses un valor de un array esa posicion exista.
Título: Re:Me lio al meter una array en un while xD
Publicado por: kostra en Noviembre 21, 2015, 08:43:02 PM
lee losanteriores posts, ya existe la array lo puse como tu has dicho, ya lo dije jejeje
y en el while.. no se cuenta la 23? entonces pondré también <=23 a ver...

error out of range también...

en el for tiene <= 23 y en el white también

Usar do while, creo que no funcionaría porque antes de sumarle al rune, he de verificar también la numero 0!! plis, lee la explicación que doy sobre lo que trato de hacer, en el primer mensaje :B
Título: Re:Me lio al meter una array en un while xD
Publicado por: jmbs19 en Noviembre 21, 2015, 08:55:22 PM
Cita de: kostra en Noviembre 21, 2015, 08:43:02 PM
lee losanteriores posts, ya existe la array lo puse como tu has dicho, ya lo dije jejeje
y en el while.. no se cuenta la 23? entonces pondré también <=23 a ver...

error out of range también...

en el for tiene <= 23 y en el white también

Usar do while, creo que no funcionaría porque antes de sumarle al rune, he de verificar también la numero 0!! plis, lee la explicación que doy sobre lo que trato de hacer, en el primer mensaje :B
ok, pero tienes que poner el <=23 solo en el for, no el el while, y el do while comprobaria la posicon 0, la unica diferencia entre el do while y el while seria mas o menos esto

(solo es algo grafico, no es la manera de escribirlo)
while

condicion verdadera entonces ejecuta

do while
ejecuta, la condicion es verdadera, vuelve a ejecutar

y si colocaste <=23 en el while estas volviendo a cometer el error, solo que ahora es cuando cuenta 24, ya que dice "es menor o igual a 23 si, sumale uno, bueno el array[24]==false, espera eso no existe ERROR"
entonces volviste a tener el problema, quitale el <=23 y ponlo <23 en el while.

otra cosa, yo empece con el lenguaje C y se perfectamente que en C se puede hacer i++ para sumarle uno, pero cuando trabaje con game maker 8.1 esto me tiraba error, desde entonces uso i=i+1 o i+=1, no e probado el i++ en el studio pero es mejor curarse en salud.
Título: Re:Me lio al meter una array en un while xD
Publicado por: kostra en Noviembre 21, 2015, 09:03:54 PM
pues si poner eso vuelvo a cometer error, por qué poniendo <=23 en el for y <23 en el while me salta out of range??? T_T

EDITO: POR DIOS MEGA FAIL!!!! xDD había puesto <=23 en un for que no era JAJAJAJSAKJDALKSDJAWKDJ bueno, muchas graciacas a todos uuuuna vez más xD