Beautifl - Flash Gallery

Thumbnail : テオ・ヤンセン機構
テオ・ヤンセン機構
Nao_u 2009-08-27 All rights reserved

再生するにはFlash Playerが必要です。デスクトップのブラウザでご覧ください。

//
// カーソルキーで左右移動
//  左クリックで引っ張る
//
//    http://game.g.hatena.ne.jp/Nao_u/20090416
//
package {
    import flash.display.Sprite;
    import flash.events.*;
    [SWF(width="465", height="465", backgroundColor="0xFFFFFF", frameRate="60")] 
   
    public class FlashTest extends Sprite {
        public function FlashTest() {
            Main = this;
            initialize();
            stage.addEventListener(Event.ENTER_FRAME,update); 
            stage.addEventListener(KeyboardEvent.KEY_UP,   keyCheckUp); 
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyCheckDown); 
            stage.addEventListener(MouseEvent.MOUSE_UP,    MouseCheckUp); 
            stage.addEventListener(MouseEvent.MOUSE_DOWN,  MouseCheckDown); 
        }
    }
}        

var Main:Sprite;
var PointAry:Vector.<MovePoint> = new Vector.<MovePoint>;
var ConnectAry:Vector.<Connect> = new Vector.<Connect>;
var MousePos:Object = new Object;

import flash.display.Sprite; 
import flash.events.Event;
import flash.events.KeyboardEvent; 
import flash.events.MouseEvent; 
import flash.ui.Keyboard; 

function initialize():void{
    createModel();
}

function createModel():void{
    var i:int;
    var c0:int = 0xb0b000;
    var c1:int = 0xd0d000;
    var pa:Vector.<MovePoint> = new Vector.<MovePoint>;
    var ca:Vector.<Connect> = new Vector.<Connect>;

    addPoint(    0.0, -102.0, pa );    // 0
    addPoint(    0.0, -124.0, pa );    // 1

    addPoint(   71.0, -124.0, pa );    // 2

    addPoint(  129.0, -142.0, pa );    // 3
    addPoint(   57.0, -184.0, pa );    // 4
    addPoint(  116.0, -205.0, pa );    // 5
    addPoint(   93.0,  -64.0, pa );    // 6
    addPoint(   28.0, -270.0, pa );    // 7

    addPoint(  -71.0, -124.0, pa );    // 8

    addPoint( -129.0, -142.0, pa );    // 9
    addPoint(  -57.0, -184.0, pa );    // 10
    addPoint( -116.0, -205.0, pa );    // 11
    addPoint(  -93.0,  -64.0, pa );    // 12
    addPoint(  -28.0, -270.0, pa );    // 13


    addPoint(    0.0, -146.0, pa );    // 14

    addPoint(  129.0, -106.0, pa );    // 15
    addPoint(   93.0, -181.0, pa );    // 16
    addPoint(  153.0, -165.0, pa );    // 17
    addPoint(   55.0,  -62.0, pa );    // 18
    addPoint(  117.0, -270.0, pa );    // 19

    addPoint( -129.0, -106.0, pa );    // 20
    addPoint(  -93.0, -181.0, pa );    // 21
    addPoint( -153.0, -165.0, pa );    // 22
    addPoint(  -55.0,  -62.0, pa );    // 23
    addPoint( -117.0, -270.0, pa );    // 24

    addPoint(   22.0, -124.0, pa );    // 25
    addPoint(  -22.0, -124.0, pa );    // 26
    

    addConnect( 0, 1, c0, pa, ca);
    addConnect( 1,14, c0, pa, ca);

    addConnect( 1, 2, c0, pa, ca);
    addConnect( 1, 8, c0, pa, ca);

    addConnectM( 2, 8, 1, c1, pa, ca);

    addConnect( 0, 4, c0, pa, ca);
    addConnect( 0, 6, c0, pa, ca);
    addConnect( 2, 3, c0, pa, ca);
    addConnect( 2, 4, c0, pa, ca);
    addConnect( 2, 6, c0, pa, ca);
    addConnect( 3, 5, c0, pa, ca);
    addConnect( 3, 6, c0, pa, ca);
    addConnect( 4, 5, c0, pa, ca);
    addConnect( 4, 7, c0, pa, ca);
    addConnect( 5, 7, c0, pa, ca);

    addConnect( 0,10, c0, pa, ca);
    addConnect( 0,12, c0, pa, ca);
    addConnect( 8, 9, c0, pa, ca);
    addConnect( 8,10, c0, pa, ca);
    addConnect( 8,12, c0, pa, ca);
    addConnect( 9,11, c0, pa, ca);
    addConnect( 9,12, c0, pa, ca);
    addConnect(10,11, c0, pa, ca);
    addConnect(10,13, c0, pa, ca);
    addConnect(11,13, c0, pa, ca);

    addConnect( 2,18, c0, pa, ca);

    addConnect(14,16, c1, pa, ca);
    addConnect(14,18, c1, pa, ca);
    addConnect( 2,15, c1, pa, ca);
    addConnect( 2,16, c1, pa, ca);
    addConnect( 2,18, c1, pa, ca);
    addConnect(15,17, c1, pa, ca);
    addConnect(15,18, c1, pa, ca);
    addConnect(16,17, c1, pa, ca);
    addConnect(16,19, c1, pa, ca);
    addConnect(17,19, c1, pa, ca);

    addConnect(14,21, c1, pa, ca);
    addConnect(14,23, c1, pa, ca);
    addConnect( 8,20, c1, pa, ca);
    addConnect( 8,21, c1, pa, ca);
    addConnect( 8,23, c1, pa, ca);
    addConnect(20,22, c1, pa, ca);
    addConnect(20,23, c1, pa, ca);
    addConnect(21,22, c1, pa, ca);
    addConnect(21,24, c1, pa, ca);
    addConnect(22,24, c1, pa, ca);

    addConnect( 0,14, c1, pa, ca);

    addConnect(25,14, c1, pa, ca);
    addConnect(25, 0, c1, pa, ca);
    addConnect(25, 1, c1, pa, ca);
    addConnect(26,14, c1, pa, ca);
    addConnect(26, 0, c1, pa, ca);
    addConnect(26, 1, c1, pa, ca);
    
    for each( var p:MovePoint in pa ) PointAry.push( p );
    for each( var c:Connect   in ca ) ConnectAry.push( c );
}

