Snake

by miyaoka
Drag and throw a ball, or simply click a ball.
♥0 | Line 162 | Modified 2009-05-23 20:21:28 | MIT License
play

ActionScript3 source code

/**
 * Copyright miyaoka ( http://wonderfl.net/user/miyaoka )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/iFgO
 */

/*
Drag and throw a ball, or simply click a ball.
*/
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;

	
	[SWF(width = "465", height = "465", backgroundColor = 0x0, frameRate = "60")]
	
	public class Snake
	extends Sprite 
	{	
		private var movers:Array = new Array();
		public function Snake():void 
		{
			for (var j:int = 0; j < 3; j++)
			{
				var moverContainer:Sprite = new Sprite();
				moverContainer.y = 445;
				addChild(moverContainer);
				
			
			var moverX:Number = Math.random() * 300 + 100;
			var moverY:Number = Math.random() * -300 - 100;
			for (var i:int = 0; i < 100; i++)
			{
				var mover:Mover = new Mover();
				mover.x = moverX;
				mover.y = moverY;
				moverContainer.addChild(mover);
				mover.addEventListener("throw", throwHandler);
			}
			}			
		}
		private function throwHandler(e:Event):void 
		{
			var mover:Mover = Mover(e.target);
			Sprite(mover.parent).setChildIndex(mover, 0);
			
			for (var j:int = 0; j < numChildren; j++) 
			{
				var moverContainer:Sprite = Sprite(getChildAt(j));
				var m0:Mover = Mover(moverContainer.getChildAt(0));
				for (var i:int = 0; i < moverContainer.numChildren; i++)
				{
					var m:Mover = Mover(moverContainer.getChildAt(i));
					
					m.addVector(mover.throwVect, m0.x, m0.y, 10*i);
				}
			}
		}
		
	}
	
}
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.filters.GlowFilter;
import flash.filters.DropShadowFilter;
	
class Mover
extends Sprite
{
	private static var grav:Number = 0.5;
	private static var w:Number = 465;
	private static var yRef:Number = 0.85;
	private static var xRef:Number = 0.75;
	
	private var yy:Number = 0;
	private var xx:Number = 0;
	private var pts:Array = new Array();
	private var isDragged:Boolean = false;
	private var lastPt:Point;
	public var throwVect:Point;
	private var timer:Timer = new Timer(1);
	
	public function Mover():void 
	{		
		addEventListener(Event.ADDED_TO_STAGE, init);
	}
	private function init(e:Event):void 
	{
		removeEventListener(Event.ADDED_TO_STAGE, init);
		
		buttonMode = true;
		graphics.beginFill(0xFFFFFF, 1);
		graphics.drawCircle( 0, 0, Math.random()*20+1);
		startMove();
		lastPt = new Point(x, y);

		

		filters = [
			new DropShadowFilter(0, 0, 0xFFFFFF, 1, 40, 40, 1, 3)
		];
		addEventListener(MouseEvent.MOUSE_DOWN, function ():void 
		{
			startDrag();
			isDragged = true;
			pts = [];
			addEventListener(Event.ENTER_FRAME, recPt, false, 0, true);
			stopMove();
		});
		stage.addEventListener(MouseEvent.MOUSE_UP, function ():void 
		{
			if (!isDragged) return;
			isDragged = false;
			stopDrag();
			removeEventListener(Event.ENTER_FRAME, recPt);

			throwVect = new Point(x, y).subtract(lastPt);
			if (throwVect.x == 0) 
			{
				throwVect.x = Math.random() * 60 - 30;
				throwVect.y = Math.random() * -10 - 15;
			}
			dispatchEvent(new Event("throw"));
			startMove();
		});
	}
	private function recPt(e:Event):void 
	{
		lastPt = new Point(x, y);

	}
	public function addVector(pt:Point, x_:Number, y_:Number,  delay:Number):void 
	{		
		timer.reset();
		timer = new Timer(delay, 1);
		timer.start();
		timer.addEventListener(TimerEvent.TIMER_COMPLETE, function ():void {
			startMove();
			x = x_;
			y = y_;
			yy = pt.y;
			xx = pt.x;
		});
	}
	private function startMove():void 
	{
		addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, 0, true);
	}
	private function stopMove():void 
	{
		removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
	}
	private function  enterFrameHandler(e:Event):void 
	{
		yy += grav;
		y += yy;
		x += xx;
		
		if (y > 0 )
		{			
			y *= -yRef;
			yy *= -yRef;
			
			if (yy > -4) {
				y = 0; yy = 0;
			}
		}
		if (x < 0 )
		{
			x *= -xRef;
			xx *= -xRef;				
		}
		else if (x > w)
		{
			x = w - (x - w) * xRef;
			xx *= -xRef;
		}
		if (y == 0 && yy == 0)
		{
			xx *= 0.98;
			if (Math.abs(xx) < 1) stopMove();
		}
	}
}