30 minutes ago, I got this comment on my Ruboto on Acid post:
LSD makes letters on a computer screen look as if they’re dancing around and have a mind of their own. It’s also entirely impossible to think logically enough to code while on it. I recommend you buy some acid and see how it’s nothing like this at all. ;)
And here is my answer. :)
video
#!/usr/bin/env ruby
require 'rubyonacid/factories/example'
require 'tk'
#This factory will be in charge of all drawing coordinates, colors, etc.
f = RubyOnAcid :: ExampleFactory . new
#A skip factory, in charge of randomly resetting the meta factory.
resetter = RubyOnAcid :: SkipFactory . new ( :odds => 0.99 )
#The window to draw to.
canvas = TkCanvas . new ( :width => 400 , :height => 400 )
canvas . pack
#The line objects we create will be stored here.
shapes = []
letters = "woah, trippy, dude!" . split ( // )
#Create a thread to update the window while it's displayed.
Thread . abort_on_exception = true
Thread . new do
loop do
#Get red, green, and blue values for a color from the factory.
#Format is #RRGGBB in hexadecimal (like HTML).
color = sprintf ( "#%02x%02x%02x" ,
f . get ( :red , :max => 254 ). to_i ,
f . get ( :green , :max => 254 ). to_i ,
f . get ( :blue , :max => 254 ). to_i
)
#Create and store a line of the chosen color.
#Get width and locations of the endpoints from the factory.
shapes << TkcText . new (
canvas ,
f . get ( :x1 , :max => 400 ),
f . get ( :y1 , :max => 400 ),
:text => f . choose ( :text , letters ),
:font => TkFont . new (
:size => f . get ( :size , :min => 1 , :max => 72 ). to_i ,
),
:fill => color
)
#If the resetter returns true, tell the ExampleFactory to reassign
#its source factories to different keys.
f . reset_assignments if resetter . boolean ( :reset )
#Delete the oldest line if we have accumulated too many.
shapes . shift . delete if shapes . length > letters . length
end
end
#Display the window.
canvas . mainloop