flash game effects
Endless Starfield - Parallax Scrolling
AS3 version of my endless starfield & parallax scrolling effect. This is a huge improvement over the last script in terms of performance and ease-of-use.
This version lets you set the width, height, and speed of the starfield, as well as position it anywhere on stage by setting the X & Y coordinates (old version only allowed it to be fullscreen).
This is great because you’ll now be able to use it in games (top-down and side scrollers), any size banners (horizontal or skyscrapers), and anywhere else you need the effect.
Using it is pretty simple:
parallaxField.createField(containerMC, x, y, width, height, numberOfStars, speedX, speedY);
You can also use:
parallaxField.enable();
parallaxField.disable();
To start and stop the effect.
See Main.as for exact usage examples.
/** * Endless Starfield - Parallax Scrolling * --------------------- * VERSION: 1.0 * DATE: 6/26/2010 * AS3 * UPDATES AND DOCUMENTATION AT: http://www.FreeActionScript.com **/ package com.freeactionscript { import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.utils.getDefinitionByName; public class ParallaxField extends MovieClip { // settings & vars private var acceleration:Number = .25; private var starBox:Sprite; private var starsArray:Array = []; private var starArrayLength:int; private static var STAR_SMALL:String = "small"; private static var STAR_NORMAL:String = "normal"; private static var STAR_LARGE:String = "large"; private var pathToContainer:MovieClip; private var containerX:int; private var containerY:int; private var containerWidth:int; private var containerHeight:int; private var speedX:Number; private var speedY:Number; private var isStarted:Boolean = false; private var _upPressed:Boolean = false; private var _downPressed:Boolean = false; private var _leftPressed:Boolean = false; private var _rightPressed:Boolean = false; /** * Creates Parallax Field * * @param $container The container that holds all our starfield assets. Must be created and added to stage before being used here. * @param $x The X position of our starfield. * @param $y The Y position of our starfield. * @param $width The width of our starfield. * @param height The height of our starfield. * @param $numberOfStars Number of stars to create. * @param $speedX The initial X speed of our starfield. * @param $speedY The initial Y speed of our starfield. */ public function createField($container:MovieClip, $x:int, $y:int, $width:int, $height:int, $numberOfStars:int, $speedX:int, $speedY:int):void { trace("createField"); // save property references pathToContainer = $container; containerX = $x; containerY = $y; containerWidth = $width; containerHeight = $height; speedX = $speedX; speedY = $speedY; // create everything createStarBox(); addStars($numberOfStars, "small"); addStars($numberOfStars, "normal"); addStars($numberOfStars, "large"); // enable enable(); } /** * Adds stars to star container * * @param $numberOfStars Amount of stars to create */ public function addStars($numberOfStars:int, $type:String):void { trace("Adding stars..."); var newNumberOfStars:Number; var graphic:String; var speedModifier:Number; var ClassReference:Class; // set star properties if ($type == STAR_LARGE) { graphic = "StarLarge"; speedModifier = 1; newNumberOfStars = Math.round($numberOfStars * .30); } else if ($type == STAR_NORMAL) { graphic = "StarNormal"; speedModifier = .66; newNumberOfStars = Math.round($numberOfStars * .60); } else if ($type == STAR_SMALL) { newNumberOfStars = Math.round($numberOfStars * 1); graphic = "StarSmall"; speedModifier = .33; } trace(" type: " + graphic); trace(" amount: " + newNumberOfStars); // run a for loop to create new stars (based on numberOfStars) var i:int; for (i = 0; i < newNumberOfStars; i++) { // get class via string name ClassReference = getDefinitionByName(graphic) as Class; // create class var tempStar:MovieClip = new ClassReference(); // set random starting position tempStar.x = (Math.random() * (containerWidth - tempStar.width)) + containerX; tempStar.y = (Math.random() * (containerHeight - tempStar.height)) + containerY; // give the star its own speed modifier tempStar.speedModifier = speedModifier; // add new star to array that tracks all stars starsArray.push(tempStar); // add to display list pathToContainer.addChild(tempStar); } trace("Stars Added \n"); } /** * Activates parallax effect */ public function enable():void { if (!isStarted) { trace("Starting parallax effect..."); isStarted = true; // add enter frame pathToContainer.addEventListener(Event.ENTER_FRAME, gameLoop); } else { trace("Parallax effect already running."); } } /** * Disables parallax effect */ public function disable():void { if (isStarted) { trace("Stopping parallax effect..."); isStarted = false; // remove enter frame pathToContainer.removeEventListener(Event.ENTER_FRAME, gameLoop); } else { trace("Parallax effect is not running."); } } /** * key press getters and setters */ public function get upPressed():Boolean { return _upPressed; } public function set upPressed(value:Boolean):void { _upPressed = value; } public function get downPressed():Boolean { return _downPressed; } public function set downPressed(value:Boolean):void { _downPressed = value; } public function get leftPressed():Boolean { return _leftPressed; } public function set leftPressed(value:Boolean):void { _leftPressed = value; } public function get rightPressed():Boolean { return _rightPressed; } public function set rightPressed(value:Boolean):void { _rightPressed = value; } /*************************************************************************/ /** * @private * Creates a star container */ private function createStarBox():void { trace("Creating star container..."); trace(" path: " + pathToContainer); trace(" x: " + containerX); trace(" y: " + containerY); trace(" width: " + containerWidth); trace(" height: " + containerHeight); // create new container for stars starBox = new Sprite(); starBox.graphics.beginFill(0x000000); // set container's properties starBox.x = containerX; starBox.y = containerY; starBox.width = containerWidth; starBox.height = containerHeight; // create mask var starBoxMask:Sprite = new Sprite(); starBoxMask.graphics.beginFill(0xFF0000); starBoxMask.graphics.drawRect(containerX, containerY, containerWidth, containerHeight); pathToContainer.addChild(starBoxMask); // Apply mask starBox.mask = starBoxMask; // add starBox to stage pathToContainer.addChild(starBox); trace(" Container Created \n"); } /** * @private * This function is executed every frame. */ private function gameLoop(event:Event):void { updateSpeed(); updateStars(); } /** * @private * This function updates the movement speed */ private function updateSpeed():void { if (upPressed) { speedY = speedY - acceleration; } else if (downPressed) { speedY += acceleration; } if (rightPressed) { speedX += acceleration; } else if (leftPressed) { speedX -= acceleration; } } /** * @private * This function updates all the objects in the stars array */ private function updateStars():void { // setting the array length variable outside of the for loop improves speed starArrayLength = starsArray.length; // setting the "tempStar" variable outside of the for loop improves speed var tempStar:MovieClip; // setting the "i" variable outside of the for loop improves speed var i:int; // run for loop for(i = 0; i < starArrayLength; i++) { tempStar = starsArray[i]; tempStar.x += speedX * tempStar.speedModifier; tempStar.y += speedY * tempStar.speedModifier; //Star boundres //check X boudries if (tempStar.x >= containerWidth - tempStar.width + containerX) { //outside boundry, move to other side of container tempStar.x = containerX; tempStar.y = (Math.random() * (containerHeight - tempStar.height)) + containerY; } else if (tempStar.x <= containerX) { //outside boundry, move to other side of container tempStar.x = containerWidth + containerX - tempStar.width; tempStar.y = (Math.random() * (containerHeight - tempStar.height)) + containerY; } //check Y boudries if (tempStar.y >= containerHeight - tempStar.height + containerY) { //outside boundry, move to other side of container tempStar.x = (Math.random() * (containerWidth - tempStar.width)) + containerX; tempStar.y = containerY; } else if (tempStar.y <= containerY) { //outside boundry, move to other side of container tempStar.x = (Math.random() * (containerWidth - tempStar.width)) + containerX; tempStar.y = containerHeight + containerY - tempStar.height; } } } } } |
I know this script is not perfect. I might update it in the near future to use bitmaps instead of movieclips, among other things.
Simple Flashlight Effect
Here’s a very simple Flash flashlight effect that uses almost no ActionScript. The only AS used is for rotation and key detection.
The effect is archived with a mask and a filter. The filter is a simple gradient fill, same color as the “dark”. One side the alpha is 100, the other size alpha 0. Both the mask and the filter are the same shape and size (I’m using the same movieclip actually). To make everything work, you have to rotate and move the filter and mask at the same time (along with the player).
Preview
Also note the center registration point for the filter, mask and player. Make sure everything is aligned or the effect will break.
CategoriesLinks |
