0

正方形のグリッドを作成しようとしました。ここで、すべての正方形の色パラメーターを個別に制御できます。それらを 1 つずつ、またはすべて同時に点滅させます。

forループでパラメーターを実行して、トゥイーンでそれをやろうとしています。

以下のコードは、1 秒に 1 回、すべての正方形を同時にフラッシュしようとします。しかし、何らかの理由で、すべての正方形がトゥイーンするわけではなく、トゥイーンするのは一部だけです。または、部分的にトゥイーンし、まったくトゥイーンしないこともあります。ただし、パターンは繰り返されません。

これは、同時にトゥイーンが多すぎますか? forループはこれを行う正しい方法ですか? スプライトの代わりにムービークリップを使用する必要がありますか? 非常に速い段階で多くの異なるオブジェクトの色を制御したい場合、それを行うための最良の方法は何ですか?

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);

            }
        }
    }
4

1 に答える 1

0

ムービークリップの下にスプライトを積み重ねることで問題を解決したので、数十または数百ではなく、いくつかの要素のみをトゥイーンしました

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 で呼び出します。

于 2013-08-11T11:56:49.610 に答える