Marzo 09, 2021, 08:32:06 AM Ultima modificación: Marzo 09, 2021, 09:06:37 AM por LuciaHedgehog
hola buenas, noche, días o en donde vean esto. Quería saber más acerca de estas máquinas de estado y el problema surge en uno de los códigos que indicaré más adelante... ABAJO HAY UN VIDEO ADJUNTO SOBRE EL PROBLEMA GRÁFICO (sprites)

Por ahora pondré el código en orden de como lo fui construyendo la maquina de estados  y empiezo en el evento CREATE del OBJETO_PLAYER

///crear variables para la maquina
[gml]enum ej
    {
    normal = player_normal, /// cuando no se mueve, es un script
    caminando = player_caminando ///script que hará cambiar de sprites con el switch
   
    }

dir ="abajo"; ///dirección por defecto que esta en el switch
estado = ej.normal; ///estado de la maquina por defecto
[/gml]

---- En la carpeta de scripts, dejare como esta en orden primero es:
[gml]///cuando el personaje no hace nada y como es scrolling vertical el sprite aparece caminado normal
sprite_index =player_run_spr;
image_speed = 0.3;[/gml]

----- en otro script esta el código de todas las direcciones...


[gml]////aclaro que en el case arriba y abajo son el mismo sprite y solo cambio la velocidad
switch (dir)
{

case "abajo":
sprite_index = player_run_spr;
image_speed = 0.2;
break;

case "arriba":
sprite_index = player_run_spr;
image_speed = 0.8;
break;


case "izquierda":
sprite_index = player_run_izq_spr;
image_speed = 0.6;
break;

case "derecha":
sprite_index = player_run_der_spr;
image_speed = 0.6;
break;
}[/gml]

EL PROBLEMA SURGE AQUI  :GMS: AL APRETAR DOS TECLAS A LA VEZ ESTE NO LO DETECTA, SOLO DETECTA LAS 4 DIRECCIONES QUE ES UP,DOWN,LEFT Y RIGHT.  LO QUE NECESITO ES COMO: puedo hacer que el player con el teclado detecte las 8 direcciones en ves de de 4???? .. OJO no quiero poner sprites demás solo quiero que el jugador solo cambie su  sprite como en el ejemplo de abajo que al apretar vk_right + vk_up or down se quedo como : player_run_der_spr.... y viceversa con el vk _left

si vieron el video adjunto solo se aprecia a ver que solo se ejecuta por el left y right, pero no en las diagonales, no se si me explico.  :-[

[gml]///control maquina estados animaciones

if keyboard_check (vk_up) {dir = "arriba"} ///funciona
else if  keyboard_check (vk_down) {dir = "abajo"} ///funciona
else if  keyboard_check (vk_left) {dir = "izquierda"} ///funciona
else if  keyboard_check (vk_left) + keyboard_check (vk_up) or keyboard_check (vk_down) {dir = "izquierda"} ///Error
else if keyboard_check (vk_right) { dir = "derecha"} ///funciona
else if keyboard_check (vk_right) + keyboard_check (vk_up) or keyboard_check (vk_down) {dir = "derecha"} /// error
if (dir !="" )
{
estado = ej.caminando;

}
if (vv==0)and (vh==0) ////la vv es velocidad vertical y vh es la velocidad horizontal
{
estado = ej.normal; ///si no detecta movimiento por ende se regresa al sprite stand o normal, aquí todo perfecto
}
script_execute (estado);[/gml]
@MAFYGAMES-

Recuerda que los else solo se ejecutan si su if es falso, en el caso del código que pones:
[gml]
if keyboard_check (vk_up) {dir = "arriba"} ///funciona
else if  keyboard_check (vk_down) {dir = "abajo"} ///funciona
else if  keyboard_check (vk_left) {dir = "izquierda"} ///funciona
else if  keyboard_check (vk_left) + keyboard_check (vk_up) or keyboard_check (vk_down) {dir = "izquierda"} ///Error
else if keyboard_check (vk_right) { dir = "derecha"} ///funciona
else if keyboard_check (vk_right) + keyboard_check (vk_up) or keyboard_check (vk_down) {dir = "derecha"} /// error[/gml]

Desde el comienzo cuando presionas vk_up o vk_down el código ignora todas las otras comprobaciones, incluyendo las comprobaciones de si Up o Down están presionados junto a otra dirección horizontal.

Puedes solucionarlo checando las direcciones horizontales primero de manera que sean ellas las que tengan prioridad, o checando las direcciones verticales y horizontales en diferentes ifs anidados de manera que la última comprobación sobreescriba la primera. Por cierto, ya que el resultado de vk_left  es el mismo que el de vk_left + vk_up or vk_down puedes quitar la comprobación más compleja, lo mismo para vk_right.

Al final yo lo dejaria así:

[gml]if keyboard_check (vk_up) {dir = "arriba"}
else if  keyboard_check (vk_down) {dir = "abajo"}

if  keyboard_check (vk_left) {dir = "izquierda"}
else if keyboard_check (vk_right) { dir = "derecha"}[/gml]

Hola, muchas gracias y si ese fue el problema, de echo hace rato le preguntaba a unos amigos y me decian que era parte del switch que luego de pura gracias se me ocurrió quitar todos los else y si me sirvió , solo que usaré el que dices para no extenderlo tanto jeje

Cita de: Void en Marzo 09, 2021, 08:46:53 PM

Al final yo lo dejaria así:

[gml]if keyboard_check (vk_up) {dir = "arriba"}
else if  keyboard_check (vk_down) {dir = "abajo"}

if  keyboard_check (vk_left) {dir = "izquierda"}
else if keyboard_check (vk_right) { dir = "derecha"}[/gml]
@MAFYGAMES-