三角形の群れ
♥0 |
Line 114 |
Modified 2010-04-04 01:12:57 |
MIT License
archived:2017-03-20 00:53:55
ActionScript3 source code
/**
* Copyright termat ( http://wonderfl.net/user/termat )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/1VgY
*/
package
{
import flash.display.Graphics;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import flash.events.MouseEvent;
[SWF(width = "480", height = "480", backgroundColor = "0x000000")]
public class Practice49 extends Sprite {
private var tri:Vector.<Triangle>;
private var num:int = 500;
public function Practice49():void {
tri = new Vector.<Triangle>();
for (var i:int = 0; i < num; i++) {
var t:Triangle = new Triangle();
t.x = Math.random() * 480, t.y = Math.random() * 480;
t.vx = Math.random() * 20 - 10, t.vy = Math.random() * 20 - 10;
t.size = 5 + 20 * Math.random();
t.color = getColor(90+180*Math.random(),Math.random());
tri.push(t);
addChild(t);
}
addEventListener(Event.ENTER_FRAME,update);
stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
}
private function onDown(e:MouseEvent):void {
for (var i:int = 0; i < tri.length; i++) {
tri[i].x = Math.random() * 480;
tri[i].y = Math.random() * 480;
}
}
private function update(e:Event):void {
graphics.clear();
for each(var t:Triangle in tri) {
t.update(mouseX, mouseY);
graphics.lineStyle(1,0x111111);
graphics.moveTo(mouseX,mouseY);
graphics.lineTo(t.x,t.y);
}
}
private function getColor(i:int, saturation:Number):uint {
var value:Number = 1.0;
var h:Number = i / 60;
var ii:Number = Math.floor(h);
var ff:Number = h - ii;
var p1:Number = value * (1.0 - saturation);
var p2:Number = value * (1.0 - saturation * ff);
var p3:Number = value * (1.0 - saturation * (1.0 - ff));
var rv:Number;
var gv:Number;
var bv:Number;
switch(ii) {
case 0:
rv = value, gv = p3, bv = p1;
break;
case 1:
rv = p2, gv = value, bv = p1;
break;
case 2:
rv = p1, gv = value, bv = p3;
break;
case 3:
rv = p1, gv = p2, bv = value;
break;
case 4:
rv = p3, gv = p1, bv = value;
break;
default:
rv = value, gv = p1, bv = p2;
}
var rr:int = Math.max(0, Math.min(255, rv * 255));
var gg:int = Math.max(0, Math.min(255, gv * 255));
var bb:int = Math.max(0, Math.min(255, bv * 255));
var color:uint = (rr << 16) + (gg << 8) + bb;
return color;
}
}
}
import flash.display.Graphics;
import flash.display.MovieClip;
import flash.geom.Point;
class Triangle extends MovieClip {
public var pos:Array = [new Point(0, 1), new Point( -0.3, 0), new Point(0.3, 0)];
public var vx:Number=0.0;
public var vy:Number=0.0;
public var dir:Number = 0.0;
public var size:Number = 10;
public var color:uint = 0x000000;
public function update(mx:Number, my:Number):void {
this.alpha = 0.4;
graphics.clear();
graphics.beginFill(color);
var ap:Number = -Math.PI / 2;
for (var i:int = 0; i < pos.length; i++) {
var xx:Number = pos[i].x * size * Math.cos(dir+ap) - pos[i].y * size * Math.sin(dir+ap);
var yy:Number = pos[i].x * size * Math.sin(dir+ap) + pos[i].y * size * Math.cos(dir+ap);
if (i == 0) {
graphics.moveTo(xx, yy);
}else {
graphics.lineTo(xx, yy);
}
}
graphics.endFill();
x += vx, y += vy;
var dx:Number = mx - x;
var dy:Number = my - y;
dir = Math.atan2(dy, dx);
vx += Math.cos(dir) / (size*0.5);
vy += Math.sin(dir) / (size*0.5);
vx = Math.max( -3, Math.min(3, vx));
vy = Math.max( -3, Math.min(3, vy));
}
}