2013-08-01 34 views
0

我尝试制作一个正方形网格,在那里我可以单独控制每个正方形的颜色参数,即。让他们一个接一个或全部同时闪光。Sprites上的多种颜色补间

我试图用补间来做,用for循环运行参数。

下面的代码尝试同时闪烁所有方块,每秒一次。但由于某些原因,所有的方格都不会补间,只有一些方法。或者他们部分吐温,有时他们根本不吐温。但是,这种模式不会重演。

这是太多的补间在同一时间? for循环的正确方法是做到这一点?我应该使用MovieClip而不是Sprites吗?如果我想在很快的阶段控制许多不同物体的颜色,那么最好的方法是什么?

import fl.transitions.Tween; 
import fl.transitions.easing.*; 
import fl.transitions.TweenEvent; 
import flash.display.*; 
import flash.events.*; 
import flash.display.Sprite; 
import flash.geom.Rectangle; 
import flash.geom.ColorTransform; 
import Math; 
import flash.utils.Timer; 
import flash.events.TimerEvent; 
import resolumeCom.*; 
import resolumeCom.parameters.*; 
import resolumeCom.events.*; 

    public class LightGrid extends MovieClip 
    { 
     private var t1:Tween; 
     private var resolume:Resolume = new Resolume(); 
     private var tempo:FloatParameter = resolume.addFloatParameter("Tempo", 0.6); 
     private var pad = 3; 
     private var dim = 20; 
     private var posX = 0 + pad; 
     private var posY = 0 + pad; 
     private var a:Number = new Number(); 
     private var b:Number = new Number(); 
     private var blk:Number = new Number(); 
     var newCol:ColorTransform = new ColorTransform(); 

     public function LightGrid() 
     { 
      resolume.addParameterListener(parameterChanged); 

      for (var b = 0; b < 16; b++) 
      { 
       posY = (b*dim) + (b*pad) + pad; 
       trace("New row"); 
       for (var a = 0; a < 24; a++) 
       { 
        posX = (a*dim) + (a*pad) + pad; 

        // l = line, f = fill 

        var l:Sprite = new Sprite; 

        l.graphics.lineStyle(2, 0xFFFFF, 1); 
        l.graphics.drawRect(posX, posY, dim, dim); 
        l.name = "line_Row" + b + "Col" + a; 

        addChild(l); 

        var f:Sprite = new Sprite; 
        f.graphics.beginFill(0x990000, 1); 
        f.graphics.drawRect(posX, posY, dim, dim); 
        f.graphics.endFill(); 
        f.name = "fill_Row" + b + "Col" + a; 

        addChild(f); 

        trace(getChildByName("fill_Row" + b + "Col" + a).name); 
       } 
      } 

      var myTimer:Timer = new Timer(1000, 100); 
      myTimer.addEventListener("timer", timerHandler); 
      myTimer.start(); 
     } 

     public function timerHandler(event:TimerEvent):void { 
      flashTheLights(); 
     } 

     public function parameterChanged(e:ChangeEvent):void 
     { 
      if (e.object == tempo) 
      { 
      } 
     } 

     public function flashTheLights():void 
     { 

     blk = 0; 

      for (var blk = 0; blk < (24/3); blk++) 
      { 
       for (var d = 0; d < 16; d++) 
       { 
        for (var c = (0+(3*blk)); c < (3+(3*blk)); c++) 
        { 
         newCol.redOffset=30-(35*blk); 
         newCol.blueOffset=200+(7*blk); 
         newCol.greenOffset=200; 

         trace(getChildByName("fill_Row" + d + "Col" + c).name); 
         var fill:Sprite = getChildByName("fill_Row" + d + "Col" + c) as Sprite; 

         fill.transform.colorTransform.alphaMultiplier = -255; 
         fill.transform.colorTransform = newCol; 
         trace("Run tween"); 

         var myTween = new Tween(fill,'alpha',Regular.easeIn,1,0,0.3,true); 
        } 
       } 

      trace("Done!" + blk); 

      } 
     } 
    } 
+1

你看过尝试不同的补间解决方案吗? Greensock是第一个想到的,或者你可以为自己编写一个简单的程序。 – Glitcher

+0

Gee,一个100圈的循环,每次创建128个补间 - 确定它太大了。 – Vesper

+0

是的,我认为这可能太多了...但是必须有某种方式来做到这一点?我的意思是我应该尝试寻找其他解决方案吗? –

回答

0

我有点通过堆叠下的movieclip精灵所以解决了这个问题仅补间耦合元件代替数十或数百

for (var k = 0; k < (grdX/ptrnSz); k++) 
     { 

      var ptrn:MovieClip = new MovieClip(); 
      ptrn.name = "ptrn" + k; 
      addChild(ptrn); 
      ptrn.alpha = 0.01; 
      ptrnAm++; 

      for (var d = 0; d < grdY; d++) 
      { 

       posY = (d*dim) + (d*pad) + top; 

       for (var c = (0+(ptrnSz*k)); c < (ptrnSz+(ptrnSz*k)); c++) 
       { 

        posX = (c*dim) + (c*pad) + left; 

        // l = line, f = fill 

        var f:Sprite = new Sprite; 
        f.graphics.beginFill(0xFFFFFF, 1); 
        f.graphics.drawRect(posX-0.5, posY, dim, dim); 
        f.graphics.endFill(); 
        f.name = "fill_Block" + k + "Row" + d + "Col" + c; 
        ptrn.addChild(f); 

       } 

      } 

     } 

grdX =网格尺寸在X轴(多少列)
ptrnSz =包含精灵的影片剪辑的大小(多少列)
之后,我只是将影片剪辑与TweenMax补间,每个都用getChildByName调用它们。