bloque for dentro de un loop

Started by Futu-block, March 11, 2015, 10:35:37 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Futu-block

bennu me petaba con wine y me puse a investigar ya que no me dejaba trabajar y llegé a la raiz del promlema...

dentro del proceso enemigo y para ahorrar memoria, por que cada enemigo es el mismo proceso pero con distinto grafico y movimento, le hago un switch dentro del loop

    loop
        latencia++; // uso esa variable para relantizacion de movimientos, graficos, etc       
        switch (direccion)


            case 700: // enemigo sin grafico que controla tirar bolas de fuegos en diferentes direcciones
                if (latencia % 199 == 0)
                    for (C0 = 1; C0 < 7; C0++)
                        bolafuego(C0);
                        frame(50);
                    end
                end
            end

frames y tal y tal

fin del proceso

siguiente proceso: bolafuego(direccion_de_movimiento)  C0 de arriba

begin
    x = father.x;
    y = father.y;
    loop
        graph++;
        switch (direccion_de_movimiento)
            //case 1: x +=4; y +=2; if (x>= 350) break; end end   
              case 2: x +=3; y +=3; if (y>= 260) break; end end   
              case 3: x +=2; y +=4; if (y>= 260) break; end end   
              case 4: y +=4;            if (y>= 260) break; end end   
              case 5: x -=2; y +=4; if (y>= 260) break; end end   
              case 6: x -=3; y +=3; if (y>= 260) break; end end   
              case 7: x -=4; y +=2; if (x>= -30) break; end end   
        end
        frame;
    end
end
 
 
    El primero lo entrecomillé porque cuando llegaba al break se quedaba todo pillao y se iba al garete, lo comenté y adios problema...
¿porque?

panreyes

No tengo ni idea, pero te puedo decir que esa variable C0 hace que me duelan los ojos, ya que mi cerebro no la ve como una variable sino como un valor en hexadecimal xD


Igual me equivoco, pero puede que el compilador o el intérprete también se líe con eso...

Futu-block

es el nombre que le he dado aqui, en verdad uso una variable llamada neix, pensé que cambiarle de nombre la haría ''menos confundible''

Yawin

No creo que sea eso, pero en bennu el switch no tiene break. El break te está sacando del loop.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Futu-block

todo es porque el primer proceso creado boafuego(neix) o bolafuego(c0) el parametro es igual a lo que pone en el for, osea, que como tiene que añadirse en cada Nframes...

pero eso no tiene ná que ver que se vaya al garete cuando el proceso esté fuera de pantalla, solo cuando llege al break...

Ulthar Kaufman

No tiene que ver con que se salga o no (más bien con que no salga), pero veo que en el case de direcciones incrementas X e Y, sin embargo solo evalúas una de ellas para saber si ha salido de la pantalla, no deberías hacer esas comprobaciones (X e Y a la vez) fuera del switch?

Futu-block

Ahí es donde está la raiz del problema, hay que simplificar el codigo y sacar seis o siete combrobaciones de un switch donde esta entre comillas "gastando memoria" y ponerlo en una sola sentencia antes de terminar el bucle, gracias

Pero ¿es necesario hacer dos comrobaciones (x,y) para matar el proceso? Creo que con una sirve, la suficiente para que el proceso salga del cuadro de vision, ya sea x o y


Aparte, optimizaré un poco mas el codigo para ver si sigue fallando con poner el primer proceso o no bolafuego(1)

gecko

Esas comprobaciones para saber si salio de la pantalla sacalas completamente del switch.

Las podes hacer perfectamente despues del switch, dentro del loop. Con un solo if podes comprobar los 4 lados de la pantalla, y ahi matar al proceso si corresponde.
Torres Baldi Studio
http://torresbaldi.com

Futu-block

no paro de darle vueltas a la cabeza y lo que falla es el:  y +=2; de la primera sentencia...
pongo codigo y si alguien quiere le mando el juego entero


            case 700: //fuegos gargola
                if (latencia % 199 == 0)
                    for (neix = 1; neix < 8; neix++)
                        bolafuego(neix);
                        frame(200);
                    end
                end
            end



process bolafuego(paonde)

begin
cuenta_procesos++;
    graph = 701;
    x = father.x;
    y = father.y;
    loop
        size = 25;
        graph++;
        if (graph => 709) graph = 701; end
        switch (paonde)   
            //case 1: x +=4; y +=2; end   
            case 2: x +=3; y +=3; end   
            case 3: x +=2; y +=4; end   
            case 4: y +=4; end   
            case 5: x -=2; y +=4; end   
            case 6: x -=3; y +=3; end   
            case 7: x -=4; y +=2; end   
        end
        alpha-=2;
        if (alpha <= 0) break; end
        if (y >= 260) break; end
        if (estadojuego == 100) break; end
        frame;
    end
end