在AS3 / Flash中创建飘落的雪花

时间:2015-05-09 13:55:01

标签: actionscript-3 flash

所以我试图在Flash应用程序中创建随机的雪花。使用以下代码,我的雪会出现在屏幕上的随机点上。

var mc:snowFalling = new snowFalling();
addChild(mc);
var result:Number = Math.random() * 100;
var randomX:Number = Math.random() * stage.stageWidth;
mc.x = randomX;

snowFalling是链接名称。

我不确定如何让雪多次出现并重新生成。有人可以给我一些我需要做的代码。

1 个答案:

答案 0 :(得分:2)

首先,您需要在屏幕上创建尽可能多的雪​​花。然后,你需要每帧框架移动每个雪花片。像下面这样的东西是你可以做到的一种方式。 (有很多方法可以实现这一目标。)

        var flakes:Vector.<snowFalling> = new Vector.<snowFalling>(); //an array to store all your snow flakes

        var mc:snowFalling;
        var mc2:snowFalling;

        var columns:int = 5;
        var rows:int = 7;

        var columnWidth:Number = stage.stageWidth / columns;
        var rowHeight:Number = stage.stageHeight / rows;

        //make 5 columns
        for (var i:int = 0; i < columns; i++) {
            mc = new snowFalling();
            mc.x = (columnWidth * i);// + (Math.random() * (columnWidth * .25)); //to randomize the x position within the column size
            addChild(mc);
            flakes.push(mc);

            //make 7 rows in each column
            for (var j:int = 0; j < rows; j++) {
                mc2 = new snowFalling();
                mc2.x = mc.x;
                mc2.y = (rowHeight * j);// + (Math.random() * (rowHeight * .25)); //to randomize the y within the row size
                addChild(mc2);
                flakes.push(mc2);
            }
        }

        //run the enterFrame function below every frame tick of the application
        this.addEventListener(Event.ENTER_FRAME, enterFrame);

        function enterFrame(e:Event):void {
            //loop through each snowflake in the flakes array
            for (var i:int = 0; i < flakes.length; i++) {
                flakes[i].y += 2;  //move it down 2 pixels

                //check to see if it's off screen, if so, move back to the top of the screen (less it's height so it's just off screen at the top)
                if (flakes[i].y > stage.stageHeight) flakes[i].y = -flakes[i].height;
            }
        }

或者,如果你想要一个传统的spawn类型方法,那么:

    //create a container to hold all the snowflakes
    var snowContainer:Sprite = new Sprite();
    addChild(snowContainer);

    //this function creates a snowflake and puts it at the top of the screen in a random x spot
    function spawnFlake(e:Event = null):void {
        var mc:snowFalling;
        snowContainer.addChild(mc);
        mc.x = Math.random() * (stage.stageWidth - mc.width);
        mc.y = -mc.height; //just off screen at the top
    }

    //create a timer that will call the spanFlake function every second
    var timer:Timer = new Timer(1000);
    timer.addEventListener(TimerEvent.TIMER, spawnFlake);
    timer.start();

    this.addEventListener(Event.ENTER_FRAME, enterFrame);

    //every frame, iterate through all the children of snowContainer and move the flakes down 2 pixels
    function enterFrame(e:Event):void {
        var flake:snowFalling;
        var i:int = snowContainer.numChildren;
        //we need to iterate backwards because we are potentially removing items (which would throw our i value out of whack if iterating forwards)
        while(i--){
            flake = snowContainer.getChildAt(i) as snowFalling;
            flake.y += 2;

            //if out of bounds, remove the flake 
            if (flake.y > stage.stageHeight) {
                snowContainer.removeChild(flake);
            }
        }
    }