物理演算にはAPEパッケージを使用しています。

Gariben.as (メインクラス)
package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import org.cove.ape.APEngine;
    import org.cove.ape.Group;
    import org.cove.ape.Vector;
    
    [SWF(width='550',height='400',backgroundColor='0x0',frameRate='40')]

    public class Gariben extends Sprite{
        //APE objects
        private var wall:Wall;
        private var obj:SphereSpring;
    
        //for drag
        public var base:Sprite;
        private var flgMouse:Boolean;
        
        //img
        private var character:Character;
        
        public function Gariben(){
            //for APE
            APEInit();
            
            addEventListener(Event.ENTER_FRAME, run);
        
            createBase();
            base.addEventListener(MouseEvent.MOUSE_DOWN, pick);
            stage.addEventListener(MouseEvent.MOUSE_UP, place);
            
            character = new Character();
            base.addChild(character);
        }
        
        private function createBase():void{
            base = new Sprite();
            base.x = obj.cAry[0].px;
            base.y = obj.cAry[0].py;
            addChild(base);
        }
        
        private function pick(e:MouseEvent):void{
            flgMouse = true;
            e.target.startDrag();
        }
        
        private function place(e:MouseEvent):void{
            flgMouse = false;
            //e.target.stopDrag();
            base.stopDrag();
        }
        
        private function chase():void{
            //tune the rotating angle
            var dx:Number = obj.cAry[1].px - obj.cAry[0].px;
            var dy:Number = obj.cAry[1].py - obj.cAry[0].py;
            var ang:Number = Math.atan2(dy,dx);
            base.rotation = 180*ang/Math.PI;
            
            base.x = obj.cAry[0].px;
            base.y = obj.cAry[0].py;
            
            //why needed?
            character.x = 0;
            character.y = 0;
            
            if (flgMouse){
                obj.cAry[0].px = stage.mouseX;
                obj.cAry[0].py = stage.mouseY;
            }
        }
        
        private function APEInit():void{
            var stageWidth:Number = stage.stageWidth;
            var stageHeight:Number = stage.stageHeight;
            var wallThickness:Number = 100;
            
            APEngine.init(0.25);
            APEngine.container = this;
            APEngine.addMasslessForce(new Vector(0,5));
            
            wall= new Wall(stageWidth,stage.stageHeight,wallThickness);
            APEngine.addGroup(wall);
            
            obj= new SphereSpring(stageWidth/2,stageHeight/2);
            APEngine.addGroup(obj);
            
            //"wall" collides with "obj"
            wall.addCollidableList(new Array(obj));
        }
        
        private function run(e:Event):void{
            chase();
            APEngine.step();
            APEngine.paint();
        }
    }
}
SphereSpring.as (ネット状のオブジェクト全体)
package{
    import flash.display.Sprite;
    import org.cove.ape.CircleParticle;
    import org.cove.ape.SpringConstraint;
    import org.cove.ape.Group;
    
    public class SphereSpring extends Group{
            private static const N_TOTAL:int = 10;
            private static const RADIUS:int = 100;
            
            //must be accessible from the main class
            public var cAry:Array;
        
        public function SphereSpring(xPos:Number, yPos:Number){
            
            cAry = new Array();
            
            //center object (optional)
            var c0:CircleParticle = new CircleParticle(xPos,yPos,0);
            addParticle(c0);
            cAry.push(c0);
            
            for (var i:int=0; i<N_TOTAL; i++){
                var t:Number = 2*Math.PI*i/N_TOTAL;
                var x:Number = xPos + RADIUS*Math.cos(t);
                var y:Number = yPos + RADIUS*Math.sin(t);
                //var c:CircleParticle = new CircleParticle(x,y,0);
                var c:CircleParticle = new CircleParticle(x,y,0,false,1,0.3,0.1);
                c.setStyle(0, 0xFFFFFF, 1, 0xFFFFFF);
                addParticle(c);
                cAry.push(c);
            }
            
            for (i=0; i<cAry.length; i++){
                for (var j:int=0; j<cAry.length; j++){
                    if (j!=i){
                        var s:SpringConstraint = new SpringConstraint(cAry[i],cAry[j],0.2);
                        s.setStyle(0, 0x666666, 1, 0xFFFFFF);
                        addConstraint(s);
                    }
                }
            }
        }
    }
}
Wall.as (壁)
package{
    import org.cove.ape.RectangleParticle;
    import org.cove.ape.Group;
    
    public class Wall extends Group{
        
        private var rL:RectangleParticle;
        private var rR:RectangleParticle;
        private var rT:RectangleParticle;
        private var rB:RectangleParticle;
        
        public function Wall(stageWidth:Number,stageHeight:Number,wallThickness:Number){
            rL = new RectangleParticle(-wallThickness/2,stageHeight/2,stageHeight,wallThickness,Math.PI/2,true);
            addParticle(rL);
            rR = new RectangleParticle(stageWidth+wallThickness/2,stageHeight/2,stageHeight,wallThickness,Math.PI/2,true);
            addParticle(rR);
            rT = new RectangleParticle(stageWidth/2,-wallThickness/2,stageWidth,wallThickness,0,true);
            addParticle(rT);
            rB = new RectangleParticle(stageWidth/2,stageHeight+wallThickness/2,stageWidth,wallThickness,0,true);
            addParticle(rB);
        }
    }
}
Character.as (キャラクターアニメーション)
package{
    import flash.utils.setInterval;
    import flash.display.Sprite;
    import flash.display.Bitmap;
    
    public class Character extends Sprite{
        [(source="gari1.gif")]
        private var IMG1:Class;
        [(source="gari2.gif")]
        private var IMG2:Class;
        
        private var img1:Bitmap;
        private var img2:Bitmap;
        private var flgIMG:Boolean;
        
        public function Character(){
            img1 = new IMG1();
            img2 = new IMG2();
            img1.x = -img1.bitmapData.width/2;
            img1.y = -img1.bitmapData.height/2;
            img2.x = -img2.bitmapData.width/2;
            img2.y = -img2.bitmapData.height/2;
            
            addChildAt(img1,0);
            setInterval(changeIMG,500);
        }
        
        private function changeIMG():void{
            
            if(flgIMG){
                addChildAt(img1,0);
                flgIMG = false;
            }
            else{
                addChildAt(img2,0);
                flgIMG = true;
            }
            if (numChildren > 1){
                removeChildAt(1);
            }
        }
    }
}
Powered by blog Boreal Kiss 2008.