In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: 【AS100本ノック】9回目:雪

AS100本ノック
* 9回目のお題は「雪」
* あなたなりの「雪」を表現してください。
* 
* 時間がないのでパラメータとかテキトーになた。
/**
 * Copyright mex_ny ( http://wonderfl.net/user/mex_ny )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/yWLw
 */

// forked from mex's 【AS100本ノック】9回目:雪
/* 
 * AS100本ノック
 * 9回目のお題は「雪」
 * あなたなりの「雪」を表現してください。
 * 
 * 時間がないのでパラメータとかテキトーになた。
 */
package {
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.display.Shape;
	import flash.display.StageScaleMode;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.events.Event;

	public class Snow extends Sprite {
		private const SNOW_PARTICLE_NUMBER:uint = 400;
		private var _stageWidht:Number , _stageHeight:Number;

		public function Snow() {
			if ( stage ) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			stage.quality = StageQuality.BEST;
			_stageWidht = stage.stageWidth;
			_stageHeight = stage.stageHeight;
			Wonderfl.capture_delay( 3 );
			
			addBackground();
			addSnow();
			changeDepth()
		}
		
		private function addBackground():void
		{
			var shape:Shape , g:Graphics;
			addChild( shape = new Shape() );
			g = shape.graphics;
			g.beginFill( 0x000000 );
			g.drawRect( 0 , 0 , _stageWidht , _stageHeight );
			g.endFill();
		}
		
		private function addSnow():void
		{
			var i:uint , snowParticle:SnowParticle;
			
			for ( i = 1; i <= SNOW_PARTICLE_NUMBER; i++ )
			{
				addChild( snowParticle = new SnowParticle( _stageWidht , _stageHeight ) );
				snowParticle.name = i.toString();
			}
		}
		
		private function changeDepth():void
		{
			var i:uint , snowParticle:SnowParticle;

			for ( i = 1; i <= SNOW_PARTICLE_NUMBER; i++ )
			{
				snowParticle = getChildByName( i.toString() ) as SnowParticle;
				if ( snowParticle.isBig )
					swapChildrenAt( getChildIndex(snowParticle ) , numChildren - 1 );
			}
		}
	}
}

import flash.display.Sprite;
import flash.display.Shape;
import flash.display.Graphics;
import flash.events.Event;
import flash.filters.BlurFilter;
	
class SnowParticle extends Sprite
{
	private const PARTICLE_MAX_SIZE:uint = 60;
	private const MAX_SPPED:uint = 11;

	private var _particle:Shape;
	private var _size:Number;
	private var _stageWidth:uint;
	private var _stageHeight:uint;
	private var _sx:Number;
	private var _sy:Number;
	private var _isBig:Boolean = false;
	private var _basePosition:Number;

	public function SnowParticle( stageWidth:uint , stageHeight:uint ):void
	{
		_stageWidth = stageWidth;
		_stageHeight = stageHeight;
		init();
	}
	
	private function init():void
	{
		checkBig();
		addSnow();
		setPosition();
		setSpeed();
		setFilter();
		moveSnow();
	}
	
	private function checkBig():void
	{
		if ( Math.round( Math.random() * 10 ) == 10 )
			_isBig = true;
	}
	
	private function addSnow():void
	{
		var g:Graphics , i:uint , pi:Number , angle:Number;
		
		addChild( _particle = new Shape() );
		
		if ( !_isBig )
		{
			_size = Math.random() * PARTICLE_MAX_SIZE / 10;
			_particle.alpha = _size / ( PARTICLE_MAX_SIZE / 10 ) * Math.random() + 0.3;
		}
		else
		{
			_size = Math.random() * PARTICLE_MAX_SIZE + PARTICLE_MAX_SIZE / 4;
			_particle.alpha = Math.random() * 0.7 + 0.2;
		}

		g = _particle.graphics;
		g.beginFill( 0xffffff );
		g.moveTo( _size , 0 );
		
		pi = Math.PI / 180;
		for( i = 0; i < 6;i++)
		{
			angle = 60 * i;
			g.lineTo( _size * Math.cos( pi * angle ) , _size * Math.sin( pi * angle ) );
		}
		g.lineTo( _size , 0);
	}
	
	private function setPosition():void
	{
		_particle.x = Math.random() * _stageWidth;
		_particle.y = Math.random() * _stageHeight * -1;
		
		_basePosition = _size >> 1;
	}
	
	private function setSpeed():void
	{
		var speedY:Number;
		
		if( !_isBig )
			speedY = Math.random() * MAX_SPPED +  + ( MAX_SPPED >> 1 );
		else
			speedY = Math.random() * MAX_SPPED * 6 + ( MAX_SPPED >> 1 );
		_sy = speedY;
		_sx = ( Math.random() * 1 < 0.6 ) ? Math.random() * ( MAX_SPPED >> 1 ) : Math.random() * ( MAX_SPPED >> 1 ) * -1;
	}
	
	private function setFilter():void
	{
		if( !_isBig )
			_particle.filters = [ new BlurFilter( _size << 1 , _size << 1 ) ];
		else
			_particle.filters = [ new BlurFilter( 32 , 32 ) ];
	}

	private function moveSnow():void
	{
		_particle.addEventListener( Event.ENTER_FRAME , enterFrameHandler );
	}
	
	private function enterFrameHandler( $evt:Event ):void
	{
		_particle.scaleX = _particle.scaleY = Math.random() * 1 + 0.8;
		if ( _particle.scaleX > 1 ) _particle.scaleX = _particle.scaleY = 1;

		_particle.x += _sx;
		_particle.y += _sy;
		
		if ( _particle.y - _basePosition > _stageHeight || _particle.x + _basePosition < 0 || _particle.x - _basePosition > _stageWidth )
		{
			setPosition();
			setSpeed();
			setFilter();
		}
	}
	
	public function get isBig():Boolean { return _isBig; }
}