All pastes #734023 Raw Edit

Untitled

public text v1 · immutable
·published 2007-10-12 09:29 UTC
rendered paste body
package {
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.display.MovieClip;
	
	import flash.utils.Timer;
	import flash.events.TimerEvent; 

	public class Main extends MovieClip	{
		public static var stageWidth:int = 800;
		public static var stageHeight:int = 600;
		
		private var flakes:Array;
		private var heaps:Array;
		private var cnt:int = 100;
		var windTimer:Timer;
		
		public function Main() {			
			graphics.beginFill(0);
			graphics.drawRect(0,0,800,600);
			graphics.endFill();
			
			flakes = new Array(cnt);
			for(var iFlake:uint; iFlake<cnt; iFlake++){
			   var snowflake:Snowflake = new Snowflake();
			   flakes[iFlake] = snowflake;
			   flakes[iFlake].reachBottomFunction = flakeReachedBottom;  //************** Here we set that functions
			   flakes[iFlake].collisionTestFunction = testHeapCollision;
			   addChild(snowflake)
			}
			
			//Init timer
			windTimer = new Timer(500,0);
			windTimer.addEventListener(TimerEvent.TIMER, updateWind);
			windTimer.start();
			
			//Heaps
			heaps = new Array(stageWidth/50+1);
			for (var iHeap:uint;iHeap<heaps.length;iHeap++) {
				heaps[iHeap] = new SnowHeap(100);
				heaps[iHeap].y = stageHeight;
				heaps[iHeap].x = iHeap*50;
				addChild(heaps[iHeap]);
			}
			
			//addChild(new StartButton());
			
			graphics.moveTo(0,stageHeight-SnowHeap.maxHeight*SnowHeap.maxScale);
			graphics.lineTo(stageWidth,stageHeight-SnowHeap.maxHeight*SnowHeap.maxScale);
		}			
		
		public function testHeapCollision(X:int,Y:int):int {
			var num:int = X/50;
			if ((num >= heaps.length || num < 0) == false)
			{
				var top:int = stageHeight - heaps[num].height / 2;
				if (Y > top) {
					return 1;
				}
			}
			if (Y>stageHeight) {
				return 1;
			}
			
			return 0;
		}
		
		public function flakeReachedBottom(X:int) {
			var num:int = X/50;
			if ((num >= heaps.length || num < 0) == false)
				heaps[num].doGrow(0.03);
		}
		
		function updateWind(event:TimerEvent):void {
			if (Math.round(Math.random()*3)==1){
				var mod:int = Math.round(Math.random()*4)-2;
				for (var i:uint;i<cnt;i++){
					flakes[i].modWind(mod);
				}
			}
		}

	}
}










package {
	import flash.display.Shape;
	import flash.filters.BlurFilter;
	import flash.filters.GlowFilter;
	import flash.events.Event;

	class Snowflake extends Shape {
		private var lowestDropSpeed:uint = 2;
		private var highestDropSpeed:uint = 4;
		private var dropSpeed:int = Math.round(Math.random() * Math.random() * (highestDropSpeed-lowestDropSpeed))+lowestDropSpeed;
		private var incrementer:int = Math.round(Math.random() * 100);
		private var shades:Array = [ 0xFFFFFF, 0xFFFFFF ];
		private var angles:Array = [ 30, 45, 52, 60, 72 ];
		
		private var windSpeed:int = 0;
		private var minWindSpeed:int = -10;
		private var maxWindSpeed:int = 10;
		private var subAngleMin:int = 20;
		private var subAngleMax:int = 43;
		private var subLenMod:Number = 0.3;
		private var subGrowMod:Number = 1.4;
		public var reachBottomFunction:Function;  //******************** Here are they declared
		public var collisionTestFunction:Function;
		
		public function modWind(mod:int){
			windSpeed += mod;
			if (windSpeed > maxWindSpeed) {
				windSpeed = maxWindSpeed;
			}
			if (windSpeed < minWindSpeed) {
				windSpeed = minWindSpeed;
			}
		}		

		public function Snowflake() {
			var shade:int = 0xFFFFFF; //shades[ Math.ceil(Math.random() * shades.length) ];
			graphics.beginFill(shade);
			graphics.drawCircle(0,0,5);
			graphics.endFill();
			
			var lines:int = Math.round(Math.random()*1)+2;
			var depth:int = Math.round(Math.random()*1)+1;
			var subAngleMod:int = Math.round(Math.random()*(subAngleMax-subAngleMin))+subAngleMin;
			graphics.lineStyle(1,shade);			
			var anglemod:int = angles[Math.round(Math.random()*(angles.length-1))];
			for (var angle:int=0;angle<360;angle+=anglemod)
			{
				graphics.moveTo(0,0);
				addSubLines(0,0,50,angle,lines,depth,subAngleMod);
			}
			
			//filters = [ new BlurFilter(1,dropSpeed/2,1) ];
			filters = [ new GlowFilter(0xCCCCFF,0.8) ];
			addEventListener(Event.ENTER_FRAME,update);
			reset();
		}
		private function reset():void {
			y = Math.random() * Main.stageHeight * -1  -  dropSpeed;
			x = Math.random() * Main.stageWidth - (windSpeed*200);
			scaleX = scaleY = 0.4 + (Math.random() * Math.random() * 0.6);
			rotation = Math.round(Math.random()*180);
		}
		private function update(e:Event):void {
			y += dropSpeed;
			x += windSpeed + Math.sin(incrementer/10) * (1/(dropSpeed/3));
			if ((collisionTestFunction != null && collisionTestFunction(x,y) == 1) || y > Main.stageHeight) {
				if (reachBottomFunction != null) {
					reachBottomFunction(x); //***************************** Used here
				}
				reset();
			} else if (x > Main.stageWidth+width) {
				x = -width;
			} else if (x < -width) {
				x = Main.stageWidth+width;
			}
			incrementer++;
		}
		
		public function getLineEndX(startX:int,len:int,angle:int):int {
			return startX + Math.cos((angle/180)*Math.PI)*len;
		}
		
		public function getLineEndY(startY:int,len:int,angle:int):int {
			return startY + Math.sin((angle/180)*Math.PI)*len;
		}
		
		public function addSubLines(subX:int,subY:int,subLength:int,subAngle:int,subLines:int,leftSubs:int,angleMod:int=30){
			graphics.moveTo(subX,subY);
			var endX:int = getLineEndX(subX,subLength,subAngle);
			var endY:int = getLineEndY(subY,subLength,subAngle);
			graphics.lineTo(endX,endY);
			
			if (leftSubs>0 && subLines > 1) {
				for (var i:int=0;i<subLines;i++){
					var newX:int = subX + ((endX-subX)/(subLines+1))*(i+1);
					var newY:int = subY + ((endY-subY)/(subLines+1))*(i+1);
					
					addSubLines(newX,newY,subLength*subLenMod*(Math.pow(subGrowMod,i)),subAngle+angleMod,subLines/2,leftSubs-1);
					addSubLines(newX,newY,subLength*subLenMod*(Math.pow(subGrowMod,i)),subAngle-angleMod,subLines/2,leftSubs-1);
				}
			}
		}
	}
}