物理演習 1(未完成)

by Ryogo_Quberey
♥0 | Line 88 | Modified 2011-01-06 18:05:01 | MIT License
play

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;
    }
  }
  }