2009-06-12 2 views
1

Это текущее состояние моего кода, и, хотя я получаю желаемый эффект, он не работает так, как мне это нужно. Поскольку программа находится в бесконечном цикле, очевидно, что она будет постоянно увеличивать как фоновые градиенты, так и 10 кругов с каждым циклом, и быстро они перепроизводят себя и замедляют работу программы.Как я могу сделать этот код обуви утомленным компьютером?

Здесь идет:

Shoes.app (:title => 'Circles', :width => 500, :height => 500, :resizable => false) do 
      i = 0 
# Animation loop 
    animate (24) do |i| 
# 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{ 
      i += 1 
      oval :left => (-5..self.width).rand, 
      :top => (-5..self.height).rand, 
      :radius => (1..100).rand 
      } end 
     end 

Я попробовал то, что я могу думать, но я не слишком знакомы с синтаксисом Руби, или то, что я могу или не могу делать с обувью, что я могу сделать с Руби. Некоторые советы о том, куда идти отсюда, будут очень признательны.

+1

Если вы хотите контролировать генерацию окружностей, добавьте переменную, чтобы подсчитать, как многие из них были созданы, а затем прекратили производство, если было создано слишком много. –

ответ

5

Каждый из этих овалов и фонов, которые вы рисуете, представляет собой отдельный элемент в памяти, а это означает, что через некоторое время они боятся его. Если вы просто хотите, чтобы показать последний кадр, который вы нарисовали, то вам необходимо очистить АРР, каждый раз, когда:

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 
+0

Приветствия для человека помощи. Я решил использовать «3» в качестве точки отсечки, так как моя система не может принимать гораздо больше = P Спасибо большое за это - я узнал гораздо больше о синтаксисе Ruby, так как а также метод подсчета, который я мог бы работать, но не мог понять, как управлять им так, как я хотел! лол. Я должен вам один =) С уважением, G0DL355 – 2009-06-13 19:06:50

Смежные вопросы