var m0:Number = 100;
var m1:Number =-350;
var m2:Number =-700;
var mh:Number = 100;
var friction:Number = 0.6;    

function addPoint( x:Number, y:Number, pa:Vector.<MovePoint> ):void{
    var ofsX:Number = 250.0;
    var ofsY:Number = 0.0;
    var pnt:MovePoint = new MovePoint( Main, x+ofsX, -y+ofsY, false );
    pa.push(pnt);
}

function addConnect( st:int, ed:int, col:int, pa:Vector.<MovePoint>, ca:Vector.<Connect> ):void{
    var cnt:Connect = new Connect( Main, col, pa[st], pa[ed] );
    ca.push(cnt);
}

function addConnectM( st:int, ed:int, mid:int, col:int, pa:Vector.<MovePoint>, ca:Vector.<Connect> ):void{
    var cnt:Connect = new Connect( Main, col, pa[st], pa[ed], pa[mid] );
    ca.push(cnt);
}


function update(e :Event):void{
    Main.graphics.clear(); 
    MousePos.x = Main.stage.mouseX; 
    MousePos.y = Main.stage.mouseY; 
    
    var cnt:Connect;
    var pnt:MovePoint;
    var gravity:Number = 0.03;
    for each( pnt in PointAry ) pnt.addSpeed(0,gravity);
    
    var j:int;
    for( var i:int=0; i<20; i++){
        var num:int = ConnectAry.length;
        for( j=0; j<num; j++)    ConnectAry[j].update();
        for( j=num-1; j>=0; j--) ConnectAry[j].update();
        for each( pnt in PointAry ) pnt.update();
    }

    Main.graphics.lineStyle(3,0xd0d000);   
    Main.graphics.moveTo( -10240, 400 );   
    Main.graphics.lineTo( 10240, 400 );  
    for( i=0; i<40; i++ ){
        Main.graphics.moveTo( (i-10)*150, 400 );   
        Main.graphics.lineTo( (i-10)*150, 410 );   
    }
    Main.graphics.moveTo(  m0, 400 );   
    Main.graphics.lineTo(  m1, 400 - mh );   
    Main.graphics.lineTo(  m2, 400 );   
    
    Main.x -= (Main.x - (-PointAry[0].Pos.x + (465/2))) * 0.06;

    for each( cnt in ConnectAry ) cnt.draw();
    addPower();
    for each( pnt in PointAry ) pnt.draw();
}

