※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


forked from : k0rin's Yawaraka Balls [diff(345)]

FORKED

方向一定しつつ衝突判定 forked from: Yawaraka Balls forked from: 方向一定しつつ衝突判定 forked from: Yawaraka Balls [diff(1)]

  1. // forked from HaraMakoto's 方向一定しつつ衝突判定 forked from: Yawaraka Balls
  2. package
  3. {
  4.     import flash.display.Sprite;
  5.     import flash.events.Event;
  6.     import flash.events.TimerEvent;
  7.     import flash.utils.Timer;
  8.     
  9.     import net.hires.debug.Stats;
  10.     
  11.     [SWF(width="465", height="465", backgroundColor="#000000", frameRate=60)]
  12.     public class HitTest3 extends Sprite
  13.     {
  14.         private var elemList:Array = new Array();
  15.         private var elemNum:int = 20;
  16.         private var colManager:EasyColosionManager = new EasyColosionManager();
  17.         private var RoadList:Array = new Array();
  18.         
  19.         public function HitTest3()
  20.         {
  21.             super();
  22.             addChild(new Stats());
  23.             init();
  24.             addEventListener(Event.ENTER_FRAME, handleEnterFrame);
  25.         }
  26.         
  27.         private function init():void {
  28.             //道路一覧
  29.             RoadList = [
  30.                 new RoadUnit(80,445,"y",-1),new RoadUnit(140,20,"y",1),
  31.                 new RoadUnit(200,445,"y",-1),new RoadUnit(240,20,"y",1),
  32.                 new RoadUnit(340,445,"y",-1),new RoadUnit(400,20,"y",1),
  33.                 new RoadUnit(445,90,"x",-1),new RoadUnit(20,140,"x",1),
  34.                 new RoadUnit(445,180,"x",-1),new RoadUnit(20,210,"x",1),
  35.                 new RoadUnit(445,280,"x",-1),new RoadUnit(20,340,"x",1)
  36.             ]
  37.             var i:int;
  38.             for(i=0; i<elemNum; i++) {
  39.                 var elem:Elemet = new Elemet();
  40.                 addChild(elem);
  41.                 colManager.addElement(elem); //衝突マネージャ
  42.                 elemList.push(elem);
  43.                 var ru:RoadUnit = RoadList[int(RoadList.length*Math.random())];
  44.                 elem.px = ru.x;
  45.                 elem.py = ru.y;
  46.                 if(ru.vecType=="x") {
  47.                     if(ru.posinega==1) {
  48.                         elem.px += 100*Math.random();
  49.                     } else {
  50.                         elem.px -= 100*Math.random();
  51.                     }
  52.                 } else {
  53.                     elem.py += 100*Math.random();                    
  54.                 }
  55.                 elem.init((ru.vecType=="x"),(ru.vecType=="y"),0.01*ru.posinega, 0.01*ru.posinega,ru.x, ru.y);
  56.             }
  57. //            var too:TooSenBoo = new TooSenBoo();
  58. //            addChild(too);
  59. //            colManager.addElement(too);
  60. //            elemList.push(too);
  61. //            elemNum++;
  62.             
  63.             this.graphics.clear();
  64.             for(i=0; i<RoadList.length; i++) {
  65.                 var rr:RoadUnit = RoadList[i];
  66.                 this.graphics.lineStyle(1,0x333333);
  67.                 this.graphics.moveTo(rr.x,rr.y);
  68.                 var goalNum:Number = 465;
  69.                 if(rr.posinega==-1) goalNum = 0;
  70.                 if(rr.vecType=="x") {
  71.                     this.graphics.lineTo(goalNum, rr.y);
  72.                 } else {
  73.                     this.graphics.lineTo(rr.x, goalNum);                    
  74.                 }
  75.             }
  76.         }
  77.         
  78.         
  79.         private function handleEnterFrame(event:Event):void {
  80.             for (var t:int = 0; t < 4; t++) {
  81.                 var i:int;
  82.                 for(i=0; i<elemNum; i++) {
  83.                     elemList[i].update();
  84.                 }
  85.                 colManager.checkColision();
  86.             }
  87.             for(i=0; i<elemNum; i++) {
  88.                 elemList[i].render();
  89.             }
  90.         }
  91.         
  92.     }
  93. }
  94.     import flash.events.EventDispatcher;
  95.     import flash.display.Sprite;
  96.     import flash.utils.Timer;
  97.     import flash.events.TimerEvent;
  98.     import flash.geom.Point;
  99.     import caurina.transitions.Tweener;
  100.     import caurina.transitions.Equations;
  101.     
  102. class EasyColosionManager extends EventDispatcher {
  103.     private var elemList:Array = new Array();
  104.     private var elemlen:int = 0;
  105.     private var spring:Number = 0.2;
  106.     private var bounce:Number = -0.5;
  107.     private var gravity:Number = 0.1;
  108.     public function EasyColosionManager() {
  109.         
  110.     }
  111.     
  112.     public function addElement(elem:Elemet):void {
  113.         elemList.push(elem);
  114.         elemlen = elemList.length;
  115.     }
  116.     
  117.     public function checkColision():void {
  118.         var i:int;
  119.         for(i=0; i<elemlen-1; i++) {
  120.             var elem0:Elemet = elemList[i];
  121.             for(var j:int=i+1; j<elemlen; j++) {
  122.                 var elem1:Elemet = elemList[j];
  123.                 elem0.hitTest(elem1);
  124.             }
  125.         }
  126.         
  127.     }
  128.     
  129.     //2者間の距離を返す
  130.     private function culcDistBetElems(mc1:Sprite, mc2:Sprite):Number {
  131.         var pt1:Point = new Point(mc1.x, mc2.x);
  132.         var pt2:Point = new Point(mc2.x, mc2.y);
  133.         var dist:Number = Point.distance(pt1, pt2);
  134.         return dist;
  135.     }
  136.     
  137. }
  138. class Elemet extends Sprite {
  139.     public var px:Number = 0;
  140.     public var py:Number = 0;
  141.     public var vx:Number = 0;
  142.     public var vy:Number = 0;
  143.     public var maxX:Number = 465;
  144.     public var maxY:Number = 465;
  145.     public var started:Boolean = false;
  146.     public var radious:Number = 10;
  147.     private var spring:Number = 0.1;
  148.     private var bounce:Number = -0.5;
  149.     
  150.     private var cx:Number = 0;
  151.     private var cy:Number = 0;
  152.     private var priority:int = 0;
  153.     
  154.     private var isXAddition:Boolean = false;
  155.     private var isYAddition:Boolean = true;
  156.     private var additionalVx:Number = 0.1;
  157.     private var additionalVy:Number = 0.01;
  158.     private var fixX:Number = 200;
  159.     private var fixY:Number = 200;
  160.     
  161.     private var startPt:Point = new Point(0,0);
  162.     private var startVx:Number, startVy:Number;
  163.     
  164.     private var timer:Timer = new Timer(1000);
  165.     public function Elemet() {
  166.         radious = 16 * Math.random();
  167.         makeBody();
  168.     }
  169.     
  170.     private function makeBody():void {
  171.         this.graphics.beginFill(0xFFFFFF*Math.random());
  172.         this.graphics.drawCircle(0,0,radious);
  173.         this.graphics.endFill();
  174.     }
  175.     
  176.     public function attacked():void {
  177.         Tweener.addTween(this, {alpha:0, time:0.2, transition:Equations.easeOutInBounce});
  178.         Tweener.addTween(this, {alpha:1, time:0.2, delay:0.2, transition:Equations.easeOutInBounce});
  179.     }
  180.     
  181.     public function contact(contactX:Number, contactY:Number, _priority:int, force:Number):void {
  182.         var tx:Number = contactX - px;
  183.         var ty:Number = contactY - py;
  184.         
  185.         var angle:Number = Math.atan2(ty, tx);
  186.         var length:Number = Math.sqrt(tx*tx+ty*ty);
  187.         
  188.         vx -= (1-length/radious)*0.5*Math.cos(angle);
  189.         vy -= (1-length/radious)*0.5*Math.sin(angle);
  190.         
  191.         if(this.priority < _priority) {
  192.             this.priority = _priority;
  193.             cx = tx;
  194.             cy = ty;
  195.         }
  196.     }
  197.     public function hitTest(elm:Elemet):void {
  198.         var dx:Number = elm.px - px;
  199.         var dy:Number = elm.py - py;
  200.         var distanceSquared:Number = dx*dx+dy*dy;
  201.         var contactDistance:Number = radious + elm.radious;
  202.         if(distanceSquared < contactDistance*contactDistance) {
  203.             var tx:Number = linearTransform(radious, 0, contactDistance, px, elm.px);
  204.             var ty:Number = linearTransform(radious, 0, contactDistance, py, elm.py);
  205.             contact(tx, ty, 20.5);
  206.             elm.contact(tx, ty, 20.5);
  207.         }
  208.     }
  209.     private function linearTransform(n:Number, s0:Number, s1:Number, d0:Number, d1:Number):Number {
  210.         return ( d0+(n-s0)*(d1-d0) / (s1-s0) );
  211.     }
  212.     
  213.     
  214.     public function update():void {
  215.         cx = 0;
  216.         cy = 0;
  217.         priority = 0;
  218.     
  219.         px += vx;
  220.         py += vy;
  221.         
  222.         if(px-radious<0) {
  223.             setStartPosition();
  224.         }
  225.         if(px+radious>465) {
  226.             setStartPosition();
  227.         }
  228.         if(py-radious<0) {
  229.             setStartPosition();
  230.         }
  231.         
  232.         //端までいったら戻る
  233.         if(isContactWall())
  234.             setStartPosition();
  235.             
  236.         mainAdditionalVec();
  237.         vy *= 0.9796;
  238.         vx *= 0.9796;
  239.     }
  240.     public function init(xAnable:Boolean=true, yAnable:Boolean=false, _vx:Number=0.001, _vy:Number=0.001, _x:Number=200, _y:Number=200):void {
  241.         startPt.x = _x; startPt.y = _y;
  242.         startVx = _vx; startVy = _vy;
  243.         changeAction(xAnable,yAnable,_vx,_vy,_x,_y);
  244.     }
  245.     private function setStartPosition():void {
  246.         px = startPt.x;
  247.         py = startPt.y;
  248.         vx = startVx;
  249.         vy = startVy;
  250.     }
  251.     public function changeAction(xAnable:Boolean=true, yAnable:Boolean=false, _vx:Number=0.001, _vy:Number=0.001, _x:Number=200, _y:Number=200):void {
  252.         isXAddition = xAnable;
  253.         isYAddition = yAnable;
  254.         additionalVx = _vx;
  255.         additionalVy = _vy;
  256.         fixX = _x;
  257.         fixY = _y;
  258.     }
  259.     private function isContactWall():Boolean {
  260.         var truth:Boolean = false;
  261.         if(isXAddition){
  262.             if(px-radious>maxX)
  263.                 truth = true;
  264.         } else if(isYAddition) {
  265.             if(py-radious>maxY)
  266.                 truth = true;
  267.         }
  268.         return truth;
  269.     }
  270.     private function mainAdditionalVec():void {
  271.         if(isXAddition) {
  272.             vx+=additionalVx;
  273.             py = fixY;
  274.         }
  275.         if(isYAddition) {
  276.             vy+=additionalVy;
  277.             px = fixX;
  278.         }
  279.         
  280.         
  281.     }
  282.     
  283.     public function render():void {
  284.         this.x = px;
  285.         this.y = py;
  286.     }
  287. }
  288. class TooSenBoo extends Elemet {
  289.     public function TooSenBoo() {
  290.         
  291.     }
  292.     public override function update():void {
  293.         px = 400;
  294.         py = 200;
  295.     }
  296. }
  297. class RoadUnit {
  298.     public var x:Number;
  299.     public var y:Number;
  300.     public var vecType:String = "x";
  301.     public var posinega:int = 1;
  302.     public function RoadUnit(_x:Number=0,_y:Number=0, _vec:String="x", _pn:int=1 ) {
  303.         x = _x;
  304.         y = _y;
  305.         vecType = _vec;
  306.         posinega = _pn;
  307.     } 
  308. }
