| Class | Gruff::Scene |
| In: |
lib/gruff/scene.rb
|
| Parent: | Gruff::Base |
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:
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.
| layers | [R] |
An array listing the foldernames that will be rendered, from back to front.
g.layers = %w(sky clouds buildings street people) |
# File lib/gruff/scene.rb, line 50
50: def initialize(target_width, base_dir)
51: @base_dir = base_dir
52: @groups = {}
53: @layers = []
54: super target_width
55: end
# 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