物理演習 1(未完成)
♥0 |
Line 88 |
Modified 2011-01-06 18:05:01 |
MIT License
archived:2017-03-20 01:01:32
ActionScript3 source code
/**
* Copyright Ryogo_Quberey ( http://wonderfl.net/user/Ryogo_Quberey )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/hvpf
*/
package {
import flash.display.MovieClip;
import flash.geom.Point;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.filters.GlowFilter;
import FMPhysics.PhysicalPoint;
public class FuwaFuwa extends MovieClip{
var ppt:Array;
var loc:Array;
var akarusa:Number = 0;
var timer:Timer;
function FuwaFuwa(){
ppt = new Array();
loc = new Array();
const interval:Number = 20;
const yokoNum:Number = 20;
const tateNum:Number = 20;
for(var i:Number = 0; i < tateNum; ++i){
for(var j:Number = 0; j < yokoNum; ++j){
var yokoLoc:Number = this.stage.stageWidth/2-(yokoNum-1)/2*interval+j*interval;
var tateLoc:Number = this.stage.stageHeight/2-(tateNum-1)/2*interval+i*interval;
ppt.push(new PhysicalPoint(yokoLoc, tateLoc));
loc.push(new Point(yokoLoc, tateLoc));
}
}
var glow:GlowFilter = new GlowFilter(0xFFFFAA, 1, 10, 10);
this.filters = [glow];
timer = new Timer(33);
timer.addEventListener(TimerEvent.TIMER, loop);
timer.start();
}
function loop(event:TimerEvent):void{
for(var i:Number = 0; i < ppt.length; ++i){
ppt[i].setKasokudo((loc[i].x-ppt[i].x)*10, (loc[i].y-ppt[i].y)*10);
var maxDist:Number = 50;
var dist:Number = Point.distance(new Point(this.mouseX, this.mouseY), ppt[i]);
if(dist < maxDist){
var par = (maxDist-dist)/maxDist;
ppt[i].setKasokudo((ppt[i].x - this.mouseX)*par*80, (ppt[i].y - this.mouseY)*par*80);
}
}
this.graphics.clear();
for(i = 0; i < ppt.length; ++i){
this.graphics.moveTo(ppt[i].x, ppt[i].y);
this.graphics.beginFill(0xFFFFAA, akarusa);
this.graphics.lineStyle(1, 0xFFFFAA, akarusa);
this.graphics.drawCircle(ppt[i].x, ppt[i].y, 6);
this.graphics.endFill();
}
akarusa += (1 - akarusa)/300;
}
}
internal class PhysicalPoint extends Point{
public var vx:Number, vy:Number;
private var ax:Number, ay:Number;
public var b:Number;
public var sakkiTime:Number;
public var timer:Timer;
function PhysicalPoint(xx: Number=0, yy: Number=0){
x = xx; y = yy;
b = 0.9;
vx = 0; vy = 0;
ax = 0; ay = 0;
sakkiTime = new Date().getTime();
timer = new Timer(33);
timer.addEventListener(TimerEvent.TIMER, loop);
timer.start();
}
function loop(event:TimerEvent):void{
var nowTime:Number = new Date().getTime();
var t:Number = (nowTime - sakkiTime)/1000;
x += vx*t + 0.5*ax*t*t;
y += vy*t + 0.5*ay*t*t;
vx += ax*t;
vy += ay*t;
vx *= b;
vy *= b;
ax = 0;
ay = 0;
sakkiTime = nowTime;
}
public function setKasokudo(aax:Number=0, aay:Number=0):void{
ax += aax;
ay += aay;
}
}
}