A scene is a non-linear graph that assembles layers together to tell a story. Layers are folders with appropriately named files (see below). You can group layers and control them together or just set their values individually.
Examples:
A city scene that changes with the time of day and the weather conditions.
A traffic map that shows red lines on streets that are crowded and green on free-flowing ones.
Usage:
g = Gruff::Scene.new("500x100", "path/to/city_scene_directory")
# Define order of layers, back to front
g.layers = %w(background haze sky clouds)
# Define groups that will be controlled by the same input
g.weather_group = %w(clouds)
g.time_group = %w(background sky)
# Set values for the layers or groups
g.weather = "cloudy"
g.time = Time.now
g.haze = true
# Write the final graph to disk
g.write "hazy_daytime_city_scene.png"
There are several rules that will magically select a layer when possible.
Numbered files will be selected according to the closest value that is less than the input value.
‘true.png’ and ‘false.png’ will be used as booleans.
Other named files will be used if the input matches the filename (without the filetype extension).
If there is a file named ‘default.png’, it will be used unless other input values are set for the corresponding layer.
# File lib/gruff/scene.rb, line 57
57: def draw
58: # Join all the custom paths and filter out the empty ones
59: image_paths = @layers.map { |layer| layer.path }.select { |path| !path.empty? }
60: images = Magick::ImageList.new(*image_paths)
61: @base_image = images.flatten_images
62: end
# File lib/gruff/scene.rb, line 64
64: def layers=(ordered_list)
65: ordered_list.each do |layer_name|
66: @layers << Gruff::Layer.new(@base_dir, layer_name)
67: end
68: end
Group layers to input values
g.weather_group = ["sky", "sea", "clouds"]
Set input values
g.weather = "cloudy"
# File lib/gruff/scene.rb, line 78
78: def method_missing(method_name, *args)
79: case method_name.to_s
80: when /^(\w+)_group=$/
81: add_group $1, *args
82: return
83: when /^(\w+)=$/
84: set_input $1, args.first
85: return
86: end
87: super
88: end
# File lib/gruff/scene.rb, line 92
92: def add_group(input_name, layer_names)
93: @groups[input_name] = Gruff::Group.new(input_name, @layers.select { |layer| layer_names.include?(layer.name) })
94: end
# File lib/gruff/scene.rb, line 96
96: def set_input(input_name, input_value)
97: if not @groups[input_name].nil?
98: @groups[input_name].send_updates(input_value)
99: else
100: if chosen_layer = @layers.detect { |layer| layer.name == input_name }
101: chosen_layer.update input_value
102: end
103: end
104: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.