Copy link to clipboard
Copied
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;
}
}
}
}
Copy link to clipboard
Copied
By the way, I'm using Flash CS6. Thanks again for any help anyone can offer.
Copy link to clipboard
Copied
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
Copy link to clipboard
Copied
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:
Thanks!
Copy link to clipboard
Copied
No empty box is necessary, just create an empty movieclip symbol and locate it at the upper left of the stage.
Copy link to clipboard
Copied
Sorry, I guess I don't actually know how to make an empty movieclip symbol. I usually would convert a bitmap or something to a movieclip. I'll try to Google it, but if you have a quick solution, I'd be more than happy to hear it.
Copy link to clipboard
Copied
Okay, so here's a link to what I did to create an empty moviclip. http://grok.lsu.edu/Article.aspx?articleId=6936 (I know it's old, but I assume it's still the same.) Basically, Insert --> New Symbol --> MovieClip. I named it emptyMC. (Didn't name the instance.) And I also dragged it onto the layer and set it at 0, 0. Then I pasted the code from my Snow.as file that I got from the original source that I found at the above mentioned site and renamed the line you mentioned to emptyMC.addChild(flake);
Then I get and error that states
Scene 1, Layer 'FallingSnow', Frame 1, Line 6 | 1037: Packages cannot be nested. |
Here's the code that's in the Actions panel of the layer named Falling Snow:
/* 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;
emptyMC.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;
}
}
}
}
Copy link to clipboard
Copied
Well, just wanted to come back here and sadly say that none of this helped. But I did figure it out in a different way. Thanks for trying to help though Ned. I really appreciate it.
Copy link to clipboard
Copied
I know this is an old post but will you pleas share how you got this to work?
Copy link to clipboard
Copied
Hi!
I quickly wrapped the animation inside of a Movie Clip. So now it's easier because it's only a matter of copying and pasting the Movie Clip in any layer needed, how many times needed.
Only remember:
- To have the Snowflake symbol inside the Library;
- To have the two classes (Snow.as and Snowflake.as) inside the same folder of the FLA file;
- And that you can change the snow flake artwork by only editing the Snowflake symbol.
And sorry about the quality of the drawing. Haha
I hope it helps.
Copy link to clipboard
Copied
@sandys20553341
Here's the help I just got on this for my latest question.
Hide AS3 animated snow during animation?
Didn't realize I had posted this 3 years ago. Very similar situation.
Copy link to clipboard
Copied
I actually ended up creating the snow in After Effects and then importing my sequence images into Animate but thank you for replying!