Diagonales

Started by Futu-block, March 28, 2011, 02:43:47 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Futu-block

Al hacer las diagonales (arriba + derecha, por ej.) solo me hace derecha y si hago a la inversa solo me hace arriba...

todo viene del orden de pulsar las teclas
[code language="bennu"]         if (key(_right)) ...;
         elseif(key(_left)) ...;
         elseif(key(_up))...;
         elseif(key(_down))...;
         end[/code]

¿como lo remedio??
si fuera para wiz o caanoo hay un boton para cada pulsacion, pero para pc???

Rein (K´)ah Al-Ghul

Habra mejores formas...

if (key(_right)) ...;
//solo derecha
        if(not (key(_up) or key(_down) ) )
//derecha y arriba
        elseif ( key( _up) and not key(_down) )
//derecha y abajo
        elseif ( not key( _up) and  key(_down) )
        end
//las demas :P
elseif(key(_left)) ...;
elseif(key(_up))...;
elseif(key(_down))...;
end

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

SplinterGU

simplemente quita los else, deja if separados.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Abram

Pues si, a veces buscamos soluciones complejas a problemas sencillos :P

Futu-block

Quote from: SplinterGU on March 28, 2011, 03:24:48 PM
simplemente quita los else, deja if separados.
que vá jefe, siempre acude al orden, si tiene el primer if en arriba, acude a arriba, esté pulsado alante o atras...

pero como decia el pache: y le hago con diagonales de caanoo/wiz y a correr

aunque es buena idea la de Rein (K´)ah Al-Ghul, le voy a dar karma negativo que es lo que le gusta, jajaja

SplinterGU

segun entiendo, dices que lo que digo no es correcto...

para mi punto de vista si es correcto... y lo explico... la logica es esta...

- si pulso arriba decremento coordenada y
- si pulso abajo incremento coordenada y
- si pulso izquierda decremento coordenada x
- si pulso derecha incremento coordenada x

al ser "if" individuales, si vos pulsas arriba e izquierda, obtendras decremento de Y + decremento de x

en tu ejemplo, al usar else, cuando se ejecuta uno de los if, ya no se ejecutan el resto.

por ende, es correcta mi solucion, no entiendo por que dices que no lo es.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

no, yo estaba poniendole un valor a la variable segun lo que tenga pulsado...
esperate que lo compruebo y te digo lo que sea

Rein (K´)ah Al-Ghul

La verdad es que hay mas de una forma de hacer lo mismo...

La forma de Splinter es correcta...
por ejemplo para moverse, pero si las direcciones llaman por ejemplo a procesos/funciones, hay que diferenciar tmb los diagonales...

me acabo de dar cuenta que coloque dos veces la misma condicion :P

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

Futu-block

vale, esta vez pongo el codigo:
[code language="bennu"]
      if (key(_w))
         direci = 0;
      end
      if (key(_w) and key(_d))
         direci = 1;
      end
      if (key(_d) and x <= 305) //aqui es el unico momento en el que se mueve
         direci = 2;
         x++;
      end
      if (key(_d) and key(_x))
         direci = 3;
      end
      if (key(_x))
         direci = 4;
      end
      if (key(_a) and key(_x))
         direci = 5;
      end
      if (key(_a) and x >=15) //aqui es el unico momento en el que se mueve
         direci = 6;
         x--;
      end
      if (key(_w) and key(_a))
         direci = 7;
      end
[/code]

y no funciona las diagonales

Prg

#9
Quote from: Futublock on March 28, 2011, 09:34:15 PM
vale, esta vez pongo el codigo:
[code language="bennu"]
      if (key(_w))
         direci = 0;
      end
      if (key(_w) and key(_d))
         direci = 1;
      end
      if (key(_d) and x <= 305) //aqui es el unico momento en el que se mueve
         direci = 2;
         x++;
      end
      if (key(_d) and key(_x))
         direci = 3;
      end
      if (key(_x))
         direci = 4;
      end
      if (key(_a) and key(_x))
         direci = 5;
      end
      if (key(_a) and x >=15) //aqui es el unico momento en el que se mueve
         direci = 6;
         x--;
      end
      if (key(_w) and key(_a))
         direci = 7;
      end
[/code]

y no funciona las diagonales

bien, espero no meter la pata con algo fuera de lugar, pero no veo que hagas cambio de coordenadas excepto en los puntos donde comentas que ahí si se mueve. Creo que ese es el problema.

Si tienes un switch donde de acuerdo a la posición muevas en x e y entonces mi comentario no tiene validez..

