Каждый из этих овалов и фонов, которые вы рисуете, представляет собой отдельный элемент в памяти, а это означает, что через некоторое время они боятся его. Если вы просто хотите, чтобы показать последний кадр, который вы нарисовали, то вам необходимо очистить АРР, каждый раз, когда:
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
Если вы хотите контролировать генерацию окружностей, добавьте переменную, чтобы подсчитать, как многие из них были созданы, а затем прекратили производство, если было создано слишком много. –