animaciones 8 direcciones sin tanto if

Publicado por Jeffrey Faper, Mayo 29, 2022, 02:36:12 AM

Tema anterior - Siguiente tema

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

Jeffrey Faper

Autor del script: Jeffrey Faper
Nombre del script: scrGetSprite();
Breve descripción de su función: ayuda a controlar nuestras animaciones en 8 direcciones sin usar mucho IF.
Versiones usadas: Game Maker 1.4 .
Versión del script: 1.0;

Le ha pasado que esta creando un juego donde el jugador se mueve o apunta en 8 direcciones y de repente
se da cuenta que todo su codigo esta lleno de esto:
[gml]
if(direction==0)if(direction==45)if(direction==180)if(direction==0.20)if(direction==45)if(direction==0*25/0)if(direction==0)if(direction==45)if(direction==0)
if(direction==0)if(direction==45)if(direction==1200)if(direction==0.90)if(direction==45)if(direction==0)if(direction==0)if(direction==45)if(direction==0)
if(direction==0)if(direction==45)if(direction==1300)if(direction==010)if(direction==45)if(direction==0)if(direction==0)if(direction==45)if(direction==0)
if(direction==0)if(direction==45)if(direction==1200)if(direction==0.90)if(direction==45)if(direction==0)if(direction==0)if(direction==45)if(direction==0)
[/gml]
Bueno pos pare de sufrir que aqui le traigo una solucion simple a este problema.

Tutorial Como Usar el script:

1 - Primero necesitamos saber  en que  direccion esta apuntando o moviendose el jugador y lo haremos con las siguientes variables
[gml]
//EVENTO CREATE JUGADOR
/*
podemos usar estas variables, si usted quiere puede cambiarles el nombre o si ya tiene una variable que haga lo mismo
simplemente cambie la variable aiming del script por la suya..
*/
horMove=0;
verMove=0;
aiming=0;  //almacenara las 8 direcciones que serian 0, 45, 90, 135, 180, 225, 270, 315..
[/gml]

2 - En el evento step del jugador pondremos lo siguiente
[gml]
//ESTE CODIGO NOS DIRA EN QUE DIRECCION ESTA APUNTANDO O MOVIENDOSE EL JUGADOR
horMove=(-keyboard_check(vk_left)+keyboard_check(vk_right));
verMove=(-keyboard_check(vk_up)+keyboard_check(vk_down));
if (horMove!=0 || verMove!=0){
    aiming=point_direction(0,0,horMove,verMove);
}
[/gml]

Algo de debug para ver que todo funcione bien
[gml]
//DRAW_GUI EVENT
draw_set_colour(c_red);
draw_text(176,64,
"PLAYER 1"
+"#AIMING :"+string(aiming));
[/gml]


3 - Ahora ya podemos usar nuestro script el cual consta de un array que almacenara las 8 direcciones y su correspondiente sprite
ademas dividira las direcciones almacenadas en la variable aiming entre 45 para obtener el index del array y asi dibujar el sprite que deseado...
scrGetSprite():
[gml]
///scrGetSprite(0,45,90,135,180,225,270,315);
var sprArray;
var sprIndex;
var index;

index=floor(aiming/45.0);

sprArray[0]=argument0;
sprArray[1]=argument1;
sprArray[2]=argument2;
sprArray[3]=argument3;
sprArray[4]=argument4;
sprArray[5]=argument5;
sprArray[6]=argument6;
sprArray[7]=argument7;

sprIndex=sprArray[index];

return sprIndex;
[/gml]

Para finalizar un ejemplo de como usarlo,  como puede ver yo estoy usando una variable llamada sprindex por que estoy dibujando el personaje
con las funciones de dibujo de Game Maker - draw_text_ext() si usted usa sprite_index lo llamaria de la misma manera
sprite_index=scrGetSprite(sprAttack0, sprAttack45, sprAttack90, );
[gml]
//ESTADO CORRER DE  MI PERSONAJE
//RUNNING
    if(horMove<>0){     
        maxspdx=1.95375;
        //corriendo
        if(!shooting){
            imgspd+=0.2;
            sprindex=scrGetSprite(sprR_0180,sprR_45135,sprShootUp,sprR_45135,sprR_0180,sprR_225315,sprDuckShoot,sprR_225315);
        }
       //corriendo y disparando
        if(shooting){
            imgspd+=0.4;
            sprindex=scrGetSprite(sprRS_0180,sprRS_45135,sprShootUp,sprRS_45135,sprRS_0180,sprRS_225315,sprDuckShoot,sprRS_225315);
        }
    }
[/gml]


si tiene dudas o hay algun error no dude en comentar xd..



Powered by EzPortal
SMF spam blocked by CleanTalk