Fallo en Sprites "STAND" según posición DIAGONAL (WASD) [RESUELTO]

Publicado por avengeralt, Julio 14, 2021, 10:06:15 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

avengeralt

Hola, muy buenas. Antes de nada, decir que llevo muy pocos días en este mundo y soy un completo novato (espero que tengáis paciencia conmigo). Bueno, aquí os expongo mi problema, a ver si podéis ayudarme a resolverlo porque lo he intentado de diferentes maneras por mi mismo pero estoy atascado así que: aquí estoy.

Estoy haciendo un movimiento de personaje WASD con posiciones en diagonal, tanto para "Stand" como para "Walk", aquí os dejo la parte del código dónde tengo el problema:

[gml]//movimiento
left = keyboard_check(ord("A"));
right = keyboard_check(ord("D"));
up = keyboard_check(ord("W"));
down = keyboard_check(ord("S"));
diagonalupleft = up and left;
diagonalupright = up and right;
diagonaldownleft = down and left
diagonaldownright = down and right;
//Walk
if (left) {sprite_index = sprDemonWalkL; }
if (right) {sprite_index = sprDemonWalkR; }
if (up) {sprite_index = sprDemonWalkU; }
if (down) {sprite_index = sprDemonWalkD; }
if (diagonalupleft) {sprite_index = sprDemonWalkDiagonalUpL; }
if (diagonalupright) {sprite_index = sprDemonWalkDiagonalUpR; }
if (diagonaldownleft) {sprite_index = sprDemonWalkDiagonalDownL; }
if (diagonaldownright) {sprite_index = sprDemonWalkDiagonalDownR; }
//Stand
if keyboard_check_released(ord("A")) {sprite_index = sprDemonStandL; }
if keyboard_check_released(ord("D")) {sprite_index = sprDemonStandR; }
if keyboard_check_released(ord("W")) {sprite_index = sprDemonStandU; }
if keyboard_check_released(ord("S")) {sprite_index= sprDemonStandD; }
//????RESOLVER STAND DIAGONALES
if keyboard_check_released(ord("W")) and keyboard_check_released(ord("A")) {sprite_index = sprDemonStandDiagonalUpL; }
if keyboard_check_released(ord("W")) and keyboard_check_released(ord("D")) {sprite_index = sprDemonStandDiagonalUpR; }
if keyboard_check_released(ord("S")) and keyboard_check_released(ord("A")) {sprite_index = sprDemonStandDiagonalDownL; }
if keyboard_check_released(ord("S")) and keyboard_check_released(ord("D")) {sprite_index = sprDemonStandDiagonalDownR; }[/gml]

Como podréis imaginar, todo va bien hasta que cuando pulso por ejemplo "A + W" para moverme hacia la diagonal superior izquierda, el personaje se mueve correctamente con el Sprite indicado, pero a la hora de soltar los botones, pelean las funciones de Stand para "derecha, izquierda, arriba, abajo", por lo que a veces (cuando sueltas los botones al mismo tiempo), se queda en la posición correcta, mientras que (normalmente), al no soltarse al mismo tiempo, se queda en una posición "Stand" incorrecta.

He probado varias cosas, incluso intenté hacer una especie de "Cheat", dónde diferentes combinaciones de botones (según el timeing), me devolviera a la posición correcta. Lo intenté, pero no me salió bien. Añadí al "combo" los botones "Up", para que el combo contara cuando soltara los botones. Traté de hacer combinaciones tipo "AWAW" "WAWA" "AWWA" "WAAW" y diferentes posibilidades para que el personaje terminase en la posición correcta, pero no me salió bien. Obviamente no tengo los conocimientos como para que eso me saliera bien, pero bueno, yo lo intenté.

He probado a devolver la posición según a qué grados se dirige el personaje y también he probado a poner la posición "Stand" dentro del mismo sprite (siendo este el primero y así saltarlo cuando se moviera), pero tampoco me resultó. Imagino que todas las posibilidades que intenté podrían haber sido viables pero no tengo los conocimientos todavía.

