Sha256: 07f091271b8c9bf168ca23cba1eb3c6accff596ad57ba31447de013cd269736c

Contents?: true

Size: 1.45 KB

Versions: 1

Compression:

Stored size: 1.45 KB

Contents

module CyberarmEngine
  class Animator
    DEFAULT_TWEEN = :linear
    def initialize(start_time:, duration:, from:, to:, &block)
      @start_time, @duration = start_time, duration
      @from, @to = from.dup, to.dup
      @block = block
    end

    def update
      @block.call(self, @from, @to) 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: 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

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
cyberarm_engine-0.13.0 lib/cyberarm_engine/animator.rb