class NyanCat::Cat

Public Class Methods

new(opts = {}) click to toggle source
# File lib/nyan-cat/cat.rb, line 19
def initialize(opts = {})
  @frames         = opts.fetch(:frames) { [FRAME1, FRAME2] }
  @trail_length   = opts.fetch(:trail_length) { 9 }
  @colorize_trail = opts.fetch(:colorize) { true }
  @frame_count    = 0
end

Public Instance Methods

tick(frame_count = @frame_count) click to toggle source
# File lib/nyan-cat/cat.rb, line 26
def tick(frame_count = @frame_count)
  increment_internal_frame_count
  generate_cat(frame_count)
end

Private Instance Methods

add_trail_to_each_line(frame, index) click to toggle source
# File lib/nyan-cat/cat.rb, line 43
def add_trail_to_each_line(frame, index)
  lines = frame.split(/\r?\n/)
  frame_with_trails = lines.map.with_index do |line, i|
    @trail_length.times do |j|
      if @colorize_trail
        color_index = j - @frame_count % @trail_length
        line.prepend(Paint[trail_char(index, i, j), rainbow(color_index)])
      else
        line.prepend(trail_char(index, i, j))
      end
    end
    line
  end

  frame_with_trails.join("\n")
end
generate_cat(frame_count) click to toggle source
# File lib/nyan-cat/cat.rb, line 37
def generate_cat(frame_count)
  index = frame_count % @frames.count
  frame = @frames[index]
  frame_with_trail = add_trail_to_each_line(frame, index)
end
increment_internal_frame_count() click to toggle source
# File lib/nyan-cat/cat.rb, line 33
def increment_internal_frame_count
  @frame_count += 1
end
rainbow(freq = 0.3, i) click to toggle source
# File lib/nyan-cat/cat.rb, line 60
def rainbow(freq = 0.3, i)
  red   = Math.sin(freq*i + 0) * 127 + 128
  green = Math.sin(freq*i + 2*Math::PI/3) * 127 + 128
  blue  = Math.sin(freq*i + 4*Math::PI/3) * 127 + 128
  "#%02X%02X%02X" % [ red, green, blue ]
end
trail_char(frame_index, line_index, trail_index) click to toggle source
# File lib/nyan-cat/cat.rb, line 67
def trail_char(frame_index, line_index, trail_index)
  ((frame_index + line_index + trail_index) % 2).zero? ? '-' : '_'
end