noswf

方向一定しつつ衝突判定 forked from: Yawaraka Balls forked from: 方向一定しつつ衝突判定 forked from: Yawaraka Balls [diff(3)]

  1. // forked from HaraMakoto's 方向一定しつつ衝突判定 forked from: Yawaraka Balls
  2. package
  3. {
  4.     import flash.display.Sprite;
  5.     import flash.events.Event;
  6.     import flash.events.TimerEvent;
  7.     import flash.utils.Timer;
  8.     
  9.     import net.hires.debug.Stats;
  10.     
  11.     [SWF(width="465", height="465", backgroundColor="#cccccc", frameRate=60)]
  12.     public class HitTest3 extends Sprite
  13.     {
  14.         private var elemList:Array = new Array();
  15.         private var elemNum:int = 20;
  16.         private var colManager:EasyColosionManager = new EasyColosionManager();
  17.         private var RoadList:Array = new Array();
  18.         
  19.         public function HitTest3()
  20.         {
  21.             super();
  22.             addChild(new Stats());
  23.             init();
  24.             addEventListener(Event.ENTER_FRAME, handleEnterFrame);
  25.         }
  26.         
  27.         private function init():void {
  28.             //道路一覧
  29.             RoadList = [
  30.                 new RoadUnit(80,445,"y",-1),new RoadUnit(140,20,"y",1),
  31.                 new RoadUnit(200,445,"y",-1),new RoadUnit(240,20,"y",1),
  32.                 new RoadUnit(340,445,"y",-1),new RoadUnit(400,20,"y",1),
  33.                 new RoadUnit(445,90,"x",-1),new RoadUnit(20,140,"x",1),
  34.                 new RoadUnit(445,180,"x",-1),new RoadUnit(20,210,"x",1),
  35.                 new RoadUnit(445,280,"x",-1),new RoadUnit(20,340,"x",1)
  36.             ]
  37.             var i:int;
  38.             for(i=0; i<elemNum; i++) {
  39.                 var elem:Elemet = new Elemet();
  40.                 addChild(elem);
  41.                 colManager.addElement(elem); //衝突マネージャ
  42.                 elemList.push(elem);
  43.                 var ru:RoadUnit = RoadList[int(RoadList.length*Math.random())];
  44.                 elem.px = ru.x;
  45.                 elem.py = ru.y;
  46.                 if(ru.vecType=="x") {
  47.                     if(ru.posinega==1) {
  48.                         elem.px += 100*Math.random();
  49.                     } else {
  50.                         elem.px -= 100*Math.random();
  51.                     }
  52.                 } else {
  53.                     elem.py += 100*Math.random();                    
  54.                 }
  55.                 elem.init((ru.vecType=="x"),(ru.vecType=="y"),0.01*ru.posinega, 0.01*ru.posinega,ru.x, ru.y);
  56.             }
  57. //            var too:TooSenBoo = new TooSenBoo();
  58. //            addChild(too);
  59. //            colManager.addElement(too);
  60. //            elemList.push(too);
  61. //            elemNum++;
  62.             
  63.             this.graphics.clear();
  64.             for(i=0; i<RoadList.length; i++) {
  65.                 var rr:RoadUnit = RoadList[i];
  66.                 this.graphics.lineStyle(1,0x333333);
  67.                 this.graphics.moveTo(rr.x,rr.y);
  68.                 var goalNum:Number = 465;
  69.                 if(rr.posinega==-1) goalNum = 0;
  70.                 if(rr.vecType=="x") {
  71.                     this.graphics.lineTo(goalNum, rr.y);
  72.                 } else {
  73.                     this.graphics.lineTo(rr.x, goalNum);                    
  74.                 }
  75.             }
  76.         }
  77.         
  78.         
  79.         private function handleEnterFrame(event:Event):void {
  80.             for (var t:int = 0; t < 4; t++) {
  81.                 var i:int;
  82.                 for(i=0; i<elemNum; i++) {
  83.                     elemList[i].update();
  84.                 }
  85.                 colManager.checkColision();
  86.             }
  87.             for(i=0; i<elemNum; i++) {
  88.                 elemList[i].render();
  89.             }
  90.         }
  91.         
  92.     }
  93. }
  94.     import flash.events.EventDispatcher;
  95.     import flash.display.Sprite;
  96.     import flash.utils.Timer;
  97.     import flash.events.TimerEvent;
  98.     import flash.geom.Point;
  99.     import caurina.transitions.Tweener;
  100.     import caurina.transitions.Equations;
  101.     
  102. class EasyColosionManager extends EventDispatcher {
  103.     private var elemList:Array = new Array();
  104.     private var elemlen:int = 0;
  105.     private var spring:Number = 0.2;
  106.     private var bounce:Number = -0.5;
  107.     private var gravity:Number = 0.1;
  108.     public function EasyColosionManager() {
  109.         
  110.     }
  111.     
  112.     public function addElement(elem:Elemet):void {
  113.         elemList.push(elem);
  114.         elemlen = elemList.length;
  115.     }
  116.     
  117.     public function checkColision():void {
  118.         var i:int;
  119.         for(i=0; i<elemlen-1; i++) {
  120.             var elem0:Elemet = elemList[i];
  121.             for(var j:int=i+1; j<elemlen; j++) {
  122.                 var elem1:Elemet = elemList[j];
  123.                 elem0.hitTest(elem1);
  124.             }
  125.         }
  126.         
  127.     }
  128.     
  129.     //2者間の距離を返す
  130.     private function culcDistBetElems(mc1:Sprite, mc2:Sprite):Number {
  131.         var pt1:Point = new Point(mc1.x, mc2.x);
  132.         var pt2:Point = new Point(mc2.x, mc2.y);
  133.         var dist:Number = Point.distance(pt1, pt2);
  134.         return dist;
  135.     }
  136.     
  137. }
  138. class Elemet extends Sprite {
  139.     public var px:Number = 0;
  140.     public var py:Number = 0;
  141.     public var vx:Number = 0;
  142.     public var vy:Number = 0;
  143.     public var maxX:Number = 465;
  144.     public var maxY:Number = 465;
  145.     public var started:Boolean = false;
  146.     public var radious:Number = 10;
  147.     private var spring:Number = 0.1;
  148.     private var bounce:Number = -0.5;
  149.     
  150.     private var cx:Number = 0;
  151.     private var cy:Number = 0;
  152.     private var priority:int = 0;
  153.     
  154.     private var isXAddition:Boolean = false;
  155.     private var isYAddition:Boolean = true;
  156.     private var additionalVx:Number = 0.1;
  157.     private var additionalVy:Number = 0.01;
  158.     private var fixX:Number = 200;
  159.     private var fixY:Number = 200;
  160.     
  161.     private var startPt:Point = new Point(0,0);
  162.     private var startVx:Number, startVy:Number;
  163.     
  164.     private var timer:Timer = new Timer(1000);
  165.     public function Elemet() {
  166.         radious = 16 * Math.random();
  167.         makeBody();
  168.     }
  169.     
  170.     private function makeBody():void {
  171.         this.graphics.beginFill(0xFFFFFF*Math.random());
  172.         this.graphics.drawRect(0,0,20,20);
  173.         this.graphics.endFill();
  174.     }
  175.     
  176.     public function attacked():void {
  177.         Tweener.addTween(this, {alpha:0, time:0.2, transition:Equations.easeOutInBounce});
  178.         Tweener.addTween(this, {alpha:1, time:0.2, delay:0.2, transition:Equations.easeOutInBounce});
  179.     }
  180.     
  181.     public function contact(contactX:Number, contactY:Number, _priority:int, force:Number):void {
  182.         var tx:Number = contactX - px;
  183.         var ty:Number = contactY - py;
  184.         
  185.         var angle:Number = Math.atan2(ty, tx);
  186.         var length:Number = Math.sqrt(tx*tx+ty*ty);
  187.         
  188.         vx -= (1-length/radious)*0.5*Math.cos(angle);
  189.         vy -= (1-length/radious)*0.5*Math.sin(angle);
  190.         
  191.         if(this.priority < _priority) {
  192.             this.priority = _priority;
  193.             cx = tx;
  194.             cy = ty;
  195.         }
  196.     }
  197.     public function hitTest(elm:Elemet):void {
  198.         var dx:Number = elm.px - px;
  199.         var dy:Number = elm.py - py;
  200.         var distanceSquared:Number = dx*dx+dy*dy;
  201.         var contactDistance:Number = radious + elm.radious;
  202.         if(distanceSquared < contactDistance*contactDistance) {
  203.             var tx:Number = linearTransform(radious, 0, contactDistance, px, elm.px);
  204.             var ty:Number = linearTransform(radious, 0, contactDistance, py, elm.py);
  205.             contact(tx, ty, 20.5);
  206.             elm.contact(tx, ty, 20.5);
  207.         }
  208.     }
  209.     private function linearTransform(n:Number, s0:Number, s1:Number, d0:Number, d1:Number):Number {
  210.         return ( d0+(n-s0)*(d1-d0) / (s1-s0) );
  211.     }
  212.     
  213.     
  214.     public function update():void {
  215.         cx = 0;
  216.         cy = 0;
  217.         priority = 0;
  218.     
  219.         px += vx;
  220.         py += vy;
  221.         
  222.         if(px-radious<0) {
  223.             setStartPosition();
  224.         }
  225.         if(px+radious>465) {
  226.             setStartPosition();
  227.         }
  228.         if(py-radious<0) {
  229.             setStartPosition();
  230.         }
  231.         
  232.         //端までいったら戻る
  233.         if(isContactWall())
  234.             setStartPosition();
  235.             
  236.         mainAdditionalVec();
  237.         vy *= 0.9796;
  238.         vx *= 0.9796;
  239.     }
  240.     public function init(xAnable:Boolean=true, yAnable:Boolean=false, _vx:Number=0.001, _vy:Number=0.001, _x:Number=200, _y:Number=200):void {
  241.         startPt.x = _x; startPt.y = _y;
  242.         startVx = _vx; startVy = _vy;
  243.         changeAction(xAnable,yAnable,_vx,_vy,_x,_y);
  244.     }
  245.     private function setStartPosition():void {
  246.         px = startPt.x;
  247.         py = startPt.y;
  248.         vx = startVx;
  249.         vy = startVy;
  250.     }
  251.     public function changeAction(xAnable:Boolean=true, yAnable:Boolean=false, _vx:Number=0.001, _vy:Number=0.001, _x:Number=200, _y:Number=200):void {
  252.         isXAddition = xAnable;
  253.         isYAddition = yAnable;
  254.         additionalVx = _vx;
  255.         additionalVy = _vy;
  256.         fixX = _x;
  257.         fixY = _y;
  258.     }
  259.     private function isContactWall():Boolean {
  260.         var truth:Boolean = false;
  261.         if(isXAddition){
  262.             if(px-radious>maxX)
  263.                 truth = true;
  264.         } else if(isYAddition) {
  265.             if(py-radious>maxY)
  266.                 truth = true;
  267.         }
  268.         return truth;
  269.     }
  270.     private function mainAdditionalVec():void {
  271.         if(isXAddition) {
  272.             vx+=additionalVx;
  273.             py = fixY;
  274.         }
  275.         if(isYAddition) {
  276.             vy+=additionalVy;
  277.             px = fixX;
  278.         }
  279.         
  280.         
  281.     }
  282.     
  283.     public function render():void {
  284.         this.x = px;
  285.         this.y = py;
  286.     }
  287. }
  288. class TooSenBoo extends Elemet {
  289.     public function TooSenBoo() {
  290.         
  291.     }
  292.     public override function update():void {
  293.         px = 400;
  294.         py = 200;
  295.     }
  296. }
  297. class RoadUnit {
  298.     public var x:Number;
  299.     public var y:Number;
  300.     public var vecType:String = "x";
  301.     public var posinega:int = 1;
  302.     public function RoadUnit(_x:Number=0,_y:Number=0, _vec:String="x", _pn:int=1 ) {
  303.         x = _x;
  304.         y = _y;
  305.         vecType = _vec;
  306.         posinega = _pn;
  307.     } 
  308. }