Me gustaría resolver este problema de la manera más rápida y sin tener que volver a hacer todo el código de nuevo (que ya lo he intentado también), aunque si no tuviera elección, lo haría. Por favor, os agradecería mucho si me ayudarais con este problemita para poder avanzar en el juego. He añadido otras funciones, tipo sprint y próximamente botones de ataque, pero me tiene frustrado este problema ya que yo quiero que la posición a la que se devuelva diagonalmente sea siempre correcta (y quiero que mi juego sea por movimiento WASD). Digo lo del movimiento WASD porque no quiero tener que añadir los movimientos diagonales a "Q" o "E" por ejemplo, porque sería muy rara la jugabilidad, (esto ya lo he hecho también pero no es lo que busco). Gracias de antemano, espero que podáis ayudarme.






Black_Cat

Yo usaría una variable, por ejemplo, "DiagonalArribaIzquierda" que sea booleana, es decir o toma true o toma false.
Entonces cuando el jugador hace la diagonal, esta variable queda en true, luego al soltar cualquiera de las dos teclas , ya sea arriba o izquierda, al estar la variable en true, se pondría en el sprite correcto, a groso como asi:

[gml]var DAI //variable diagonal izquierda

if up and left //si se presionan ambas teclas para hacer la diagonal
      DAI = true //setear a true
else
      DAI = false

if keyboard_check_released("A") and DAI = true
          sprite_index  = sprite_correcto
if keyboard_check_released("W") and DAI = true
          sprite_index  = sprite_correcto

[/gml]

avengeralt

Cita de: Black_Cat en Julio 14, 2021, 08:39:04 PM
Yo usaría una variable, por ejemplo, "DiagonalArribaIzquierda" que sea booleana, es decir o toma true o toma false.
Entonces cuando el jugador hace la diagonal, esta variable queda en true, luego al soltar cualquiera de las dos teclas , ya sea arriba o izquierda, al estar la variable en true, se pondría en el sprite correcto, a groso como asi:

[gml]var DAI //variable diagonal izquierda

if up and left //si se presionan ambas teclas para hacer la diagonal
      DAI = true //setear a true
else
      DAI = false

if keyboard_check_released("A") and DAI = true
          sprite_index  = sprite_correcto
if keyboard_check_released("W") and DAI = true
          sprite_index  = sprite_correcto

[/gml]

Muchas gracias por tu respuesta. Lamentablemente, algo estoy haciendo mal. ¿Cómo se escribiría? Puse esto:

[gml]var DAI  {
   if (diagonalupleft) {
      DAI = true;
   }else {
      DAI = false;
   }
}

if keyboard_check_released(ord("A") and DAI = true {
   sprite_index  = sprDemonStandDiagonalUpL;
}
if keyboard_check_released(ord("W")) and DAI = true {
   sprite_index  = sprDemonStandDiagonalUpL;
}[/gml]

y añadí esto a las posiciones derecha y arriba:

[gml]if keyboard_check_released(ord("A")) and DAI = false {sprite_index = sprDemonStandL; }
if keyboard_check_released(ord("W")) and DAI = false {sprite_index = sprDemonStandU; } [/gml]

Para comprobar si funcionaba realmente eliminé esta barra de código:
[gml]//if keyboard_check_released(ord("W")) and keyboard_check_released(ord("A")) {sprite_index = sprDemonStandDiagonalUpL; } [/gml]

Pero al ejecutar el juego, ahora no me devuelve ninguna posición "StandDiagonalUpL", se queda caminando. Traté de escribirlo tal y como me indicaste, pero me daba error. ¿Qué debería cambiar? Estoy usando Game Maker Studio 2.3.2.560.

Muchas gracias.

PD: Que esté usando la versión Trial no tiene nada que ver, ¿no?

Black_Cat

A lo mejor está conflictuando con algun sprite_index, y seguirlo asi es muy complicado, te recomiendo que hagás una maquina de estado para tener todo organizado o debuggearlo paso a paso para ver donde y cuándo es que cambia de sprite

avengeralt

Cita de: Black_Cat en Julio 15, 2021, 03:54:54 PM
A lo mejor está conflictuando con algun sprite_index, y seguirlo asi es muy complicado, te recomiendo que hagás una maquina de estado para tener todo organizado o debuggearlo paso a paso para ver donde y cuándo es que cambia de sprite

Gracias. Tema resuelto.

219 Visitantes, 0 Usuarios