lib/cyberarm_engine/ui/elements/progress.rb in cyberarm_engine-0.19.1 vs lib/cyberarm_engine/ui/elements/progress.rb in cyberarm_engine-0.20.0
- old
+ new
@@ -1,11 +1,18 @@
module CyberarmEngine
class Element
class Progress < Element
+ attr_reader :type
+
def initialize(options = {}, block = nil)
super(options, block)
+ @animation_speed = options[:animation_speed] || 3_000
+ @marquee_width = options[:marquee_width] || 0.25
+ @marquee_offset = 0
+ @marquee_animation_time = Gosu.milliseconds
+ @type = options[:type] || :linear
@fraction_background = Background.new(background: @style.fraction_background)
self.value = options[:fraction] || 0.0
end
def render
@@ -22,16 +29,46 @@
end
def update_background
super
- @fraction_background.x = @style.border_thickness_left + @style.padding_left + @x
+ @fraction_background.x = (@style.border_thickness_left + @style.padding_left + @x) + @marquee_offset
@fraction_background.y = @style.border_thickness_top + @style.padding_top + @y
@fraction_background.z = @z
- @fraction_background.width = @width * @fraction
+ @fraction_background.width = @width * (@type == :marquee ? @marquee_width : @fraction)
@fraction_background.height = @height
@fraction_background.background = @style.fraction_background
+ end
+
+ def update
+ super
+
+ return unless @type == :marquee
+
+ marquee_width = @width * @marquee_width
+ range = @width + marquee_width
+
+ @marquee_offset = (@width * (Gosu.milliseconds - @marquee_animation_time) / @animation_speed) - marquee_width
+ @marquee_animation_time = Gosu.milliseconds if @marquee_offset > range
+
+ update_background
+ end
+
+ def type=(type)
+ @type = type
+
+ case type
+ when :linear
+ @marquee_offset = 0
+ when :marquee
+ @marquee_offset = 0
+ @marquee_animation_time = Gosu.milliseconds
+ else
+ raise ArgumentError, "Only types :linear and :marquee are supported"
+ end
+
+ update_background
end
def value
@fraction
end