function addPower():void{
    var pow:Number = 0.0035;
    var pnt:MovePoint = PointAry[1];
    var vx:Number = ((MousePos.x-Main.x) - pnt.Pos.x) * pow;
    var vy:Number = ((MousePos.y)        - pnt.Pos.y) * pow * 4;
    if( MouseData & MOUSE_LEFT ){
        PointAry[1].addSpeed( vx, vy );
        PointAry[2].addSpeed( vx*0.3, vy*0.3 );
        PointAry[8].addSpeed( vx*0.3, vy*0.3 );
        Main.graphics.lineStyle(0,0xff0000);   
        Main.graphics.moveTo( pnt.Pos.x, pnt.Pos.y );   
        Main.graphics.lineTo( MousePos.x-Main.x, MousePos.y );   
    }

    var rot:Number = 0.0;
    if( KeyData & KEY_LEFT )  rot =  1.0;
    if( KeyData & KEY_RIGHT ) rot = -1.0;

    addPowerTurn( rot,  0, 14 );
    addPowerTurn( rot, 26, 25 );
}

function addPowerTurn( rot:Number, p1:int, p2:int ):void{
    var pnt0:MovePoint  = PointAry[p1];
    var pnt1:MovePoint  = PointAry[1];
    var pnt14:MovePoint = PointAry[p2];

    var vx:Number = pnt0.Pos.x - pnt1.Pos.x;
    var vy:Number = pnt0.Pos.y - pnt1.Pos.y;
        
    var arwPow:Number = 0.0065 * rot;
    var ax:Number =  vy * arwPow;
    var ay:Number = -vx * arwPow;
    
    pnt0.Pos.x += ax;
    pnt0.Pos.y += ay;

    Main.graphics.lineStyle(0,0xff6060);   
    Main.graphics.moveTo( pnt0.Pos.x, pnt0.Pos.y );   
    Main.graphics.lineTo( pnt0.Pos.x + ax * 100, pnt0.Pos.y + ay * 100 );   

    ax *= -1;
    ay *= -1;
    pnt14.Pos.x += ax;
    pnt14.Pos.y += ay;

    Main.graphics.lineStyle(1,0x6060ff);   
    Main.graphics.moveTo( pnt14.Pos.x, pnt14.Pos.y );   
    Main.graphics.lineTo( pnt14.Pos.x + ax * 100, pnt14.Pos.y + ay * 100 );   
}


class MovePoint{
    private var Sp:Sprite;
    public var Pos:Object = new Object;
    public var Prev:Object = new Object;
    public var IsFix:Boolean;
    public var Parent:Sprite;

    public function MovePoint( parent:Sprite, x:Number, y:Number, isFix:Boolean ){
        Pos.x = Prev.x = x;
        Pos.y = Prev.y = y;
        IsFix = isFix;
        Sp=new Sprite();  
        Sp.graphics.beginFill(0xb0a000,1);  
        Sp.graphics.drawCircle(0,0,2.5);  
        Sp.graphics.endFill();  
        Sp.x = Pos.x;
        Sp.y = Pos.y;
        parent.stage.addChild(Sp); 
        Parent = parent;

    }

    public function update():void {
        if( IsFix == true ){
            Pos.x = Prev.x;
            Pos.y = Prev.y;
            return;
        }
        var sx:Number = Pos.x - Prev.x;
        var sy:Number = Pos.y - Prev.y;
        Prev.x = Pos.x;
        Prev.y = Pos.y;
        
        Pos.x += sx * 0.997;
        Pos.y += sy * 0.997;

        if( Pos.y > 400 ) {
            Pos.x += (Prev.x - Pos.x) * friction;
            Pos.y = 400;        
        }
        if( Pos.x < m0 && Pos.x > m2) {
            var st:Number, ed:Number, ratio:Number, height:Number;
            if( Pos.x > m1 ){
                st =  m0;
                ed = m1;
                ratio = (st - Pos.x) / (st-ed);
                height = 400 - ratio * mh;

                if( Pos.y > height ){
                    Pos.x += (Prev.x - Pos.x) * friction;
                    Pos.y = height;        
                }
            }
            else if( Pos.x > m2 ){
                st = m1;
                ed = m2;
                ratio = (st - Pos.x) / (st-ed);
                height = 400 - (1.0-ratio) * mh;

                if( Pos.y > height ){
                    Pos.x += (Prev.x - Pos.x) * friction;
                    Pos.y = height;        
                }
            }
        }
    }
    
