Free ActionScript

Flash AS2 & AS3 Tutorials, Game Code, Effects, Source Files & Sample Downloads

Draw Box Class

By request, here is a simple box drawing class. Click and drag to draw box based on mouse position.

This can be used as an object selecting mechanism in games to select multiple objects at the same time.

Click and drag to draw box

View Code ACTIONSCRIPT
/**
 * Draw Box class
 * ---------------------
 * VERSION: 1.0
 * DATE: 11/14/2010
 * AS3
 * UPDATES AND DOCUMENTATION AT: http://www.FreeActionScript.com
 **/
package com.freeactionscript
{
	import flash.display.DisplayObjectContainer;
	import flash.events.MouseEvent;
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class Box extends Sprite
	{
		private var _canvas:DisplayObjectContainer;
		private var _startX:Number;
		private var _startY:Number;
		private var _endX:Number;
		private var _endY:Number;
 
		public function Box($canvas:DisplayObjectContainer, $startX:Number, $startY:Number)
		{			
			_canvas = $canvas;
			_startX = $startX;
			_startY = $startY;
			_endX = _canvas.mouseX;
			_endY = _canvas.mouseY;
 
			_canvas.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler);
			_canvas.addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);
			_canvas.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
		}
 
		private function onMouseMoveHandler(event:MouseEvent):void
		{
			_endX = _canvas.mouseX;
			_endY = _canvas.mouseY;
		}
 
		private function onMouseUpHandler(event:MouseEvent):void 
		{
			_canvas.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler);			
			_canvas.removeEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);
			_canvas.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
		}
 
		private function onEnterFrameHandler(event:Event):void 
		{
			graphics.clear();
			graphics.lineStyle(2, 0x88B1CC);
			graphics.moveTo(_startX, _startY);
			graphics.beginFill(0x88B1CC, .25);
			graphics.lineTo(_endX, _startY);
			graphics.lineTo(_endX, _endY);
			graphics.lineTo(_startX, _endY);
			graphics.lineTo(_startX, _startY);
			graphics.endFill();
		}
	}
}
Download Fla Sample

Download Fla Sample

8-way keyboard movement with rotation & velocity

This is an optimized AS3 version of the old movement code.

AS3 8-way keyboard player movement with rotation and velocity script.

Click and use Arrow Keys to move:

View Code ACTIONSCRIPT
/**
 * Player Movement - 8-way keyboard with velocity
 * ---------------------
 * VERSION: 1.0
 * DATE: 9/23/2010
 * AS3
 * UPDATES AND DOCUMENTATION AT: http://www.FreeActionScript.com
 **/
package  
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
 
    public class Main extends MovieClip
    {        
        // player
        private var _player:MovieClip;
 
        // player settings
        private var _maxSpeed:Number = 5;
        private var _rotationSpeed:Number = 5;
        private var _thrust:Number = .5;
        private var _decay:Number = .97;        
 
        private var _currentSpeed:Number = 0;
        private var _speedX:Number = 0;
        private var _speedY:Number = 0;
 
        // movement flags
        private var _movingUp:Boolean = false;
        private var _movingLeft:Boolean = false;
        private var _movingRight:Boolean = false;
 
        /**
         * Constructor
         */
        public function Main() 
        {
            createPlayer();
 
            // add listeners
            stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);            
            stage.addEventListener(KeyboardEvent.KEY_DOWN, myOnPress);
            stage.addEventListener(KeyboardEvent.KEY_UP, myOnRelease);            
        }
 
        /**
         * Creates player
         */
        private function createPlayer():void
        {
            _player = new Player();
            _player.x = stage.stageWidth / 2;
            _player.y = stage.stageHeight / 2;
            stage.addChild(_player);
        }
 
        /**
         * EnterFrame Handlers
         */
        private function enterFrameHandler(event:Event):void
        {
            // Rotate right or left
            if (_movingRight)
            {
                _player.rotation += _rotationSpeed;
            }
            if (_movingLeft)
            {
                _player.rotation -= _rotationSpeed;
            }
            if (_movingUp)
            {
                _speedX += _thrust * Math.sin(_player.rotation * (Math.PI / 180));
                _speedY += _thrust * Math.cos(_player.rotation * (Math.PI / 180));
            } 
            else{
                // Deccelerate when Up Arrow key is released
                _speedX *= _decay;
                _speedY *= _decay;
            }
 
            // Maintain speed limit
            _currentSpeed = Math.sqrt((_speedX * _speedX) + (_speedY * _speedY));
 
            if (_currentSpeed > _maxSpeed)
            {
                _speedX *= _maxSpeed/_currentSpeed;
                _speedY *= _maxSpeed/_currentSpeed;
            }
 
            // Move _player based on calculations above
            _player.y -= _speedY;
            _player.x += _speedX;
        }
 
        /**
         * Key Press Handlers
         */
        public function myOnPress(event:KeyboardEvent):void
        {
            switch( event.keyCode )
            {
                case Keyboard.UP:
                    _movingUp = true;
                    break;
 
                case Keyboard.LEFT:
                    _movingLeft = true;
                    break;
 
                case Keyboard.RIGHT:
                    _movingRight = true;
                    break;
            }
        }
 
        /**
         * Key Release Handlers
         */
        public function myOnRelease(event:KeyboardEvent):void
        {
            switch( event.keyCode )
            {
                case Keyboard.UP:
                    _movingUp = false;
                    break;
 
                case Keyboard.LEFT:
                    _movingLeft = false;
                    break;
 
                case Keyboard.RIGHT:
                    _movingRight = false;
                    break;
            }
        }
 
    }
 
}
Download Fla Sample

