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

砂で遊ぶ

マウスで自由に壁をつくります.
Shift + drag で消しゴムになります.
右クリックの 初期化 で初めの状態にもどります.
下に落ちたら上からまたふってきます.
砂の挙動は砂のような液体のような何か.

元ネタは名前を忘れてしまいましたが昔遊んだアプリからです.
Get Adobe Flash player
by takion 10 Mar 2009
/*
	マウスで自由に壁をつくります.
	Shift + drag で消しゴムになります.
	右クリックの 初期化 で初めの状態にもどります.
	下に落ちたら上からまたふってきます.
	砂の挙動は砂のような液体のような何か.

	元ネタは名前を忘れてしまいましたが昔遊んだアプリからです.
*/

package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.ContextMenuEvent;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Rectangle;
	import flash.ui.ContextMenu;
	import flash.ui.ContextMenuItem;
	
	[SWF(width=465, height=465, backgroundColor=0x000000, frameRate=60)]  
	public class SimSand extends Sprite
	{
		private var numSand:int;
		private var sand:Array;
		
		private var lineBmp:BitmapData;
		private var sandBmp:BitmapData;
		private var screenBmp:BitmapData;
		
		private var lineSprite:Sprite;
		private var printSprite:Sprite;
		private var screenSprite:Sprite;
		
		private var canvasWidth:int;
		private var canvasHeight:int;
		
		private var context:ContextMenu;
		private var menuInit:ContextMenuItem;
		
		public function SimSand()
		{
			canvasWidth = stage.stageWidth / 3;
			canvasHeight = stage.stageHeight / 3;
			context = new ContextMenu();
			menuInit = new ContextMenuItem( "初期化", false );			
			contextMenu = context;
			context.customItems.push( menuInit );
			
			numSand = 1500;
			init( null );
			
			menuInit.addEventListener( ContextMenuEvent.MENU_ITEM_SELECT, init );
			stage.addEventListener( Event.ENTER_FRAME, loop );
			stage.addEventListener( MouseEvent.MOUSE_DOWN, startDrawCanvas );	
		}
		
		private function init( e:ContextMenuEvent ):void
		{
			//set on and off EventListeners
			stage.removeEventListener( MouseEvent.MOUSE_UP, stopDrawCanvas );
			stage.removeEventListener( MouseEvent.MOUSE_MOVE, drawCanvas );
			
			if( stage.hasEventListener( MouseEvent.MOUSE_DOWN ) == false )
			{
				stage.addEventListener( MouseEvent.MOUSE_DOWN, startDrawCanvas );
			}
			
			// create sand
			sand = new Array();			
			for( var i:int = 0; i < numSand; i++ )
			{
				var ramX:int = Math.random() * canvasWidth / 4 + canvasWidth / 4 * 1.5;
				var ramY:int = Math.random() * canvasHeight / 2 - canvasHeight / 2;
				sand.push( new Sand( ramX, ramY, 0xFFFFFF00 ) );
			}			
			
			lineSprite = new Sprite();
			printSprite = new Sprite();
			screenSprite = new Sprite();
			
			//make standard stage
			lineSprite.graphics.lineStyle( 3 , 0x0000FF , 1.0 );  	
			lineSprite.graphics.moveTo( 0, 20 );
			lineSprite.graphics.lineTo( canvasWidth / 2 - 2, 50);
			lineSprite.graphics.moveTo( canvasWidth, 20 );
			lineSprite.graphics.lineTo( canvasWidth / 2 + 2, 50 );
			lineSprite.graphics.moveTo( canvasWidth / 5 * 2, 100 );
			lineSprite.graphics.lineTo( canvasWidth / 5 * 3, 100 );
			
			//sandglass extra stage
			/*
			lineSprite.graphics.lineStyle( 3 , 0x0000FF , 1.0 );  			
			for( i = -1; i <= 1; i+=2 )
			{
				lineSprite.graphics.moveTo( -10 * 3 + canvasWidth / 2, i * 0.5 * 100 + 80 );
				for( var j:int = -10; j <= 10; j+=1 )
				{
					lineSprite.graphics.lineTo( j * 3 + canvasWidth / 2, i * 0.5 * j * j + 80 );
				}
				if( i > 0 ) lineSprite.graphics.lineTo( -10 * 3 + canvasWidth / 2, i * 0.5 * 100 + 80 );
			}
			lineSprite.graphics.lineStyle( 2 , 0x000000 , 1.0 );  
			lineSprite.graphics.moveTo( canvasWidth / 2, 79 );
			lineSprite.graphics.lineTo( canvasWidth / 2, 81 );
			*/
			
			lineBmp	= new BitmapData( canvasWidth, canvasHeight, true, 0x0 );
			screenBmp	= new BitmapData( canvasWidth, canvasHeight, true, 0x0 );
			sandBmp		= new BitmapData( canvasWidth, canvasHeight, true, 0x0 );
			
			printSprite.addChild( new Bitmap(lineBmp) );
			screenSprite.addChild( printSprite );
			screenSprite.addChild( lineSprite );
			screenSprite.addChild( new Bitmap( sandBmp ) );
			screenSprite.scaleX = stage.stageWidth / canvasWidth;
			screenSprite.scaleY = stage.stageHeight / canvasHeight;
			addChild(screenSprite);	
		}
		
		private function loop( e:Event ):void
		{
			
			screenSprite.graphics.clear();
			screenSprite.graphics.beginFill(0x0);
            screenSprite.graphics.drawRect(0, 0, canvasWidth, canvasHeight);
            screenSprite.graphics.endFill();		
			
			screenBmp.draw( screenSprite );
			sandBmp.lock();
			sandBmp.fillRect( new Rectangle(0,0,canvasWidth, canvasHeight), 0x00000000);
			for( var i:int = 0; i < numSand; i++ )
			{
				//falling noise
				var noise:int = 0;
				var neighbor:uint = 0;
				for( var j:int = -1; j <= 1; j++ )
				{
					neighbor += screenBmp.getPixel( sand[i].x + j, sand[i].y + 1 );
				}
				
				if( neighbor == 0x0 )
				{
					noise = 0;
				}
				else
				{
					noise = int( Math.random() * 3 - 1.5 );
					if( sand[i].x + noise < 0 || sand[i].x + noise>= canvasWidth )
					{
						noise = 0;
					}
				}
				
				//on falling down
				if( screenBmp.getPixel( sand[i].x + noise, sand[i].y + 1 ) == 0x000000 )
				{
					sand[i].x += noise;
					sand[i].y += 1;
				}
				
				//staying on wall
				else 
				{
					var deltaX:int = int( Math.random() * 3 - 1.5 );
					var deltaY:int = 0;//int( Math.random() * 2 );
					
					if( sand[i].x + deltaX > 0 && sand[i].x + deltaX < canvasWidth )
					{
						if( screenBmp.getPixel( sand[i].x + deltaX, sand[i].y + deltaY ) == 0x000000 )
						{
							sand[i].x += deltaX;
							sand[i].y += deltaY;
						}
					}
				}
				
				if( sand[i].y > canvasHeight ) sand[i].y = 0;
				sandBmp.setPixel32( sand[i].x, sand[i].y, sand[i].color );
			}
			sandBmp.unlock();
		}
		
		private function startDrawCanvas( e:MouseEvent ):void
		{
			if( e.shiftKey == false )
			{
				lineSprite.graphics.lineStyle( 3 , 0x0000FF );  // make-wall mode
			}
			else
			{
				lineSprite.graphics.lineStyle( 5, 0x000000 ); // eraser mode
			}
			lineSprite.graphics.moveTo( stage.mouseX / screenSprite.scaleX, stage.mouseY / screenSprite.scaleY );
			stage.removeEventListener( MouseEvent.MOUSE_DOWN, startDrawCanvas );
			stage.addEventListener( MouseEvent.MOUSE_MOVE, drawCanvas );
			stage.addEventListener( MouseEvent.MOUSE_UP, stopDrawCanvas );
		}
		
		private function stopDrawCanvas( e:MouseEvent ):void
		{
			lineBmp.draw( lineSprite );
			lineSprite.graphics.clear();
			printSprite.graphics.clear();
			stage.removeEventListener( MouseEvent.MOUSE_MOVE, drawCanvas );
			stage.removeEventListener( MouseEvent.MOUSE_UP, stopDrawCanvas );
			stage.addEventListener( MouseEvent.MOUSE_DOWN, startDrawCanvas );
		}
		
		private function drawCanvas( e:MouseEvent ):void
		{
			lineSprite.graphics.lineTo( stage.mouseX / screenSprite.scaleX, stage.mouseY / screenSprite.scaleY)
		}
	}
}

import flash.geom.Point;
class Sand
{
	public var x:int;
	public var y:int;
	public var color:uint;
	
	public function Sand( px:int, py:int, pcolor:uint )
	{
		x = px;
		y = py;
		color = pcolor;	
	}
}