    public function addSpeed( px:Number, py:Number ):void{
        Pos.x += px;
        Pos.y += py;
    }

    public function draw():void {
        Sp.x = Pos.x + Main.x;
        Sp.y = Pos.y;   
    }
}

class Connect{
    public var Parent:Sprite;
    public var St:MovePoint;
    public var Ed:MovePoint;
    public var Mid:MovePoint;
    public var Length:Number;
    public var Color:int
    public function Connect( parent:Sprite, col:int, st:MovePoint, ed:MovePoint, mid:MovePoint=null ){
            parent.graphics.beginFill(0xFFFF00,1);   
            parent.graphics.drawRect(0,0,256,256);   
            parent.graphics.endFill();   
        Color = col;
        St = st;
        Ed = ed;
        Mid = mid;
        
        var vx:Number = Ed.Pos.x - St.Pos.x;
        var vy:Number = Ed.Pos.y - St.Pos.y;
        Length = Math.sqrt( vx*vx + vy*vy );
        Parent = parent; 
    }

    public function update():void {
        var vx:Number = Ed.Pos.x - St.Pos.x;
        var vy:Number = Ed.Pos.y - St.Pos.y;
        var hx:Number = St.Pos.x + vx * 0.5;
        var hy:Number = St.Pos.y + vy * 0.5;
        var length:Number = Math.sqrt( vx*vx + vy*vy );
        vx /= length;
        vy /= length;
        
        var m:Number = 0.00;
        if( length > Length-m && length < Length+m ){
        }else{
            if( length > Length ) length = Length+m;
            else                  length = Length-m;

            var ratio:Number = 1.0;
            St.Pos.x -= (St.Pos.x - (hx - vx * length * 0.5)) * ratio;
            St.Pos.y -= (St.Pos.y - (hy - vy * length * 0.5)) * ratio;

            Ed.Pos.x -= (Ed.Pos.x - (hx + vx * length * 0.5)) * ratio;
            Ed.Pos.y -= (Ed.Pos.y - (hy + vy * length * 0.5)) * ratio;
        }

        if( Mid != null ){
            var ratio2:Number = 0.15;
            Mid.Pos.x -= (Mid.Pos.x - hx) * ratio2;
            Mid.Pos.y -= (Mid.Pos.y - hy) * ratio2;
        }
    }

    public function draw():void {
        Parent.graphics.lineStyle(4,Color);   
        Parent.graphics.moveTo( St.Pos.x, St.Pos.y );   
        Parent.graphics.lineTo( Ed.Pos.x, Ed.Pos.y );   
    }
}





var KEY_UP:int    = 0x01;
var KEY_DOWN:int  = 0x02;
var KEY_LEFT:int  = 0x04;
var KEY_RIGHT:int = 0x08;
var KeyData:int;
function keyCheckDown(event:KeyboardEvent):void { 
    switch (event.keyCode){ 
        case Keyboard.UP:	    KeyData |= KEY_UP; break;
        case Keyboard.DOWN:	    KeyData |= KEY_DOWN; break;
        case Keyboard.LEFT:    KeyData |= KEY_LEFT; break;
        case Keyboard.RIGHT:   KeyData |= KEY_RIGHT; break;
    }
} 
function keyCheckUp(event:KeyboardEvent):void { 
    switch (event.keyCode){ 
        case Keyboard.UP:      KeyData &= ~KEY_UP; break;
        case Keyboard.DOWN:    KeyData &= ~KEY_DOWN; break;
        case Keyboard.LEFT:    KeyData &= ~KEY_LEFT; break;
        case Keyboard.RIGHT:   KeyData &= ~KEY_RIGHT; break;
    }
} 

var MOUSE_LEFT:int = 0x01;
var MouseData:int;
function MouseCheckDown(event:MouseEvent):void{
    MouseData |= MOUSE_LEFT;
}         

function MouseCheckUp(event:MouseEvent):void{
    MouseData &= ~MOUSE_LEFT;
}