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