noswf

方向一定しつつ衝突判定 forked from: Yawaraka Balls チョロチョロ走る車 forked from: 方向一定しつつ衝突判定 [diff(96)]

  1. package
  2. {
  3.     import __AS3__.vec.Vector;
  4.     
  5.     import flash.display.BitmapData;
  6.     import flash.display.Loader;
  7.     import flash.display.Sprite;
  8.     import flash.events.Event;
  9.     import flash.events.TimerEvent;
  10.     import flash.geom.Matrix;
  11.     import flash.net.URLRequest;
  12.     import flash.system.Security;
  13.     import flash.utils.Timer;
  14.     
  15.     import jp.progression.commands.Func;
  16.     import jp.progression.commands.lists.SerialList;
  17.     
  18.     import net.hires.debug.Stats;
  19.     
  20.     [SWF(width="465", height="465", backgroundColor="#000000", frameRate=60)]
  21.     public class HitTest4 extends Sprite
  22.     {
  23.         private var elemList:Array = new Array();
  24.         private var elemNum:int = 20;
  25.         private var colManager:EasyColosionManager = new EasyColosionManager();
  26.         private var RoadList:Array = new Array();
  27.         
  28.         private var carList:Array = new Array();
  29. //        private var ImgDomain:String = "assets/";
  30.         private var ImgDomain:String = "http://swimmingbird.heteml.jp/wonderfl/assets/car/"
  31.         private var ROT_STEPS:int = 15;
  32.         public var Front:Vector.<BitmapData> = new Vector.<BitmapData>(ROT_STEPS, true);
  33.         public var Back:Vector.<BitmapData> = new Vector.<BitmapData>(ROT_STEPS, true);
  34.         public var Right:Vector.<BitmapData> = new Vector.<BitmapData>(ROT_STEPS, true);
  35.         public var Left:Vector.<BitmapData> = new Vector.<BitmapData>(ROT_STEPS, true);
  36.         
  37.         public function HitTest4()
  38.         {
  39.             super();
  40.             Security.loadPolicyFile("http://swimmingbird.heteml.jp/crossdomain.xml");
  41.             //addChild(new Stats());
  42.             
  43.             loadCharacters(carList,init);
  44.             //init();
  45.             
  46.         }
  47.         
  48.         private function loadCharacters(ImgArr:Array,compFunc:Function):void {
  49.             var i:int;
  50.             var carNum:int = 45;
  51.             var s:SerialList = new SerialList();
  52.             for(i=1; i<carNum+1; i++) {
  53.                 var loader:Loader = new Loader();
  54.                 var sp:Sprite = new Sprite();
  55.                 sp.addChild(loader);
  56.                 ImgArr.push(sp);
  57.                    s.addCommand(
  58.                     new Func(loader.load,[new URLRequest(ImgDomain+"car"+i+".png")],loader.contentLoaderInfo,Event.COMPLETE)
  59.                 );
  60.             }
  61.             s.addCommand(new Func(constructCars));
  62.             s.addCommand(new Func(compFunc));
  63.             s.execute();
  64.         }
  65.         
  66.         private function constructCars():void {
  67.             var matrix:Matrix = new Matrix();
  68.             matrix.scale(-1,1);
  69.             matrix.translate(50,0);
  70.             var i:int = ROT_STEPS;
  71.             while (i--)
  72.             {
  73.                 Front[i] = new BitmapData(5050true, 0x0);
  74.                 Front[i].draw(carList[i+15]);
  75.                 Back[i] = new BitmapData(5050true, 0x0);
  76.                 Back[i].draw(carList[i+30]);
  77.                 Right[i] = new BitmapData(5050true, 0x0);
  78.                 Right[i].draw(carList[i]);
  79.                 Left[i] = new BitmapData(5050true, 0x0);
  80.                 Left[i].draw(carList[i],matrix);
  81.             }
  82.         }
  83.         
  84.         private function init():void {
  85.             //道路一覧
  86.             RoadList = [
  87.                 new RoadUnit(80,445,"y",-1),new RoadUnit(140,20,"y",1),
  88.                 new RoadUnit(200,445,"y",-1),new RoadUnit(240,20,"y",1),
  89.                 new RoadUnit(340,445,"y",-1),new RoadUnit(400,20,"y",1),
  90.                 new RoadUnit(445,90,"x",-1),new RoadUnit(20,140,"x",1),
  91.                 new RoadUnit(445,180,"x",-1),new RoadUnit(20,210,"x",1),
  92.                 new RoadUnit(445,280,"x",-1),new RoadUnit(20,340,"x",1)
  93.             ]
  94.             var i:int;
  95.             for(i=0; i<elemNum; i++) {
  96.                 var elem:Elemet = new Elemet(this);
  97.                 addChild(elem);
  98.                 colManager.addElement(elem); //衝突マネージャ
  99.                 elemList.push(elem);
  100.                 var ru:RoadUnit = RoadList[int(RoadList.length*Math.random())];
  101.                 elem.px = ru.x;
  102.                 elem.py = ru.y;
  103.                 if(ru.vecType=="x") {
  104.                     if(ru.posinega==1) {
  105.                         elem.px += 100*Math.random();
  106.                     } else {
  107.                         elem.px -= 100*Math.random();
  108.                     }
  109.                 } else {
  110.                     elem.py += 100*Math.random();                    
  111.                 }
  112.                 elem.init((ru.vecType=="x"),(ru.vecType=="y"),0.01*ru.posinega, 0.01*ru.posinega,ru.x, ru.y);
  113.             }
  114. //            var too:TooSenBoo = new TooSenBoo();
  115. //            addChild(too);
  116. //            colManager.addElement(too);
  117. //            elemList.push(too);
  118. //            elemNum++;
  119.             
  120.             this.graphics.clear();
  121.             for(i=0; i<RoadList.length; i++) {
  122.                 var rr:RoadUnit = RoadList[i];
  123.                 this.graphics.lineStyle(1,0x333333);
  124.                 this.graphics.moveTo(rr.x,rr.y);
  125.                 var goalNum:Number = 465;
  126.                 if(rr.posinega==-1) goalNum = 0;
  127.                 if(rr.vecType=="x") {
  128.                     this.graphics.lineTo(goalNum, rr.y);
  129.                 } else {
  130.                     this.graphics.lineTo(rr.x, goalNum);                    
  131.                 }
  132.             }
  133.             addEventListener(Event.ENTER_FRAME, handleEnterFrame);
  134.         }
  135.         
  136.         
  137.         
  138.         private function handleEnterFrame(event:Event):void {
  139.             for (var t:int = 0; t < 6; t++) {
  140.                 var i:int;
  141.                 for(i=0; i<elemNum; i++) {
  142.                     elemList[i].update();
  143.                 }
  144.                 colManager.checkColision();
  145.             }
  146.             for(i=0; i<elemNum; i++) {
  147.                 elemList[i].render();
  148.             }
  149.         }
  150.         
  151.     }
  152. }
  153.     import flash.events.EventDispatcher;
  154.     import flash.display.Sprite;
  155.     import flash.utils.Timer;
  156.     import flash.events.TimerEvent;
  157.     import flash.geom.Point;
  158.     import caurina.transitions.Tweener;
  159.     import caurina.transitions.Equations;
  160.     import flash.display.BitmapData;
  161.     import flash.display.Bitmap;
  162.     
  163. class EasyColosionManager extends EventDispatcher {
  164.     private var elemList:Array = new Array();
  165.     private var elemlen:int = 0;
  166.     private var spring:Number = 0.2;
  167.     private var bounce:Number = -0.5;
  168.     private var gravity:Number = 0.1;
  169.     public function EasyColosionManager() {
  170.         
  171.     }
  172.     
  173.     public function addElement(elem:Elemet):void {
  174.         elemList.push(elem);
  175.         elemlen = elemList.length;
  176.     }
  177.     
  178.     public function checkColision():void {
  179.         var i:int;
  180.         for(i=0; i<elemlen-1; i++) {
  181.             var elem0:Elemet = elemList[i];
  182.             for(var j:int=i+1; j<elemlen; j++) {
  183.                 var elem1:Elemet = elemList[j];
  184.                 var dx:Number = elem1.x - elem0.x;
  185.                 var dy:Number = elem1.y - elem0.y;  
  186.                 var dist:Number = culcDistBetElems(elem0, elem1);
  187.                 var minDist:Number = elem0.radious + elem1.radious;
  188.                 elem0.hitTest(elem1);
  189.             }
  190.         }
  191.         
  192.     }
  193.     
  194.     //2者間の距離を返す
  195.     private function culcDistBetElems(mc1:Sprite, mc2:Sprite):Number {
  196.         var pt1:Point = new Point(mc1.x, mc2.x);
  197.         var pt2:Point = new Point(mc2.x, mc2.y);
  198.         var dist:Number = Point.distance(pt1, pt2);
  199.         return dist;
  200.     }
  201.     
  202. }
  203. class Elemet extends Sprite {
  204.     public var px:Number = 0;
  205.     public var py:Number = 0;
  206.     public var vx:Number = 0;
  207.     public var vy:Number = 0;
  208.     public var maxX:Number = 465;
  209.     public var maxY:Number = 465;
  210.     public var started:Boolean = false;
  211.     public var radious:Number = 25;
  212.     private var spring:Number = 0.1;
  213.     private var bounce:Number = -0.5;
  214.     
  215.     private var cx:Number = 0;
  216.     private var cy:Number = 0;
  217.     private var priority:int = 0;
  218.     
  219.     private var isXAddition:Boolean = false;
  220.     private var isYAddition:Boolean = true;
  221.     private var additionalVx:Number = 0.1;
  222.     private var additionalVy:Number = 0.01;
  223.     private var fixX:Number = 200;
  224.     private var fixY:Number = 200;
  225.     
  226.     private var startPt:Point = new Point(0,0);
  227.     private var startVx:Number, startVy:Number;
  228.     
  229.     private var bmp:Bitmap = new Bitmap();
  230.     private var myparent:HitTest4;
  231.     private var counter:int = 0;
  232.     
  233.     private var timer:Timer = new Timer(1000);
  234.     public function Elemet(pare:HitTest4) {
  235.         myparent = pare;
  236.         radious = 18;
  237.         makeBody();
  238.     }
  239.     
  240.     private function makeBody():void {
  241.         this.graphics.beginFill(0,0);
  242.         this.graphics.drawCircle(0,0,radious);
  243.         this.graphics.endFill();
  244.         addChild(bmp);
  245.         bmp.x = bmp.y = -25;
  246.     }
  247.     
  248.     public function attacked():void {
  249.         Tweener.addTween(this, {alpha:0, time:0.2, transition:Equations.easeOutInBounce});
  250.         Tweener.addTween(this, {alpha:1, time:0.2, delay:0.2, transition:Equations.easeOutInBounce});
  251.     }
  252.     
  253.     public function contact(contactX:Number, contactY:Number, _priority:int, force:Number):void {
  254.         var tx:Number = contactX - px;
  255.         var ty:Number = contactY - py;
  256.         
  257.         var angle:Number = Math.atan2(ty, tx);
  258.         var length:Number = Math.sqrt(tx*tx+ty*ty);
  259.         
  260.         vx -= (1-length/radious)*0.5*Math.cos(angle);
  261.         vy -= (1-length/radious)*0.5*Math.sin(angle);
  262.         
  263.         if(this.priority < _priority) {
  264.             this.priority = _priority;
  265.             cx = tx;
  266.             cy = ty;
  267.         }
  268.     }
  269.     public function hitTest(elm:Elemet):void {
  270.         var dx:Number = elm.px - px;
  271.         var dy:Number = elm.py - py;
  272.         var distanceSquared:Number = dx*dx+dy*dy;
  273.         var contactDistance:Number = radious + elm.radious;
  274.         if(distanceSquared < contactDistance*contactDistance) {
  275.             var tx:Number = linearTransform(radious, 0, contactDistance, px, elm.px);
  276.             var ty:Number = linearTransform(radious, 0, contactDistance, py, elm.py);
  277.             contact(tx, ty, 20.5);
  278.             elm.contact(tx, ty, 20.5);
  279.         }
  280.     }
  281.     private function linearTransform(n:Number, s0:Number, s1:Number, d0:Number, d1:Number):Number {
  282.         return ( d0+(n-s0)*(d1-d0) / (s1-s0) );
  283.     }
  284.     
  285.     
  286.     public function update():void {
  287.         cx = 0;
  288.         cy = 0;
  289.         priority = 0;
  290.     
  291.         px += vx;
  292.         py += vy;
  293.         
  294.         if(px-radious<0) {
  295.             setStartPosition();
  296.         }
  297.         if(px+radious>465) {
  298.             setStartPosition();
  299.         }
  300.         if(py-radious<0) {
  301.             setStartPosition();
  302.         }
  303.         
  304.         //端までいったら戻る
  305.         if(isContactWall())
  306.             setStartPosition();
  307.             
  308.         mainAdditionalVec();
  309.         vy *= 0.9796;
  310.         vx *= 0.9796;
  311.     }
  312.     public function init(xAnable:Boolean=true, yAnable:Boolean=false, _vx:Number=0.001, _vy:Number=0.001, _x:Number=200, _y:Number=200):void {
  313.         startPt.x = _x; startPt.y = _y;
  314.         startVx = _vx; startVy = _vy;
  315.         changeAction(xAnable,yAnable,_vx,_vy,_x,_y);
  316.     }
  317.     private function setStartPosition():void {
  318.         px = startPt.x;
  319.         py = startPt.y;
  320.         vx = startVx;
  321.         vy = startVy;
  322.     }
  323.     public function changeAction(xAnable:Boolean=true, yAnable:Boolean=false, _vx:Number=0.001, _vy:Number=0.001, _x:Number=200, _y:Number=200):void {
  324.         isXAddition = xAnable;
  325.         isYAddition = yAnable;
  326.         additionalVx = _vx;
  327.         additionalVy = _vy;
  328.         fixX = _x;
  329.         fixY = _y;
  330.     }
  331.     private function isContactWall():Boolean {
  332.         var truth:Boolean = false;
  333.         if(isXAddition){
  334.             if(px-radious>maxX)
  335.                 truth = true;
  336.         } else if(isYAddition) {
  337.             if(py-radious>maxY)
  338.                 truth = true;
  339.         }
  340.         return truth;
  341.     }
  342.     private function mainAdditionalVec():void {
  343.         if(isXAddition) {
  344.             vx+=additionalVx;
  345.             py = fixY;
  346.         }
  347.         if(isYAddition) {
  348.             vy+=additionalVy;
  349.             px = fixX;
  350.         }
  351.         
  352.         
  353.     }
  354.     
  355.     public function render():void {
  356.         if(isYAddition) {
  357.             if(vy>0) {
  358.                 bmp.bitmapData = myparent.Front[counter%15];
  359.             } else {
  360.                 bmp.bitmapData = myparent.Back[counter%15];
  361.             }
  362.         } else {
  363.             if(vx>0) {
  364.                 bmp.bitmapData = myparent.Right[counter%15];
  365.             } else {
  366.                 bmp.bitmapData = myparent.Left[counter%15];
  367.             }
  368.         }
  369.         this.x = px;
  370.         this.y = py;
  371.         counter++;
  372.     }
  373. }
  374. class TooSenBoo extends Elemet {
  375.     public function TooSenBoo(pare:HitTest4) {
  376.         super(pare);
  377.     }
  378.     public override function update():void {
  379.         px = 400;
  380.         py = 200;
  381.     }
  382. }
  383. class RoadUnit {
  384.     public var x:Number;
  385.     public var y:Number;
  386.     public var vecType:String = "x";
  387.     public var posinega:int = 1;
  388.     public function RoadUnit(_x:Number=0,_y:Number=0, _vec:String="x", _pn:int=1 ) {
  389.         x = _x;
  390.         y = _y;
  391.         vecType = _vec;
  392.         posinega = _pn;
  393.     } 
  394. }
noswf
Get Adobe Flash Player