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???
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
simplemente quita los else, deja if separados.
Pues si, a veces buscamos soluciones complejas a problemas sencillos :P
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
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.
no, yo estaba poniendole un valor a la variable segun lo que tenga pulsado...
esperate que lo compruebo y te digo lo que sea
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
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
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)
¿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
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.
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... ;)
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...
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''
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.
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.
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.
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...)
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...
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.
mmmmm!!
y por qué sólo las diagonales?
si es para disparar mejor mete ángulos y yá
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''...