Article Focus: In this tutorial, Chris Smith and Scott Hiers from Domani Studios create a shake-snow globe using Flash CS4 and Action Script 3.0. In this tutorial, you can either watch the video or follow along with the text tutorial below.
Finished Project
1. Create a new ActionScript 3.0 Flash File.
2. Set up the default document properties
3. Choose "New > ActionScript File" and name this file "HolidayCardTutorial.as". This code handles the root of the document. In this case, it’s not very complicated, it only needs to make our shadow follow the globe around the table for a more realistic looking environment and set some basic stage properties.
package {
import flash.events.Event;
import flash.display.Sprite;
import flash.display.MovieClip;
public class HolidayCardTutorial extends Sprite {
public var globe:SnowGlobeContainer;
public var shadow:MovieClip;
public function HolidayCardTutorial() {
super();
// initial stage settings
stage.scaleMode = "noScale";
stage.align = "left";
// enter frame loop
addEventListener(Event.ENTER_FRAME, update);
}
public function update(e:Event):void{
// keep the shadow under the globe and scale it based on how high the globe is lifted
shadow.x = globe.x;
var s:Number = Math.abs(globe.startPos.y - globe.y) / 650;
shadow.scaleX = shadow.scaleY = 1-s;
shadow.alpha = .8-s;
}
}
}
Link the document stage properties base class to this file
4. Create 3 Layers for background, shadow, ribbon and the snow globe (I added a shadow mask too because there is a table in the background image that the shadow needs to stay on)
5. Choose "Insert > new Symbol..." and in the properties window make the type MovieClip and name the new object "SnowGlobeContainer.as" and check “Export for ActionScript”. This clip will contain our awesome globe. The guts and glory of our app will live within this object.
6. Choose "New > ActionScript File" and name the file "SnowGlobeContainer.as". Making our snow globe interactive in the way that we want is not too difficult, really. What we need to do is be able to click and drag the globe around the stage. For this demo I chose to manually call the mouse over & mouse out with coordinates because sometimes if you drag your mouse out of the player there could be some strange behavior. Other than that, the code in the update function is what runs the mouse interaction. It watches the speed of the mouse and controls what happens when you shake or let go of the object. There are some simple physics when you drop the globe to give it a fun and realistic bounce effect.
package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
import flash.geom.Point;
public class SnowGlobeContainer extends Sprite {
public var snowForeground:SnowGeneratorCircle;
public var snowBackground:SnowGeneratorCircle;
public var cursor:MovieClip;
public var drag:Boolean = false;
public var over:Boolean = false;
public var startPos:Point = new Point;
public var mouseDownOffset:Point = new Point;
public var bounds:Rectangle = new Rectangle;
public var vel:Point = new Point(0,0);
public var pos:Point = new Point(x,y);
public var old:Point = new Point(x,y);
public var gravity:Number = 5+(Math.random()*1);
public var restitution:Number = 0.5;
public var friction:Number = 0.9;
public function SnowGlobeContainer() {
// save some initial persistant properties
startPos.x = this.x;
startPos.y = this.y;
old.x = this.x;
old.y = this.y;
bounds.x = 0;
bounds.y = 0;
bounds.width = 600;
bounds.height = startPos.y;
// add mouse interaction listeners and show the cursor on rollover
// if you "shake" or move the mouse quickly, we are going to reset the snow particles
var d:Point = new Point(Math.abs(old.x - x), Math.abs(old.y - y));
if(d.x > 50 || d.y > 50 ){
snowForeground.reset();
snowBackground.reset();
}
// update the history position
old.x = x;
old.y = y;
vel.y = (y-old.y)/2;
}else{
// if you drop this object it should have a bit of realistic falling..
vel.y += gravity;
pos.y += vel.y;
// bounce
if(pos.y > bounds.height){
pos.y = bounds.height;
vel.y *= -(Math.random()*restitution);
}
y = pos.y;
}
}
}
}
7. Create the globe. In order to create the globe we are going to, in this case, use graphics that were built in Photoshop. If you wanted to use your own graphics that would be fine too. Just follow the same procedures and you should be able to replace the graphics with whatever you choose! We will set it up in a way that makes the most sense. Highlights and the glass will go on the top layer. Followed in order by the things you need to see. The snow layers will be on either side of the inner content so that you have a bit of depth on either side of the buildings. Finally, the base will live in the bottom-most layer behind the glass and content.
8. Create 5 layers for the base, snow behind, inner content, snow in front, and glass highlight
9. Draw these assets within flash or use Photoshop to create these graphics
10. Choose "Insert > New Symbol", name this new MovieClip "SnowGeneratorCircle.as" and choose "Export for ActionScript"
11. Choose "New > ActionScript File" and name this file "SnowGeneratorCircle.as". The snow generator is an empty MovieClip that will create our snow particles and have a simple method to reset all of them when the globe is shaken. It’s set up to be a MovieClip with code attached to it so that it could easily be used in the authoring environment for placement.
package {
import flash.display.Sprite;
import flash.events.Event;
public class SnowGeneratorCircle extends Sprite {
var totalFlakes:int = 500;
var flakes:Array = new Array();
public function SnowGeneratorCircle() {
addSnowFlakes();
addEventListener(Event.ENTER_FRAME, update);
}
protected function addSnowFlakes():void{
for(var i:int=0; i<totalFlakes; i++){
var f:SnowFlake = new SnowFlake();
addChild(f);
flakes.push(f);
}
}
public function reset():void{
for(var i:int=0; i<totalFlakes; i++){
var f:SnowFlake = flakes[i];
f.reset();
}
}
public function update(e:Event=null):void {
for(var i:int=0; i<totalFlakes; i++){
var f:SnowFlake = flakes[i];
f.update(0);
}
}
}
}
12. Choose "New > ActionScript File" and name this file "Circle.as". The Circle object is a class that I wrote to do a couple of math calculations for the things involving a circle in our app.
package
{
import flash.geom.Point;
public class Circle
{
public var x:Number;
public var y:Number;
public var radius:Number;
public function Circle(x:Number, y:Number, radius:Number) {
this.x = x;
this.y = y;
this.radius = radius;
}
public function circleExists(objX:Number, objY:Number, objRadius:Number):Boolean {
// find out if a smaller circle exists within the bounds of this circle
var dist:Number = Math.sqrt( Math.pow(objX, 2) + Math.pow(objY, 2) );
public function getPointInRange(minAngle:Number,maxAngle:Number,minRadius:Number,maxRadius:Number):Point {
// fetches a point within given params. This isn't tied to this circle radius specifically
var p:Point = new Point();
var a:Number = (Math.random()*(maxAngle-minAngle)) + minAngle;
var r:Number = (Math.random()*(maxRadius-minRadius)) + minRadius;
p.x = Math.cos(a * Math.PI/180) * r;
p.y = Math.sin(a * Math.PI/180) * r;
return p;
}
public function getRandomPoint(maxRadius:Number):Point {
// fetches a random point within this circle radius
var p:Point = new Point();
var a:Number = (Math.random()*360);
var r:Number = (Math.random()*maxRadius);
p.x = Math.cos(a * Math.PI/180) * r;
p.y = Math.sin(a * Math.PI/180) * r;
return p;
}
}
}
13. Choose "New > ActionScript File" and name this file "SnowFlake.as". Our snowflake is the coolest part about this app. At first I thought of having real physics for the snowflakes, but for simplicity of tutorial sake I decided to use simple falling physics and just reset the flake to a random position in the globe when you shake it. When you instantiate a SnowFlake it draws its own graphics, sets a few variables for simple physics and adds some depth of field blur based on a randomized depth.
package
{
import flash.display.Shape;
import flash.geom.Point;
import flash.filters.BlurFilter;
public class SnowFlake extends Shape
{
public var vel:Point = new Point;
public var radius:Number = 10;
public var circle:Circle = new Circle(0,0,175);
public function SnowFlake() {
// draw snowflake
graphics.lineStyle(3,0xffffff);
graphics.moveTo(0,0);
graphics.lineTo(0.2,0.2);
// place the snowflake randomly
var p:Point = circle.getRandomPoint( circle.radius - this.radius );
// cache this vector object as a bitmap so the flash player will render it faster
cacheAsBitmap = true;
// some velocity properties
vel.x = (Math.random()*2)-1;
vel.y = 1.5;
vel.x*=radius;
vel.y*=radius;
}
public function reset():void{
// reset our snowflake to a new random position
var p:Point = circle.getRandomPoint( circle.radius - this.radius );
this.x = p.x;
this.y = p.y;
if(this.y > 125) this.y = 0;
}
public function update(wind:Number):void {
// this function is called on an enter frame event from the Generator class
if( circle.circleExists(x,y,radius) && y < 125 ){
x+=vel.x;
y+=vel.y;
x += (wind*radius);
}
}
public function calculatePerspectiveSize(z:Number) : Number {
var fov:Number = 300;
return fov/(z+fov);
}
}
}
14. Good luck and Publish!
(On the Left) CHRIS SMITH, Senior Interactive Developer Domani Studios
Chris has been experimenting with digital design and development since the age of 17. By pouring his strong emphasis on usability, innovation and expansion in a bowl, then mixing together his diverse skill-set, Chris has helped Domani Studios bring award winning projects for Porsche, Hanes and Allstate to life. When not channeling his inner-ninja, he spends his days making things look rad and his nights playing lightning fast guitar. Chris specializes in the Adobe suite, animation and experimental visual programming.
(On the Right) SCOTT HIERS, Art Director Domani Studios
Scott is a multi-disciplined Art Director at Domani Studios Chicago. With over seven years of experience in the digital and interactive design realm he's come to embrace the diverse roster of clients and creatives that have inspired him. Scott is extremely fortunate to be book-ended by the creative challenges and unique exploration that this industry provides. One his biggest challenges at DS is keeping gravity from hindering Chris's hair via an Aqua-Net defense shield.
Re: Creating an Interactive Snow Globe with Action Script 3.0 by Lu Soto4957934
Hi guys, The interactive snow glove is very cool, but am trying to recreate it and is not working, am not sure what am doing wrong. Where can I view the source for this?
Re: Creating an Interactive Snow Globe with Action Script 3.0 by Sian Evans5065733
I get this error:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at SnowGlobeContainer/update()
which seems to refer to snowForeground even though I have that labelled correctly on the top snow layer. The snow falls once when it opens, but no new snow comes when you shake it. HEEEELLLLP!
Re: Creating an Interactive Snow Globe with Action Script 3.0 by Grant Davis5485854
@Katie Steed
I made a snowman that changes outfits randomly every time you shake the snowglobe. To do this I created the movieclip for each element (for example, "hair" with 16 frames of various hairstyles) on the inner content layer.
Then in the SnowGlobeContainer.as file I listed the variables (around Line 49: public var hair:MovieClip;). Finally, within the update function below the line 'snowBackground.reset();' I added this line: 'hair.gotoAndStop(Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum);'.
If you dont want it to be random it could just do a NextFrame script and you have the fade in worked into the timeline. Or use tweennano functions. Maybe that will help you.
Re: Creating an Interactive Snow Globe with Action Script 3.0 by Katie Steed5829121
Thanks for this tutorial guys - really useful and worked perfectly first time!
I really need some help though, does anyone know how to make it so the contents of the globe change when the user shakes it? Preferably fading in and out too...?
Many thanks :)
Re: Creating an Interactive Snow Globe with Action Script 3.0 by Grant Davis6002497
I believe the snow layer objects need to be labeled 'snowForeground' and 'snowBackground', respectively to get rid of the SnowGlobeContainer.as 1009 error.
The issue I am having is that the snow is falling on a simple click of the globe and not just on the shaking, and I am unsure of where I need to edit that.
Re: Creating an Interactive Snow Globe with Action Script 3.0 by Em Brook6381403
Hi This is a great tutorial and it seems to be working fine for me however, I would love it to play a Christmas tune in the background and can't seem to do this....any help or update on this tutorial to do this would be really appreciated.
Re: Creating an Interactive Snow Globe with Action Script 3.0 by Em Brook6524718
Loving this but to repeat a previous comment is there a way to add music and for it to run smoothly with this file as I'm struggling to put a christmas tune in the background.
Re: Creating an Interactive Snow Globe with Action Script 3.0 by Jessica Gallmon6679697
Love this tutorial thank you. Only issue I am having is that when I add music and want the interaction to fade to something else at the end of the music.
Right now, if I just watch the animation and do not interact with the globe during the animation, the timing with the music works out perfectly. If you then refresh to play again and view it a second time, this time interacting with the globe, it slows down animation time considerably and then it doesn't even come close to matching the length of the music. Is there some way to get around this? Or is it just the lag time of the actionscript with the interaction? Thank you for any help!
Re: Creating an Interactive Snow Globe with Action Script 3.0 by Mandy Stos7025358
Hi Guys! This is awesome! I've got it all to work pretty much but am having an issue with the SnowGeneratorCircle.as - For some reason i get errors and im not getting any snow.
My snow globe doesnt appear to move either with the mouse. It just stays stationary. Not sure if these all tie in together. Any help at all I totally appreciate. You guys rock.
Building an Interactive Whiteboard in Flash: Part Two Play Video In part two of this series, Justin Junda walks you through the necessary steps to connect the graphical elements from part one, with Actionscript 3.0 using the Flash drawing API in order to bring this whiteboard to life.
Building an Interactive Whiteboard in Flash: Part One Play Video In this tutorial, Justin Junda takes you through the step by step process on how to build and interactive whiteboard. These whiteboard are often seen in drawing applications, scratch pads, and educational sites. This is part one of a two part series. Part one takes you through setting up all the graphical elements within the stage. Then part two shows a user how to connect the graphics to Actionscript using flashes drawing API to make this whiteboard truly interactive.
Embedding a Speech Transcript in a Flash Video with Adobe CS5 Play Video In this tutorial, Creative COW Leader Michael Hurwicz shows you how to create a scrolling transcript synced with a Flash video, using Adobe Creative Suite 5 (Story, OnLocation, Premiere Pro, Soundbooth and Flash Professional).
Inverse Kinematics - Springs Play Video Springs are a new feature for Inverse Kinematics in Flash CS5. In this video tutorial, Creative COW leader Michael Hurwicz shows you a simple technique for implementing springs, as well as several other "tricks and traps" to make your work with Inverse Kinematics in Flash easier, more flexible and more powerful.
Inverse Kinematics - Control Points Play Video Fine-tune your Inverse Kinematics animations in Flash CS5 by working with control points. In this Adobe Flash video tutorial, Creative COW leader Michael Hurwicz shows you how to associate bones with control points, how to move, add and delete control points, and how to adjust control point handles.
Inverse Kinematics Play Video Inverse Kinematics allows you to create structures of bones and joints and use them to animate characters in Flash. Fun and easy! Creative COW leader Michael Hurwicz shows you how in this video tutorial, step by step. Learn some basic ActionScript, too!
Simple Multi-Video Player in AS3 Play Video In this video tutorial, Creative Cow leader Tony Ross demonstrates how to create a simple multi-video player in Flash using Actionscript 3. Also learn to have several videos use a single flv player.
Simple Multi-Video Player in AS2 Play Video In this video tutorial, Creative Cow leader Tony Ross demonstrates how to create a simple multi-video player in Flash using Actionscript 2. Also learn to have several videos use a single flv player.
Author/Videographer/Animator/Musician Michael Hurwicz examines Flash CS3 Professional Video Studio Techniques by Robert Reinhardt, and recommends it to those looking to push their Flash sites to professional levels of reliability and user-friendliness.
Simple pause and play AS2 script in Flash Play Video In this video tutorial, Creative Cow leader Tony Ross demonstrates how to add a simple pause/resume functionality to a scrolling image bar using Actionscript 2.