necesito consejos para conseguir mejores animaciones, por el momento uso image_speed pero me estoy plantenado usar otro tipo de metodo..alguna recomendacion?

Utiliza draw_sprite_ext() y sus variantes, puedes lograr resultados interesantes manipulando todos los aspectos, nada más tienes que hacer un bucle para controlar la animacion algo asi

Evento create
[gml]
i=0;
[/gml]

Evento draw
[gml]
i+=0.25;//frecuencia de la animación
var numF = 8;//la cantidad de fotogramas de el sprite
if(i>=numF){i=0;}

draw_sprite_ext(TuSprite,i,x,y,1,1,0,c_white,1);
[/gml]

#2 Marzo 04, 2022, 12:07:17 AM Ultima modificación: Marzo 04, 2022, 12:11:42 AM por Jeffrey Faper
Navegando por ahi me encontre con este script que permite controlar la duracion de cada frame de nuestra animacion usando listas, lo probe en un proyecto de prueba y funciona bien ahora toca  adaptarlo a mi proyecto para ver que tal funciona si me complica la vida no dudare en descartarlo y volver a lo clasico usar un monton de if aqui les dejo el script por si alguien le interesa

Evento create:
[gml]
frameSpeed = 1;     //The speed in FPS that the game counts through the frames to be displayed. Default is 1.
frameCounter = 0;   //Increases every frame by the frameSpeed.
currentFrame = 0    //The frame of the sprite currently being drawn on the screen.
frameData =-1;      //Current list of frame data the game is reading from, based on the animation that needs to play. Idle, run, attack, etc.
frameDuration = 0;   //Total number of in game frames to display the current sprite frame.
maxFrames = 0;      //The total number of frames in any given sprite.
animSprite =-1;     //The actual name of the sprite resource in GameMaker. sprMomo_Idle, for example.
frameDataIdle = ds_list_create();
frameDataAttack1 = ds_list_create();
[/gml]

setAnimation:
[gml]
//setAnimation(frameData,spriteIndex);
frameData = argument0;
animSprite = argument1;
maxFrames = sprite_get_number(animSprite)-1;

if(currentFrame>=maxFrames-1 && frameCounter==frameDuration){
   frameReset();
   }
   
   frameCounter += frameSpeed;
   frameDuration = ds_list_find_value(frameData,currentFrame);

if(frameCounter==frameDuration){
   currentFrame ++;
   frameCounter = 0;
   }
[/gml]

frameReset:
[gml]
frameCounter = 0;
currentFrame = 0;
[/gml]

EJEMPLO COMO USARLO:
[spoiler]
[gml]
currentAnim = animSprite;

switch ( state ) {
     case normal:
          //if the player is pushing left, or right, change to run sprite
          if ( left || right )
          {   
               ds_list_insert(frameDataIdle,0,300);  //data_animation, image_index , tiempo que durara el frame
               ds_list_insert(frameDataIdle,1,30);
              ds_list_insert(frameDataIdle,2,30);
              ds_list_insert(frameDataIdle,3,30);
              ds_list_insert(frameDataIdle,4,30);
              ds_list_insert(frameDataIdle,5,30);
               animation_set ( frameDataRun, runSprite );
               //if the player isn't pushing any buttons, change to idle sprite
          } else {
               animation_set ( frameDataIdle, idleSprite );
          }
     break;

     case dash:
          //if the player is in the dash state, change to the dash sprite
          animation_set ( frameDataDash, dashSprite );
     break;
}

//check the current animation against the last animation.
//If these animations are NOT the same, reset frameCounter and currentFrame to 0.

if(lastAnim != currentAnim)
{
     frame_reset();
     lastAnim = currentAnim;
}
[/gml]
[/spoiler]


en lo personal no me gusta que se vea tan complicado pero si le entiendes te funcionara, suerte

#4 Marzo 04, 2022, 05:47:33 AM Ultima modificación: Marzo 04, 2022, 07:37:09 AM por Jeffrey Faper
lo que me intereso de este script  fue comprobar si realmente valia la pena usarlo y he comparado ambos jugadores con los diferentes sistemas de animacion, las unicas diferencias que encontre fue  que con el script se pueden crear animaciones mas susceptibles al ojo humano y ademas se tiene un mayor control sobre las acciones del jugador durante las mismas animaciones,  lo cual esta bien, claro si mi juego fuese algo mas complicado como un juego de peleas o un hack'n slash, pero es un simple juego de plataformas asi que ya lo he descartado al menos para el jugador pero tal vez lo use para animar jefes o algo por el estilo....

Como lo sospechaba la persona que creo el script es un programador que trabajaba en un juego de peleas llamado kerffufle al parecer todo le salio mal quizo abarcar demasiado y crear un juego unico nada generico al final su proyecto dio mas problemas que alegrias y termino cancelandolo....aqui les dejo algunos tutoriales de esta persona llamada Nathan Ranney,  por si alguien le interesa hacer juegos simples de pelea o beat'em ups
https://developer.amazon.com/es-mx/docs/gamemaker/hitboxes-hurtboxes.html

Has animaciones por código, imagina que cualquier variable se puede animar, como hace Godot con su animador. Solo tienes que crear temporizadores, preferiblemente por código, luego asignar sus valores a algún parámetro del draw, por ejemplo, posiciones x,y escala, rotación, transparencia y ya. Los temporizadores pueden llevar funciones sinusoidales para que las animaciones sean suaves.

tiene razon siempre me olvido de los array resulta mas sencillo hacer animaciones asi,  tambien encontre un tutorial donde crean animaciones usando python y un archivo de texto pero me quedo con las array aunque no se si es mejor usar un arreglo 2d aqui les dejo el ejemplo
[gml]
///scrEnemyMove
var animArr;
var animLength;

//IMAGE_INDEX   DURACION DEL FRAME
animArr[0]=0;   animLength[0]=10;
animArr[1]=2;   animLength[1]=30;
animArr[2]=3;   animLength[2]=60;
animArr[3]=1;   animLength[3]=10;
animArr[4]=3;   animLength[4]=15;

var getFrame=animArr[index];
var getLength=animLength[index];
   
    frameTimer++;
    image_index = getFrame;
    sprite_index = sprEnemyMove;
   
if(frameTimer>=getLength){
    frameTimer = 0;
    index++;
    }
if(index>array_length_1d(animArr)-1){
    index = 0;
    }
[/gml]