Каждый из этих овалов и фонов, которые вы рисуете, является отдельным элементом в памяти, что означает, что они затихают через некоторое время. Если вы просто хотите показать последний нарисованный кадр, то вам нужно каждый раз очищать приложение:
Shoes.app ( :title => 'Circles', :width => 500, :height => 500, :resizable => false ) do
# Animation loop
animate ( 24 ) do |i|
app.clear
# Variables For Randomized Colours
randomCol = rgb( ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand )
randomCol2 = rgb( ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand )
randomCol3 = rgb( ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand )
randomCol4 = rgb( ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand )
background randomCol..randomCol2
fill randomCol3
stroke randomCol4
strokewidth ( 0..5 ).rand
# Generate 10 circles per loop cycle
10.times do |i|
i += 1
oval :left => ( -5..self.width ).rand,
:top => ( -5..self.height ).rand,
:radius => ( 1..100 ).rand
end
end
end
Это не так круто, как ваш оригинальный (за исключением того факта, что он будет работать бесконечно), потому что у вас больше нет эффекта наложения. В этом случае мы можем позволить ему пройти несколько раз перед очисткой. В этом примере он будет очищаться каждый шестой раз:
Shoes.app ( :title => 'Circles', :width => 500, :height => 500, :resizable => false ) do
# Animation loop
animate ( 24 ) do |i|
app.clear if (i % 6 == 0)
# Variables For Randomized Colours
randomCol = rgb( ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand )
randomCol2 = rgb( ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand )
randomCol3 = rgb( ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand )
randomCol4 = rgb( ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand )
background randomCol..randomCol2
fill randomCol3
stroke randomCol4
strokewidth ( 0..5 ).rand
# Generate 10 circles per loop cycle
10.times do |i|
i += 1
oval :left => ( -5..self.width ).rand,
:top => ( -5..self.height ).rand,
:radius => ( 1..100 ).rand
end
end
end
Теперь еще более интересной стратегией было бы сохранить последние n
проходов и убрать самые старые, чтобы у нас всегда было, скажем, 6 слоев на экране (я считаю, что 6 - хорошая точка отсечения, но Ваше мнение (и производительность компьютера!) могут отличаться):
Shoes.app ( :title => 'Circles', :width => 500, :height => 500, :resizable => false ) do
n = 6
@layers = []
n.times { @layers << [] }
# Animation loop
animate ( 24 ) do |i|
oldest = i % n
# Clear out oldest frame
@layers[oldest].each {|x| x.remove}
@layers[oldest] = []
# Variables For Randomized Colours
randomCol = rgb( ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand )
randomCol2 = rgb( ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand )
randomCol3 = rgb( ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand )
randomCol4 = rgb( ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand, ( 0..255 ).rand )
@layers[oldest] << background(randomCol..randomCol2)
fill randomCol3
stroke randomCol4
strokewidth ( 0..5 ).rand
# Generate 10 circles per loop cycle
10.times do |i|
@layers[oldest] << oval (:left => ( -5..self.width ).rand,
:top => ( -5..self.height ).rand,
:radius => ( 1..100 ).rand)
end
end
end