Advertisement
Guest User

Gamemaker Cubic Easing

a guest
Oct 26th, 2016
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define scr_easing
  2. ///scr_easing(y,sec,acc)
  3. // argument0 = y; // current y value
  4. // argument1 = sec; // total easing duration in seconds
  5. // argument2 = up; // TRUE is accelerating, FALSE is decelerating
  6.  
  7. var y_sign=sign(argument0); // check for reverse deceleration
  8. argument0=abs(clamp(argument0,-1,1)); // sanitize input
  9.  
  10. easing_return[0]=0; // new y value will go here
  11. easing_return[1]=0; // distance to move will go here
  12.  
  13. if(argument2) { // if accelerating
  14.  
  15.     var x_current=1-(scr_cuberoot(1-argument0)); // current x value
  16.     var x_next=x_current+(delta/(60*argument1)); // next x value
  17.     var x_over=0;
  18.     if (x_next>1) {
  19.         x_over=x_next-1;
  20.         x_next=1;
  21.     }
  22.  
  23.     easing_return[0]=1+power(x_next-1,3); // set new y value
  24.     easing_return[1]=(((x_next+(power(x_next-1,4)/4))-(x_current+(power(x_current-1,4)/4)))+x_over)*60*argument1; // set distance to move
  25.  
  26. } else if(y_sign!=0) { // if decelerating (can’t decelerate when speed is 0)
  27.  
  28.     var x_current=scr_cuberoot(argument0); // current x value
  29.     var x_next=max(0,x_current-(delta/(60*argument1))); // next x value (can’t go below 0)
  30.    
  31.     easing_return[0]=power(x_next,3); // set new y value
  32.     easing_return[1]=((power(x_current,4)/4)-(power(x_next,4)/4))*60*argument1*y_sign; // set distance to move (reverse if input vector was negative)
  33.  
  34. }
  35.  
  36. return(easing_return);
  37.  
  38. ////////////////////// FORMULAS //////////////////////
  39. //
  40. // easeOutCubic                  used for acceleration
  41. //
  42. // y=(x-1)^3+1                   (1+power(x-1,3))
  43. // x=1-(1-y)^(1/3)               (1-scr_cuberoot(1-y))
  44. // fx dt=x+((x-1)^4)/4           (x+power(x-1,4)/4)
  45. //
  46. // easeInCubic                   used for deceleration
  47. //
  48. // y=x^3                         power(x,3)
  49. // x=y^(1/3)                     scr_cuberoot(y)
  50. // fx dt=(x^4)/4                 power(x,4)/4
  51. //
  52. ////////////////////// //////// //////////////////////
  53.  
  54. #define scr_cuberoot
  55. ///cuberoot(x)
  56. // argument0 = x; // value to get cube root from
  57.  
  58. return sign(argument0) * power(abs(argument0), 1/3);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement