forked from: forked from: forked from: forked from: bouncing balls in 3d space(3)
forked from 2D紙ふぶき forked from: bouncing balls in 3d space(3) (diff: 1)
ActionScript3 source code
/**
* Copyright harupiyo ( http://wonderfl.net/user/harupiyo )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/b13A
*/
// forked from harupiyo's forked from: forked from: forked from: bouncing balls in 3d space(3)
// forked from harupiyo's forked from: forked from: bouncing balls in 3d space(3)
// forked from uwi's forked from: bouncing balls in 3d space(3)
// forked from k__'s bouncing balls in 3d space(3)
// forked from k__'s bouncing balls in 3d space
// 紙ふぶきっぽくしてみるw
package {
import flash.utils.IDataInput;
import flash.accessibility.Accessibility;
import flash.display.*;
import flash.events.*;
import flash.filters.*;
import flash.geom.*;
import net.hires.debug.Stats;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
[SWF(frameRate=60)]
public class Main extends Sprite {
private var cx:Number, cy:Number; // center-x, y
private var particles:Array = [];
private var canvas:BitmapData;
private var images : Array = [];
private var colors : Array = [
0x00FF9300,
0x006DE20E,
0x00B011FD,
0x00F50107,
0x000992F7
];
private function _getRandomColor():int {
return colors[ int(Math.random() * colors.length ) ];
}
public function Main() {
var bg : Sprite = new Sprite();
addChild(bg);
bg.graphics.beginFill( 0x00000000 );
bg.graphics.drawRect(0,0,stage.stageWidth, stage.stageHeight);
bg.graphics.endFill();
canvas = new BitmapData(stage.stageWidth,stage.stageHeight,false, 0x00000000 );
addChild( new Bitmap(canvas) );
cx = stage.stageWidth / 2;
cy = stage.stageWidth / 2;
// 素材準備
var s:Sprite = new Sprite();
var ss:Sprite = new Sprite();
s.addChild(ss);
ss.graphics.beginGradientFill(GradientType.RADIAL,[0xffffff,0xff0000],[0.5,0.1],[50,255]);
ss.graphics.drawCircle(40,40,100);
ss.graphics.endFill();
ss.x = ss.y = 40;
var bd:BitmapData;
var blur:BlurFilter;
for (var i:uint = 1; i < 100; i ++) {
ss.scaleX = i / 7 / 15;
ss.scaleY = i / 7 / 15;
if (i > 20) {
blur = new BlurFilter((i - 20) /4,(i -20) / 4);
ss.filters = [blur];
}
bd = new BitmapData(80,80,true,0x00000000 );
bd.draw(s);
images.push(bd);
}
particles.push( new Particle2D() );
addEventListener( Event.ENTER_FRAME, h_enterFrame );
addChild(new Stats());
createView();
}
private function h_enterFrame(evt:Event):void {
if (Math.random() < 0.5) {
particles.push( new Particle2D() );
particles.push( new Particle2D() ); // twice
}
draw();
}
private var bmd:BitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,true,0x000000);
private var cmf : ColorMatrixFilter = new ColorMatrixFilter([
0.95, 0, 0, 0, 0,
0, 0.95, 0, 0, 0,
0, 0, 0.8, 0, 0,
0, 0, 0, 0.95, 0
]);
private function draw():void {
var i:int,j:uint;
var tParticles:Array = [];
var p3d:Object;
var p2d:Object;
var ppp : Point = new Point();
bmd.fillRect( bmd.rect, 0xFF000000 );
var tz:uint = 0;
for (i = particles.length - 1; i >= 0; i --) {
particles[i].update();
if (particles[i].life == 0) {
if(i == particles.length - 1){
particles.pop();
}else{
particles[i] = particles.pop();
}
}else{
tParticles.push({
color : particles[i].color,
x : particles[i].x,
y : particles[i].y
});
}
}
for each(p2d in tParticles){
bmd.fillRect( new Rectangle( p2d.x, p2d.y, 5, 5 ), p2d.color );
}
canvas.lock();
canvas.draw(bmd,null , null, BlendMode.NORMAL );
canvas.unlock();
}
//なるほど、こうやってtrace の文字を出力しているのか
private function createView():void {
var t:TextField = new TextField();
t.autoSize = TextFieldAutoSize.LEFT;
t.textColor = 0xFFFFFFFF;
addChild(t);
trace = function(s:String):void { t.appendText(s + "\n"); };
}
private var trace:Function;
}
}
class Particle2D {
import flash.display.*;
public var x:Number=0,y:Number=0;
public var vx:Number=0,vy:Number=0;
private var SCREEN_X_MAX:int = 550;
private var SCREEN_Y_MAX:int = 450;
public var life:int;
public var color:uint;
public var originalColor:uint;
public var isReverse:Boolean;
private var colors : Array = [
0xFFFF9300,
0xFF6DE20E,
0xFFB011FD,
0xFFF50107,
0xFF0992F7
];
private function _getRandomColor():uint {
return colors[ int(Math.random() * colors.length ) ];
}
function Particle2D() {
x = Math.random() * SCREEN_X_MAX;
y = 0;
vy = Math.random()*4 + 1; // 落下速度
life = 1;
color = originalColor = _getRandomColor();
isReverse = false;
}
public function update():void {
// ゆらゆらゆれながら落下
vx = Math.random()*5-2.5; // 左右にランダム移動
if ( y >= SCREEN_Y_MAX ) {
life=0;
}
if ( x <= 0 && SCREEN_X_MAX < x ) {
life=0;
}
// たまに裏返る
if( Math.random() > 0.9 ){
_reverse();
}
x+=vx;
y+=vy;
}
private function _reverse():void {
if( isReverse ) {
isReverse = false;
color = originalColor;
}
else{
isReverse = true;
color = 0xFFFFFFFF; // 色紙なので裏面は白
}
}
}
