Skip to main content
Known Participant
November 25, 2014
Question

Falling Snow AS3 code question...

  • November 25, 2014
  • 3 replies
  • 2793 views

I have found some code for falling snow that I like and have successfully placed it into my Flash file as a Class. (This is all new to me, so bare with me please.) It looks great, however, I want the snow to be in front of a background image that is a city skyline, and I also want to have a movie clip layer that is in front of the snow that consists of images flying around the page, quotes, etc. Can I change this existing code to work that way? Or can I place it on it's own layer instead of using it as a Class? Any help would be greatly appreciated.

Thanks!

Here's the code:

/* Main Class */

/* Developed by Carlos Yanez */

/* Image: http://www.flickr.com/photos/andyarmstrong/89441086/ */

package

{

  import flash.display.MovieClip;

  import flash.events.Event;

  import flash.utils.Timer;

  import flash.events.TimerEvent;

  public class Snow extends MovieClip

  {

  private var flakesVector:Vector.<MovieClip> = new Vector.<MovieClip>();

  private var timer:Timer = new Timer(2000);

  public function Snow(speed:int = 3, flakesNumber = 100):void

  {

  for(var i:int = 0; i < flakesNumber; i++)

  {

  var flake:Snowflake = new Snowflake();

  flake.vel = (Math.random() * speed) + 0.5;

  flake.xSpeed = Math.floor(Math.random() * (0.5 - -0.5 + 1)) + -0.5;

  flake.scaleX = (Math.random() * 1) - 1.0;

  flake.scaleY = flake.scaleX;

  flake.x = Math.random() * stage.stageWidth;

  flake.y = Math.random() * stage.stageHeight;

  addChild(flake);

  flakesVector.push(flake);

  }

  addEventListener(Event.ENTER_FRAME, fall);

  timer.addEventListener(TimerEvent.TIMER, changeMovement);

  timer.start();

  }

  private function fall(e:Event):void

  {

  for(var i:int = 0; i < flakesVector.length; i++)

  {

  flakesVector.x += flakesVector.xSpeed;

  flakesVector.y += flakesVector.vel;

  if(flakesVector.y > stage.stageHeight)

  {

  flakesVector.x = Math.random() * stage.stageWidth;

  flakesVector.y = -flakesVector.height;

  }

  }

  }

  private function changeMovement(e:TimerEvent):void

  {

  for(var i:int = 0; i < flakesVector.length; i++)

  {

  flakesVector.xSpeed *= -1;

  }

  }

  }

}

This topic has been closed for replies.

3 replies

sandys1348
Inspiring
December 15, 2017

I actually ended up creating the snow in After Effects and then importing my sequence images into Animate but thank you for replying!

Ned Murphy
Legend
November 26, 2014

You need some way of containing the snow.  When you create content dynamically it is not tied to the timeline unless you place it within something that is.

What you can do is create an empty movieclip and place it in the upper left corner of the stage on whatever layer of the timeline you wish to have it (a layer above the background layer, below the words layer)  Then add your snow to that rather than the stage.

I am not sure how you set about instantiating the snow class, but you essentially want to add the flakes to the container movieclip you create, so instead of using

    addChild(flake);

you'd be changing it to be something like

   emptyMC.addChild(flake);

So you need to have a reference to that empty novieclip available to the snow class instance

DanB0328Author
Known Participant
November 26, 2014

So, you're saying make a small, empty box (Alpha set to 0), make it a movie clip, and then put this code in the Actions area instead of calling it as a Class? I don't mind it being continuous and lasting as long as the window/animation is open.

Also, if it helps, below is a link to where I got the code and instructions:

http://code.tutsplus.com/tutorials/create-a-customizable-snow-effect-with-actionscript-30--active-3164

Thanks!

Ned Murphy
Legend
November 26, 2014

No empty box is necessary, just create an empty movieclip symbol and locate it at the upper left of the stage.

DanB0328Author
Known Participant
November 25, 2014

By the way, I'm using Flash CS6. Thanks again for any help anyone can offer.