lib/cyberarm_engine/animator.rb in cyberarm_engine-0.19.0 vs lib/cyberarm_engine/animator.rb in cyberarm_engine-0.19.1

- old
+ new

@@ -1,219 +1,219 @@ -module CyberarmEngine - class Animator - def initialize(start_time:, duration:, from:, to:, tween: :linear, &block) - @start_time = start_time - @duration = duration - @from = from.dup - @to = to.dup - @tween = tween - @block = block - end - - def update - @block.call(self, @from, @to) if @block - end - - def progress - ((Gosu.milliseconds - @start_time) / @duration.to_f).clamp(0.0, 1.0) - end - - def complete? - progress >= 1.0 - end - - def transition(from = @from, to = @to, tween = @tween) - from + (to - from) * send("tween_#{tween}", progress) - end - - def color_transition(from = @from, to = @to, _tween = @tween) - r = transition(from.red, to.red) - g = transition(from.green, to.green) - b = transition(from.blue, to.blue) - a = transition(from.alpha, to.alpha) - - Gosu::Color.rgba(r, g, b, a) - end - - def color_hsv_transition(from = @from, to = @to, tween = @tween) - hue = transition(from.hue, to.hue, tween) - saturation = transition(from.saturation, to.saturation, tween) - value = transition(from.value, to.value, tween) - alpha = transition(from.alpha, to.alpha, tween) - - Gosu::Color.from_ahsv(alpha, hue, saturation, value) - end - - # Tween functions based on those provided here: https://github.com/danro/easing-js/blob/master/easing.js - # Under MIT / BSD - - def tween_linear(t) - t - end - - def tween_ease_in_quad(t) - t ** 2 - end - - def tween_ease_out_quad(t) - -((t - 1) ** 2) -1 - end - - def tween_ease_in_out_quad(t) - return 0.5 * (t ** 2) if (t /= 0.5) < 1 - return -0.5 * ((t -= 2) * t - 2) - end - - def tween_ease_in_cubic(t) - t ** 3 - end - - def tween_ease_out_cubic(t) - ((t - 1) ** 3) + 1 - end - - def tween_ease_in_out_cubic(t) - return 0.5 * (t ** 3) if ((t /= 0.5) < 1) - return 0.5 * ((t - 2) ** 3) + 2 - end - - def tween_ease_in_quart(t) - t ** 4 - end - - def tween_ease_out_quart(t) - -((t - 1) ** 4) - 1 - end - - def tween_ease_in_out_quart(t) - return 0.5 * (t ** 4) if ((t /= 0.5) < 1) - return -0.5 * ((t -= 2) * (t ** 3) - 2) - end - - def tween_ease_in_quint(t) - t ** 5 - end - - def tween_ease_out_quint(t) - ((t - 1) ** 5) + 1 - end - - def tween_ease_in_out_quint(t) - return 0.5 * (t ** 5) if ((t /= 0.5) < 1) - return 0.5 * ((t - 2) ** 5) + 2 - end - - def tween_ease_in(t) # sine - -Math.cos(t * (Math::PI / 2)) + 1 - end - - def tween_ease_out(t) # sine - Math.sin(t * (Math::PI / 2)) - end - - def tween_ease_in_out(t) # sine - (-0.5 * (Math.cos(Math::PI * t) - 1)) - end - - def tween_ease_in_expo(t) - (t == 0) ? 0 : 2 ** 10 * (t - 1) - end - - def tween_ease_out_expo(t) - (t == 1) ? 1 : -(2 ** -10 * t) + 1 - end - - def tween_ease_in_out_expo(t) - return 0 if (t == 0) - return 1 if (t == 1) - return 0.5 * (2 ** 10 * (t - 1)) if ((t /= 0.5) < 1) - return 0.5 * (-(2 ** -10 * (t -= 1)) + 2) - end - - def tween_ease_in_circ(t) - -(Math.sqrt(1 - (t * t)) - 1) - end - - def tween_ease_out_circ(t) - Math.sqrt(1 - ((t - 1) ** 2)) - end - - def tween_ease_in_out_circ(t) - return -0.5 * (Math.sqrt(1 - t * t) - 1) if ((t /= 0.5) < 1) - return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1) - end - - def tween_ease_in_back(t) - s = 1.70158 - t * t * ((s + 1) * t - s) - end - - def tween_ease_out_back(t) - s = 1.70158 - (t = t - 1) * t * ((s + 1) * t + s) + 1 - end - - def tween_ease_in_out_back(t) - s = 1.70158 - return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)) if ((t /= 0.5) < 1) - return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) - end - - def tween_elastic(t) - -1 * (4 ** (-8 * t)) * Math.sin((t * 6 - 1) * (2 * Math::PI) / 2) + 1 - end - - def tween_swing_from_to(t) - s = 1.70158 - return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)) if (t /= 0.5) < 1 - return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) - end - - def tween_swing_from(t) - s = 1.70158; - t * t * ((s + 1) * t - s) - end - - def tween_swing_to(t) - s = 1.70158 - (t -= 1) * t * ((s + 1) * t + s) + 1 - end - - def tween_bounce(t) - if (t < (1 / 2.75)) - (7.5625 * t * t) - elsif (t < (2 / 2.75)) - (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) - elsif (t < (2.5 / 2.75)) - (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) - else - (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) - end - end - - def tween_bounce_past(t) - if (t < (1 / 2.75)) - # missing "2 -"? - (7.5625 * t * t) - elsif (t < (2 / 2.75)) - 2 - (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) - elsif (t < (2.5 / 2.75)) - 2 - (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) - else - 2 - (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) - end - end - - def tween_ease_from_to(t) - return 0.5 * (t ** 4) if ((t /= 0.5) < 1) - return -0.5 * ((t -= 2) * (t ** 3) - 2) - end - - def tween_ease_from(t) - t ** 4 - end - - def tween_ease_to(t) - t ** 0.25 - end - end -end +module CyberarmEngine + class Animator + def initialize(start_time:, duration:, from:, to:, tween: :linear, &block) + @start_time = start_time + @duration = duration + @from = from.dup + @to = to.dup + @tween = tween + @block = block + end + + def update + @block.call(self, @from, @to) if @block + end + + def progress + ((Gosu.milliseconds - @start_time) / @duration.to_f).clamp(0.0, 1.0) + end + + def complete? + progress >= 1.0 + end + + def transition(from = @from, to = @to, tween = @tween) + from + (to - from) * send("tween_#{tween}", progress) + end + + def color_transition(from = @from, to = @to, _tween = @tween) + r = transition(from.red, to.red) + g = transition(from.green, to.green) + b = transition(from.blue, to.blue) + a = transition(from.alpha, to.alpha) + + Gosu::Color.rgba(r, g, b, a) + end + + def color_hsv_transition(from = @from, to = @to, tween = @tween) + hue = transition(from.hue, to.hue, tween) + saturation = transition(from.saturation, to.saturation, tween) + value = transition(from.value, to.value, tween) + alpha = transition(from.alpha, to.alpha, tween) + + Gosu::Color.from_ahsv(alpha, hue, saturation, value) + end + + # Tween functions based on those provided here: https://github.com/danro/easing-js/blob/master/easing.js + # Under MIT / BSD + + def tween_linear(t) + t + end + + def tween_ease_in_quad(t) + t ** 2 + end + + def tween_ease_out_quad(t) + -((t - 1) ** 2) -1 + end + + def tween_ease_in_out_quad(t) + return 0.5 * (t ** 2) if (t /= 0.5) < 1 + return -0.5 * ((t -= 2) * t - 2) + end + + def tween_ease_in_cubic(t) + t ** 3 + end + + def tween_ease_out_cubic(t) + ((t - 1) ** 3) + 1 + end + + def tween_ease_in_out_cubic(t) + return 0.5 * (t ** 3) if ((t /= 0.5) < 1) + return 0.5 * ((t - 2) ** 3) + 2 + end + + def tween_ease_in_quart(t) + t ** 4 + end + + def tween_ease_out_quart(t) + -((t - 1) ** 4) - 1 + end + + def tween_ease_in_out_quart(t) + return 0.5 * (t ** 4) if ((t /= 0.5) < 1) + return -0.5 * ((t -= 2) * (t ** 3) - 2) + end + + def tween_ease_in_quint(t) + t ** 5 + end + + def tween_ease_out_quint(t) + ((t - 1) ** 5) + 1 + end + + def tween_ease_in_out_quint(t) + return 0.5 * (t ** 5) if ((t /= 0.5) < 1) + return 0.5 * ((t - 2) ** 5) + 2 + end + + def tween_ease_in(t) # sine + -Math.cos(t * (Math::PI / 2)) + 1 + end + + def tween_ease_out(t) # sine + Math.sin(t * (Math::PI / 2)) + end + + def tween_ease_in_out(t) # sine + (-0.5 * (Math.cos(Math::PI * t) - 1)) + end + + def tween_ease_in_expo(t) + (t == 0) ? 0 : 2 ** 10 * (t - 1) + end + + def tween_ease_out_expo(t) + (t == 1) ? 1 : -(2 ** -10 * t) + 1 + end + + def tween_ease_in_out_expo(t) + return 0 if (t == 0) + return 1 if (t == 1) + return 0.5 * (2 ** 10 * (t - 1)) if ((t /= 0.5) < 1) + return 0.5 * (-(2 ** -10 * (t -= 1)) + 2) + end + + def tween_ease_in_circ(t) + -(Math.sqrt(1 - (t * t)) - 1) + end + + def tween_ease_out_circ(t) + Math.sqrt(1 - ((t - 1) ** 2)) + end + + def tween_ease_in_out_circ(t) + return -0.5 * (Math.sqrt(1 - t * t) - 1) if ((t /= 0.5) < 1) + return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1) + end + + def tween_ease_in_back(t) + s = 1.70158 + t * t * ((s + 1) * t - s) + end + + def tween_ease_out_back(t) + s = 1.70158 + (t = t - 1) * t * ((s + 1) * t + s) + 1 + end + + def tween_ease_in_out_back(t) + s = 1.70158 + return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)) if ((t /= 0.5) < 1) + return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + end + + def tween_elastic(t) + -1 * (4 ** (-8 * t)) * Math.sin((t * 6 - 1) * (2 * Math::PI) / 2) + 1 + end + + def tween_swing_from_to(t) + s = 1.70158 + return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)) if (t /= 0.5) < 1 + return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + end + + def tween_swing_from(t) + s = 1.70158; + t * t * ((s + 1) * t - s) + end + + def tween_swing_to(t) + s = 1.70158 + (t -= 1) * t * ((s + 1) * t + s) + 1 + end + + def tween_bounce(t) + if (t < (1 / 2.75)) + (7.5625 * t * t) + elsif (t < (2 / 2.75)) + (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + elsif (t < (2.5 / 2.75)) + (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + else + (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + end + end + + def tween_bounce_past(t) + if (t < (1 / 2.75)) + # missing "2 -"? + (7.5625 * t * t) + elsif (t < (2 / 2.75)) + 2 - (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + elsif (t < (2.5 / 2.75)) + 2 - (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + else + 2 - (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + end + end + + def tween_ease_from_to(t) + return 0.5 * (t ** 4) if ((t /= 0.5) < 1) + return -0.5 * ((t -= 2) * (t ** 3) - 2) + end + + def tween_ease_from(t) + t ** 4 + end + + def tween_ease_to(t) + t ** 0.25 + end + end +end