From 3a83e616d38a16e3c9c313c512b1545f57ebf482 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Thu, 19 Dec 2019 13:08:29 -0600 Subject: [PATCH] Added Animator for creating animations with various tweeners, supports Gosu::Color's and numbers --- lib/cyberarm_engine.rb | 1 + lib/cyberarm_engine/animator.rb | 53 +++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 lib/cyberarm_engine/animator.rb diff --git a/lib/cyberarm_engine.rb b/lib/cyberarm_engine.rb index e04f64c..a7c67f3 100644 --- a/lib/cyberarm_engine.rb +++ b/lib/cyberarm_engine.rb @@ -20,6 +20,7 @@ require_relative "cyberarm_engine/transform" require_relative "cyberarm_engine/ray" require_relative "cyberarm_engine/shader" if defined?(OpenGL) require_relative "cyberarm_engine/background" +require_relative "cyberarm_engine/animator" require_relative "cyberarm_engine/text" require_relative "cyberarm_engine/timer" diff --git a/lib/cyberarm_engine/animator.rb b/lib/cyberarm_engine/animator.rb new file mode 100644 index 0000000..fce7a10 --- /dev/null +++ b/lib/cyberarm_engine/animator.rb @@ -0,0 +1,53 @@ +module CyberarmEngine + class Animator + DEFAULT_TWEEN = :linear + def initialize(start_time:, duration:, &block) + @start_time, @duration = start_time, duration + @block = block + end + + def update + @block.call(self) if @block + end + + def progress + (@start_time.to_f + (Gosu.milliseconds - @start_time)) / (@start_time + @duration.to_f) + end + + def complete? + progress >= 1.0 + end + + def transition(from, to, tween = DEFAULT_TWEEN) + from + (to - from) * send("tween_#{tween}", progress) + end + + def color_transition(from, to, tween = DEFAULT_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, to, tween = DEFAULT_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 + + # NOTE: maybe use this for future reference? https://github.com/danro/easing-js/blob/master/easing.js + + def tween_linear(t) + t + end + + def tween_sine(t) + Math.sin(t) * t + end + end +end \ No newline at end of file