Sin embargo creo que es más fácil y más limpio hacerlo como dice splinter. Si es muy necesario tener la dirección por alguna otra razón entonces necesitas el switch, haz algo así:
[code language="bennu"]if (key(_w))
direci = 0;
end
if (key(_w) and key(_d))
direci = 1;
end
if (key(_d) and x <= 305) //quité el x++ que es la razón de que se mueva
direci = 2;
end
if (key(_d) and key(_x))
direci = 3;
end
if (key(_x))
direci = 4;
end
if (key(_a) and key(_x))
direci = 5;
end
if (key(_a) and x >=15) //quité el x--
direci = 6;
end
if (key(_w) and key(_a))
direci = 7;
end

switch(direcci)
case 0:
y--;
end
case 1:
y--; x++;
end
case 2:
x++
end
//continuar el switch para cada caso, también puedes hacerlo con if

end

[/code]
existe otra opción, pero necesitas modificar las direcciones. Sería que la dirección fuera algo así:
[code language="bennu"]direccion=0;
if (key(_w))
direccion=direccion|1;
y--;
end

if (key(_s))
direccion=direccion|2;
y++;
end

if (key(_d))
direccion=direccion|4;
x++;
end

if (key(_a))
direccion=direccion|8;
y--;
end
[/code]
y ya tendr[ias las direcciones:

1 = arriba
2 = abajo

4=derecha
8= izquierda

9=arriba izquierda
10=abajo izquierda

5= derecha y arriba
6=derecha y abajo

esto tiene la ventaja de poco código y también tienes las direcciones (que no se para qué sean)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

¿No será problema de que hay teclas que no se pueden leer simultáneamente si se pulsan a la vez en el mismo frame?

Por el problema de las diagonales también en su día pensé un método para comprobar ciertas teclas en los frames pares y ciertas otras en los impares, pero no lo llevé a cabo...

A ver si dejáis un código elegante que ponga solución :D
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Hay un código que suelo usar en los casos en los que, como aquí, los efectos de las "4 direcciones básicas" no son acumulables. Hay que mirar el teclado numérico conforme se lee para entenderlo:

mi_dir=5;
if (key(_up)) mi_dir+=3; end
if (key(_down)) mi_dir-=3; end
if (key(_left)) mi_dir--; end
if (key(_right)) mi_dir++; end

De esta forma, mi_dir indica en qué dirección se mueve de las 8 posibles (5 es el centro, ausencia de movimiento), sólo hay que mirar el teclado numérico para entender la dirección en la que se mueve.
Acto seguido, se usa "SWITCH (mi_dir)" y listo ;) Lo bueno de usar SWITCH es que te permite agrupar algunas direcciones que hagan lo mismo, pero por lo general acabas siempre poniendo los 8 (o 9 en algunas ocasiones) casos.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Quote from: Drumpi on March 28, 2011, 11:59:35 PM
Hay un código que suelo usar en los casos en los que, como aquí, los efectos de las "4 direcciones básicas" no son acumulables. Hay que mirar el teclado numérico conforme se lee para entenderlo:

mi_dir=5;
if (key(_up)) mi_dir+=3; end
if (key(_down)) mi_dir-=3; end
if (key(_left)) mi_dir--; end
if (key(_right)) mi_dir++; end

De esta forma, mi_dir indica en qué dirección se mueve de las 8 posibles (5 es el centro, ausencia de movimiento), sólo hay que mirar el teclado numérico para entender la dirección en la que se mueve.
Acto seguido, se usa "SWITCH (mi_dir)" y listo ;) Lo bueno de usar SWITCH es que te permite agrupar algunas direcciones que hagan lo mismo, pero por lo general acabas siempre poniendo los 8 (o 9 en algunas ocasiones) casos.

jajaja... hablando de soluciones faciles...

vos pensas que si no entiende porque no le funcionan las diagonales va a entender el codigo que acabas de poner...

lo fantastico de este foro es que cada dia que pasa hay es una sorpresa... ;)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Quotejajaja... hablando de soluciones faciles...

vos pensas que si no entiende porque no le funcionan las diagonales va a entender el codigo que acabas de poner...

lo fantastico de este foro es que cada dia que pasa hay es una sorpresa...

Pues esa solución me ha dado la idea de tener una matriz 3x3 y mover una celda dentro de la matriz según qué tecla se pulsa, la posición final de la celda indicaría la dirección resultante. Lo veo elegante y más gráfico que usar un valor numérico, pero para programar eso ya se nos puede hacer caquita encima el Futu xD

Si alguien sube algún ejemplo funcionar con su método se puede valorar cuál es el mejor...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Futu-block

Quote from: Windgate on March 28, 2011, 11:57:52 PM
¿No será problema de que hay teclas que no se pueden leer simultáneamente si se pulsan a la vez en el mismo frame?


PREMIO


lo que no dije que las diagonales no son para moverse, sino para disparar...

probaré ''mejon'' que al disparar compruebe que tecla está pulsada y entonces varie la variable, valga la ''rindamboncia''