Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Futu-block on March 28, 2011, 02:43:47 PM

Title: Diagonales
Post by: Futu-block on March 28, 2011, 02:43:47 PM
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???
Title: Re: Diagonales
Post by: Rein (K´)ah Al-Ghul on March 28, 2011, 03:03:40 PM
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
Title: Re: Diagonales
Post by: SplinterGU on March 28, 2011, 03:24:48 PM
simplemente quita los else, deja if separados.
Title: Re: Diagonales
Post by: Abram on March 28, 2011, 06:19:41 PM
Pues si, a veces buscamos soluciones complejas a problemas sencillos :P
Title: Re: Diagonales
Post by: Futu-block on March 28, 2011, 08:20:03 PM
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: (http://fotos.subefotos.com/5c5830ed5ecedddad9d48954f2b89da6o.jpg) 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
Title: Re: Diagonales
Post by: SplinterGU on March 28, 2011, 08:26:16 PM
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.
Title: Re: Diagonales
Post by: Futu-block on March 28, 2011, 09:08:54 PM
no, yo estaba poniendole un valor a la variable segun lo que tenga pulsado...
esperate que lo compruebo y te digo lo que sea
Title: Re: Diagonales
Post by: Rein (K´)ah Al-Ghul on March 28, 2011, 09:27:12 PM
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
Title: Re: Diagonales
Post by: Futu-block 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
Title: Re: Diagonales
Post by: Prg on March 28, 2011, 11:52:35 PM
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)
Title: Re: Diagonales
Post by: 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?

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
Title: Re: Diagonales
Post by: 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.
Title: Re: Diagonales
Post by: SplinterGU on March 29, 2011, 01:08:44 AM
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... ;)
Title: Re: Diagonales
Post by: Windgate on March 29, 2011, 03:24:33 AM
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...
Title: Re: Diagonales
Post by: Futu-block on March 29, 2011, 07:29:27 AM
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''
Title: Re: Diagonales
Post by: SplinterGU on March 29, 2011, 10:36:18 AM
no, el problema que dice wind de las teclas simultaneas es de hard, y no son esas teclas y esa cantidad de teclas las que dan problemas.
Title: Re: Diagonales
Post by: Yawin on March 29, 2011, 11:17:11 AM
Mi recomendación:


mi_dir=0;
if (key(_up))
    mi_dir+=1;
end
if (key(_down))
    mi_dir+=3;
end
if (key(_left))
   mi_dir+=7;
end
if (key(_right))
   mi_dir+=11;
end


Logo tienes los casos:
Arriba=1;
Arriba-derecha=12;
Derecha=11;
Derecha-abajo=14;
abajo=3;
Abajo-izquierda=10;
Izquierda=7;
Arriba-izquierda=8;

Parece complicado, pero es como los permisos de linux: El número que tome "mi_dir" sólo puede aparecer por una combinación determinada. Logo, sólo tienes que hacer un switch.
Title: Re: Diagonales
Post by: SplinterGU on March 29, 2011, 01:37:12 PM
si nos vamos a poner en optimus prime, entonces...


direction=(key(_up)?1h:0)|(key(_down)?2h:0)|(key(_left)?4h:0)|(key(_right)?8h:0);


donde direccion es igual a:
sin pulsacion = 0h
arriba = 1h
abajo = 2h
izquierda = 4h
derecha = 8h
arriba+izquierda = 5h
arriba+derecha = 9h
abajo+izquierda = 6h
abajo+derecha = 10h

y podriamos seguir combinando, hasta obtener las 15 combinaciones posibles.

esta es la mas optima de todas, pero la idea es hacerlo simple para que futu lo entienda.
Title: Re: Diagonales
Post by: Rein (K´)ah Al-Ghul on March 29, 2011, 02:48:53 PM
Quote from: Windgate on March 29, 2011, 03:24:33 AM
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...
Eso no es mala idea, tambien serviria para probars joys :P

Quote from: SplinterGU on March 29, 2011, 01:37:12 PM
si nos vamos a poner en optimus prime, entonces...


direction=(key(_up)?1h:0)|(key(_down)?2h:0)|(key(_left)?4h:0)|(key(_right)?8h:0);


donde direccion es igual a:
sin pulsacion = 0h
arriba = 1h
abajo = 2h
izquierda = 4h
derecha = 8h
arriba+izquierda = 5h
arriba+derecha = 9h
abajo+izquierda = 6h
abajo+derecha = 10h

y podriamos seguir combinando, hasta obtener las 15 combinaciones posibles.

esta es la mas optima de todas, pero la idea es hacerlo simple para que futu lo entienda.
Aun tengo pendiente el trabajo con variables a nivel bit...
es muy buena solucion y ocupa poca memoria, ( con un byte tendriamos dos controles...)
Title: Re: Diagonales
Post by: Futu-block on March 29, 2011, 10:08:09 PM
Quote from: SplinterGU on March 29, 2011, 01:37:12 PM
si nos vamos a poner en optimus prime, entonces...


direction=(key(_up)?1h:0)|(key(_down)?2h:0)|(key(_left)?4h:0)|(key(_right)?8h:0);


donde direccion es igual a:
sin pulsacion = 0h
arriba = 1h
abajo = 2h
izquierda = 4h
derecha = 8h
arriba+izquierda = 5h
arriba+derecha = 9h
abajo+izquierda = 6h
abajo+derecha = 10h

y podriamos seguir combinando, hasta obtener las 15 combinaciones posibles.

esta es la mas optima de todas, pero la idea es hacerlo simple para que futu lo entienda.

gracias venerable maestro astilla ¬¬  pero...
como puedo entender lo que son las interrogaciones?? ^^U
¿y el simbolo '' | '' como se pone? que lo he copiado y pegado...
Title: Re: Diagonales
Post by: SplinterGU on March 29, 2011, 10:55:26 PM
el simbolo "|", lo has puesto en el post... es el pipe... esta junto a la tecla 1, que ademas tiene el simbolo !, el otro simbolo, la barra dividida es el pipe.

con respecto al signo de pregunta es...

(si condicion)?<valor true>:<valor false>

no se permiten instrucciones (que no devuelvan valor) es solo para expresiones.
Title: Re: Diagonales
Post by: Prg on March 30, 2011, 12:04:13 AM
mmmmm!!

y por qué sólo las diagonales?

si es para disparar mejor mete ángulos y yá
Title: Re: Diagonales
Post by: Futu-block on March 30, 2011, 02:48:53 PM
Quote from: SplinterGU on March 29, 2011, 10:55:26 PM
el simbolo "|", lo has puesto en el post... es el pipe... esta junto a la tecla 1, que ademas tiene el simbolo !, el otro simbolo, la barra dividida es el pipe.

con respecto al signo de pregunta es...

(si condicion)?<valor true>:<valor false>

no se permiten instrucciones (que no devuelvan valor) es solo para expresiones.

buf...
voy a copiar-pegar y probar...

como odio usar codigo ajeno y no lo digo por esto :(



Edito:
¿y como guardo la ultima pulsacion? osea como hago que respete la ultima vez que pulse....


espera; vi en algun codigo eso de ''variable_provisional''...