1_09
http://beautifl.net/book/
♥0 |
Line 81 |
Modified 2011-07-02 16:56:48 |
MIT License
archived:2017-03-20 14:21:26
ActionScript3 source code
/**
* Copyright amashio ( http://wonderfl.net/user/amashio )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/zebE
*/
package{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.ColorTransform;
import flash.geom.Rectangle;
import net.hires.debug.Stats;
[SWF(width=465, height=465,frameRate=30)]
public class Main extends Sprite{
private static const WIDTH:Number = 465;
private static const HEIGHT:Number = 465;
private var _canvas:BitmapData;
//particle配列
private var _particles:Vector.<Particle>;
public function Main(){
//カンバスの用意
_canvas = new BitmapData(WIDTH, HEIGHT, false, 0x000000);
addChild(new Bitmap(_canvas));
_particles = new Vector.<Particle>();
//配置する豆腐の用意
for(var i:int = 0; i < 300; i++){
for(var j:int = 0; j < 300; j++){
_particles.push(new Particle(i+100, j+100));
}
}
addEventListener(Event.ENTER_FRAME, onEnterFrame);
stage.addEventListener(MouseEvent.CLICK, onClick);
addChild(new Stats());
}
//毎フレームのこと
private function onEnterFrame(event:Event):void{
_canvas.lock();
//色の移行を適用
var cr:Rectangle = new Rectangle(0, 0, _canvas.width, _canvas.height);
var ct:ColorTransform = new ColorTransform(0.9, 0.9, 0.9);
_canvas.colorTransform(cr, ct);
//
for each(var p:Particle in _particles){
p.vx *= 0.99;
p.vy *= 0.99;
p.x += p.vx;
//もしparticleが範囲にはいったなら
if(p.falled){
p.vy += 0.05;
}
//加速度をつける
p.y += p.vy;
_canvas.setPixel(p.x, p.y, p.color);
}
_canvas.unlock();
}
private function onClick(event:MouseEvent):void{
var mouseX:Number = stage.mouseX;
var mouseY:Number = stage.mouseY;
for each(var p:Particle in _particles){
var dx:Number = mouseX - p.x;
var dy:Number = mouseY - p.y;
var d:Number = Math.sqrt(dx * dx + dy * dy);
var radian:Number = Math.atan2(dy, dx);
var speed:Number = 300 / (d * d);
p.vx += -Math.cos(radian) * speed;
p.vy += -Math.sin(radian) * speed;
//加速しているなら 消去
if(speed > 1){
p.color = 0xAAAAAA;
p.falled = true;
}else{
//powはval1のval2乗
var c:uint = Math.pow(1 - speed, 4) / 1 * 0xFF;
//ここの&はビット論理演算子
//足し合わせ
if(c < (p.color & 0xFF)){
p.color = (c << 16) | (c << 8) | c;
}
}
}
}
}
}
class Particle{
public var x:Number;
public var y:Number;
public var vx:Number = 0;
public var vy:Number = 0;
public var color:Number = 0xFFFFFF;
public var falled:Boolean = false;;
public function Particle(x:Number, y:Number){
this.x = x;
this.y = y;
}
}