Download Fla Sample

Scroller – Dynamic Scrollbar

Here is a scroller widget. Sized dynamically based on content movieclip size.

Download Fla Sample

Download Fla Sample

Dispenser, Deflector & Puller Particle Effect

For a lack of a better description, this is the “Dispenser, Deflector & Puller” particle effect.

Dispenser dispenses particles, deflector deflects them, and the puller pulls particles towards itself.

The deflector code was added to my previous Reclaimer Effect by a very nice fellow named “Hey” from the Actionscript.org forums. I just cleaned it up and packaged it. Thanks Hey!

View Code ACTIONSCRIPT
/**
 * Dispenser, Deflector & Puller Particle Effect
 * -----------------------------------------------
 * VERSION: 1.0
 * DATE: 3/15/2010
 * AS3
 * UPDATES AND DOCUMENTATION AT: http://www.FreeActionScript.com
 **/
package
{
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent;
 
    public class Main extends Sprite
    {
		// you can play around with these
        private var particlesTotal:Number = 50;
        private var particleSpeed:Number = 10;
        private var particleFadeoutSpeed:Number = .0175;
 
		// don't change these
		private var particlesCurrent:Number = 0;
        private var particlesArray:Array;
        private var radians:Number;
        private var dx:Number;
        private var dy:Number;
        private var distSQ:Number;
        private var forceX:Number;
        private var forceY:Number;
 
        public function Main():void
        {
            init();
        }
 
        private function init():void
        {
            radians = 180 / Math.PI;
            particlesArray = [];
 
            addEventListener(Event.ENTER_FRAME, onEnterFrameLoop);
 
            dispenser_mc.addEventListener(MouseEvent.MOUSE_DOWN, onThingDown);
            puller_mc.addEventListener(MouseEvent.MOUSE_DOWN, onThingDown);
            deflector_mc.addEventListener(MouseEvent.MOUSE_DOWN, onThingDown);
 
            dispenser_mc.addEventListener(MouseEvent.MOUSE_UP, onThingUp);
            puller_mc.addEventListener(MouseEvent.MOUSE_UP, onThingUp);
            deflector_mc.addEventListener(MouseEvent.MOUSE_UP, onThingUp);
 
        }
 
        private function onThingDown(event:MouseEvent):void
        {
            event.currentTarget.startDrag();
        }
        private function onThingUp(event:MouseEvent):void
        {
            event.currentTarget.stopDrag();
        }
 
        private function createParticle(target1:MovieClip, target2:MovieClip):void
        {
            if(particlesTotal <= particlesCurrent)
            {
                return;
            }
            particlesCurrent++;
 
            var tempParticle:Particle = new Particle();
 
            tempParticle.x = (target1.x - target1.width / 2) + (Math.random() * target1.width);
            tempParticle.y = (target1.y - target1.height / 2) + (Math.random() * target1.height);
            tempParticle.rotation = Math.random()*360;
 
            tempParticle.rot = Math.atan2(target1.y - target2.y, target1.x - target2.x);
            tempParticle.xSpeed = Math.cos(tempParticle.rot) * radians / particleSpeed;
            tempParticle.ySpeed = Math.sin(tempParticle.rot) * radians / particleSpeed;
            tempParticle.mass = tempParticle.width / 2 + tempParticle.height / 2;
 
            particlesArray.push(tempParticle);
 
            addChild(tempParticle);
 
        }
 
        private function updateParticle():void
        {
            for (var i = 0; i < particlesArray.length; i++)
            {
                var tempParticle:MovieClip = particlesArray[i];
 
                tempParticle.x -= tempParticle.xSpeed;
                tempParticle.y -= tempParticle.ySpeed;
                tempParticle.alpha -= particleFadeoutSpeed;
 
                dx = tempParticle.x - deflector_mc.x;
                dy = tempParticle.y - deflector_mc.y;
                distSQ = ((dx * dx) + (dy * dy));
 
				//force = mass x acceleration
                forceX = tempParticle.mass * tempParticle.xSpeed;
                forceY = tempParticle.mass * tempParticle.ySpeed;
 
				var deflector_mcMass:Number = (deflector_mc.width / 2 + deflector_mc.height / 2);
 
                tempParticle.x += deflector_mcMass * (dx+forceX) / distSQ;
                tempParticle.y += deflector_mcMass * (dy+forceY) / distSQ;
 
                if(tempParticle.hitTestObject(puller_mc))
                {
                    destroyParticle(tempParticle);
                }
                else if (tempParticle.alpha <= 0)
                {
                    destroyParticle(tempParticle);
                }
                else if (tempParticle.x < 0)
                {
                    destroyParticle(tempParticle);
                }
                else if (tempParticle.x > stage.stageWidth)
                {
                    destroyParticle(tempParticle);
                }
                else if (tempParticle.y < 0)
                {
                    destroyParticle(tempParticle);
                }
                else if (tempParticle.y > stage.stageHeight)
                {
                    destroyParticle(tempParticle);
                }
            }
        }
 
        private function destroyParticle(particle:MovieClip):void
        {
            for (var i = 0; i < particlesArray.length; i++)
            {
                var tempParticle:MovieClip = particlesArray[i];
                if (tempParticle == particle)
                {
                    particlesCurrent--;
                    particlesArray.splice(i,1);
                    removeChild(tempParticle);
                }
            }
        }
 
        private function onEnterFrameLoop(event:Event):void
        {
            createParticle(dispenser_mc, puller_mc);
            updateParticle();
        }
 
    }
}
Download Fla Sample

Download Fla Sample