Problema con Bennugd

Started by oriun, October 01, 2010, 03:14:06 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

oriun


oriun

Implementado.
J**r DCelso, eres un maquina. :P

SplinterGU

tambien puedes usar la libreria events que arme yo, y sirve para eso, para detectar cuando una tecla se pulsa, cuando esta pulsada y/o cuando la soltas.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

oriun

Splinter, he utilizado el método de DCelso, porque cuando vi tu post ya lo implementé y porque me parecía más sencillo para un código tan corto.

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

oriun

#66
El de DCelso, pero le tuve que hacer una corrección ínfima a su código: no se debe poner
if (key(_space)&& misteclas[1]==0)
    //lo que se supone q hace el space
    misteclas[1]=1;
else
    misteclas[1]=0;
end

Sino
if (key(_space))
    if (misteclas[1]==0)
         //lo que se supone que hace la tecla space
    End
    misteclas[1]=1;
Else
    Misteclas[1]=0;
end


Aunque en mi caso utilizo una variable int, porque solo tengo que controlar la tecla space, para hacer un disparo por pulsación.

SplinterGU

Quote from: oriun on November 18, 2010, 04:55:32 PM
El de DCelso, pero le tuve que hacer una corrección ínfima a su código: no se debe poner
if (key(_space)&& misteclas[1]==0)
     //lo que se supone q hace el space
     misteclas[1]=1;
else
     misteclas[1]=0;
end

Sino
if (key(_space))
     if (misteclas[1]==0)
          //lo que se supone que hace la tecla space
     End
     misteclas[1]=1;
Else
     Misteclas[1]=0;
end


Aunque en mi caso utilizo una variable int, porque solo tengo que controlar la tecla space, para hacer un disparo por pulsación.

es correcto, porque sino de la forma que puso DCelso, seria como un autodisparo (intermitente, un frame si, un frame no)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

oriun

Me fijé mientras lo implementaba

DCelso

umn, no se, a mi parecer es lo mismo, lo he probado en un ejemplo práctico y me va igual, pero es lo de menos.
De todas formas, para ser fiel a mi ejemplo deberías poner
if (key(_space))
     if (misteclas[_space]==0)
          //lo que se supone que hace la tecla space
     End
     misteclas[_space]=1;
Else
     Misteclas[_space]=0;
end
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

oriun

Quote from: DCelso on November 18, 2010, 11:05:43 PM
umn, no se, a mi parecer es lo mismo, lo he probado en un ejemplo práctico y me va igual, pero es lo de menos.
De todas formas, para ser fiel a mi ejemplo deberías poner
if (key(_space))
     if (misteclas[_space]==0)
          //lo que se supone que hace la tecla space
     End
     misteclas[_space]=1;
Else
     Misteclas[_space]=0;
end

Así si esta bien, pero si juntas los dos IF en un condicional con el operador &&, cada frame se cambia el valor de misteclas.

DCelso

en este caso tambien, siempre estará la tecla escape pulsada o no pulsada. asi que entrará a poner a 1 mis teclas cuando esté pulsada y a 0 cuando no lo esté.
vamos a ver
if a==1  then
if b==2 then
   if c ==3 then
        //haz lo que sea
   end
end
end

es exactamente lo mismo que
if a==1 && b==2 && c==3 then
   //haz lo que sea
end
porque es eso mismo lo que hace internamente el compilador, mira si a vale uno, si lo vale mira si b vale 2 si lo vale mira si c vale 3.
Así que no me valen vuestras explicaciones de porqué no se comporta igual, pero sigo diciendo que es lo de menos usar la primera forma, ya que esta puede abrir más posibilidades en el futuro aún siendo menos óptima al necesitar un comparador más.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

de todas formas la solución de splinter es mejor, creo, porque es más portable y cómoda de usar para futuros juegos :D.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

oriun

Pero no consigo hacerla funcionar :P

Anyeos

DCelso no entendiste me parece.

Si vos ponés if if if y luego end end end, lo que está al medio de todo perfecto corresponde a hacer && && && porque es lo mismo, pero que tal si hay algo adentro de un if pero no adentro del otro? No es lo mismo.

if if if <algo> end end end, no es lo mismo que if <algo> if if <otro algo> end end end.
El algo primero se ejecuta solamente con el primer condicional pero el otro algo se ejecuta con los tres condicionales verdaderos. O sea que para ejecutar el primero se usa if <algo> end y para el segundo es donde podés usar &&: if esto && esto && esto <otro algo> end

La idea de ese algoritmo es que se detecte una tecla presionada, esa tecla presionada ejecuta algo y a su vez impide seguir ejecutando eso indefinidamente. (Bueno, es lo que querían hacer en este post). Y como lo hace? Activando una variable. Entonces luego para no volver a ejecutar eso comprueba la variable. Pero no modifica más la variable sino hasta que la tecla deje de estar apretada. Y para saber eso necesitas usar una condición aparte y no combinarla con && porque en cuanto la variable cambió la condición te va a dar falso y se ejecutaría el código una vez sí (cuando la variable no está seteada) y una vez no (cuando la variable estaba seteada). Eso haría un efecto intermitente que no era lo que querían hacer (bueno, depende el caso).

Yo para controlar disparos uso un "contador". Seteo una variable a un valor, por ejemplo 5, luego decremento esa variable (siempre la decremento). Y en una condición detectando cuando es <= 0 permito la ejecución del disparo. Y es ahí cuando la seteo a un valor (por ejemplo 5). Entonces los disparos saldrán cada 5 veces menos (algo así).
Eso me limita que los disparos salgan a cierto intervalo de tiempo y no todos juntos.
Cambiando el valor 5 por otro modificaremos el intervalo (cuanto mayor el número menos disparos van a salir o más largo será el intervalo entre disparo).

local
int rarma;

loop

...
<... codigo del proceso ...>
...

// Decremento la variable
rarma--;
// No dejo que rarma se haga negativa
if (rarma <= 0) rarma = 0; end

// Disparamos el laser
        if (key(_L_Control))
            if (rarma <= 0)
            Laser(x, y, angle);
            rarma = 5;
            end
       end

...
...
...

frame;
end