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: パーティクル崩し

パーティクル崩しのJavaScriptポートをActionScriptに逆ポートしてみた
/**
 * Copyright os0x ( http://wonderfl.net/user/os0x )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/xx53
 */

// forked from coppieee's パーティクル崩し
// パーティクル崩しのJavaScriptポートをActionScriptに逆ポートしてみた
package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;
	import flash.geom.Rectangle;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import net.hires.debug.Stats;
	import flash.utils.ByteArray;
	
	[SWF(width = "465", height = "465", frameRate = "30", backgroundColor="0x000000")]
	public class BlockBreaker extends Sprite	{
		private static const HEIGHT:Number = 465;
		private static const WIDTH:Number = 465;
		private var _canvas:BitmapData;
		private var _blocks:Blocks;
		private var _fallBlocks:Vector.<Particle>;
		private var _balls:Vector.<Particle>;
		private var _bar:Bitmap;
		private var bounds:Rectangle;
		private var pixels:ByteArray;
				
		public function BlockBreaker(){
			_canvas = new BitmapData(WIDTH, HEIGHT,true,0xff000000);
			addChild(new Bitmap(_canvas));
			
			bounds = new Rectangle(0, 0, _canvas.width, _canvas.height);
			pixels = _canvas.getPixels(bounds);
			
			_blocks = new Blocks(WIDTH, 100);
			
			for each(var block:Particle in _blocks.values){
				if (block) {
					setPixel(block.x, block.y, block.color, 255);
				}
			}

			_fallBlocks = new Vector.<Particle>();
			
			var b:BitmapData = new BitmapData(50, 10, false, 0x00FF00);
			addChild(_bar = new Bitmap(b));
			_bar.y = WIDTH - b.width;
			var _ball:Particle = new Particle(WIDTH / 2, HEIGHT / 2);
			_ball.vx = Math.random() * 10;
			_ball.vy = -Math.random() * 9 - 1;
			_ball.color = 0xFFFFFF;
			
			_balls = new Vector.<Particle>();
			_balls.push(_ball);
						
			//var stats:Stats = new Stats();
			//stats.y = 200;
			//addChild(stats);
			
			addEventListener(Event.ENTER_FRAME, update);
		}
		
		private function setPixel(x:int,y:int,color:uint, alpha:int):void{
			if (x >= 0 && x < WIDTH && y >= 0 && y < HEIGHT) {
				var idx:int = (x + y * WIDTH)*4;
				pixels[idx+1] = (color >> 16 ) & 0xFF;
				pixels[idx+2] = (color >> 8) & 0xFF;
				pixels[idx+3] = (color >> 0) & 0xFF;
				pixels[idx+0] = alpha || 240;
			}
		}
		
		private function tail():void{
			for (var i:int = 0, l:int = pixels.length;i < l;i+=4){
				if(pixels[i] > 0 && pixels[i] < 250) {
					if (pixels[i] < 30) {
						pixels[i] = 0;
					} else {
						pixels[i] *= 0.9;
					}
				}
			}
		}
		private function update(e:Event):void	{
			var l:int = _balls.length;
			while(l--){
				var ball:Particle = _balls[l];
				var bvx:Number = ball.vx;
				var bvy:Number = ball.vy;
				var bspeed:Number = Math.sqrt(bvx * bvx + bvy * bvy);
				var bradius:Number = Math.atan2(bvy, bvx);
				for (var i:int = 0; i < bspeed;i++){
					ball.x += ball.vx/bspeed;
					ball.y += ball.vy/bspeed;
					var hitParticle:Particle = _blocks.getParticle(ball.x, ball.y);
					if(hitParticle){
						var removedP:Particle = _blocks.removeParticle(ball.x, ball.y);
						removedP.vx = Math.cos(bradius+Math.PI*2/(30*Math.random())-15)*3;
						removedP.vy = 1;
						removedP.color = hitParticle.color;
						_fallBlocks.push(removedP);
						ball.vy = -ball.vy;
					}
					
					if ((ball.x < 0 && ball.vx < 0) || (ball.x > WIDTH && ball.vx > 0))					{
						ball.vx = -ball.vx;
					}
					if (ball.y < 0 && ball.vy < 0){
						ball.vy = -ball.vy;
					}
					if (ball.y > HEIGHT)	{
						_balls.splice(l,1);
						break;
					}
					if (_bar.hitTestPoint(ball.x, ball.y)){
						ball.vy = -Math.abs(ball.vy);
					}
					setPixel(ball.x, ball.y, ball.color, 0);
				}
			}

			var n:uint = _fallBlocks.length;
			while(n--){
				var fallP:Particle = _fallBlocks[n];
				fallP.vy += 0.1;
				fallP.x += fallP.vx;
				fallP.y += fallP.vy;
				setPixel(fallP.x, fallP.y, fallP.color, 0);
				if (_bar.hitTestPoint(fallP.x,fallP.y)){
					var newball:Particle = new Particle(fallP.x,fallP.y);
					newball.vx = Math.random() * 10;
					newball.vy = Math.random() * 9 + 1;
					newball.color = fallP.color;
					_balls.push(newball);
					_fallBlocks.splice(n,1);
				} else if (fallP.y > HEIGHT) {
					_fallBlocks.splice(n,1);
				}
			}
			
			tail();
			pixels.position = 0;
			_canvas.setPixels(bounds, pixels);
			_bar.x = stage.mouseX;
			
			if (_blocks.count == 0){
				removeEventListener(Event.ENTER_FRAME, update);
				var clearTF:TextField = new TextField();
				clearTF.text = "CLEAR!\nおめでと";
				clearTF.textColor = 0xFFFFFF;
				clearTF.autoSize = TextFieldAutoSize.LEFT;
				_canvas.draw(clearTF,new Matrix(5,0,0,5,WIDTH/2-clearTF.width*5/2,HEIGHT/2-clearTF.height*5/2));
			}
			
		}
	}
}
import frocessing.color.ColorHSV;
class Blocks
{
	public function get count():int { return _count;}
	private var _count:int;
	public function get width():Number { return _width; }
	private var _width:Number;
	public function get height():Number { return _height; }
	private var _height:Number;
	public var values:Vector.<Particle>;
	function Blocks(width:Number,height:Number){
		_width = width;
		_height = height;
		_count = width * height;
		values = new Vector.<Particle>(width * height, false);
		var c:ColorHSV = new ColorHSV();
		for (var i:int = 0; i < _width; i++){
			c.h = 360 * i / _width;
			for (var j:int = 0 ; j < _height; j++ ){
				var p:Particle = new Particle(i, j);
				p.color = c.value;
				values[i + j * _width] = p;
			}
		}
	}
	public function getParticle(x:int, y:int):Particle{
		var index:int = x + y * _width;
		if (index >= values.length || index < 0){
			return null;
		}
		return values[x + y * _width];
	}
	public function removeParticle(x:int, y:int):Particle{
		var p:Particle = values[x + y * _width];
		if (p){
			_count--;
			values[x + y * _width] = undefined;
		}
		return p;
	}
}
class Particle{
	public var x:Number;
	public var y:Number;
	public var vx:Number = 0;
	public var vy:Number = 0;
	public var color:uint;
	public function Particle(x:Number=0,y:Number=0 ){
		this.x = x;
		this.y = y;
	}
}