丸を操作できるよ-1

by hashito
♥0 | Line 109 | Modified 2011-06-18 23:43:41 | MIT License
play

ActionScript3 source code

/**
 * Copyright hashito ( http://wonderfl.net/user/hashito )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/vMva
 */

// forked from hashito's 文字集まる修正
// MainStage
package {
    import flash.display.Sprite;
    [SWF(frameRate=60,width=456,height=456)]
    public class MainStage extends Sprite {
        public function MainStage(){
            addChild(new Main());
        }
    }
}

import flash.display.*;
import flash.filters.BlurFilter;
import flash.geom.Point;
import flash.geom.ColorTransform;
import flash.geom.*;
import flash.events.*;
import flash.utils.Timer;
import flash.text.TextField;
import flash.text.TextFormat;
import net.hires.debug.Stats;
// debug
class debug{public static var out:TextField=new TextField();}

/*t.hashito*/
// もう疲れた!

class MF{
    public static function AFFORD (x:Number,aim:Number,a:Number):Boolean{return (x<=(a+aim))&&(x>=(a-aim));}
    public static function RAN (n:Number=1):Number{return (Math.random()*n);}
    public static function ISPM (n:Number):Number{if(n<0){return -1;}else if(n>0){return 1;}return 0;}
    public static function MAX (n:Number,max:Number):Number{return (n>max)?max:n;}
    public static function MIN (n:Number,min:Number):Number{return (n<min)?min:n;}
    public static function LIMIT (n:Number,max:Number,min:Number):Number{if(n>max){return max;}else if(n<min){return min;}else{return n};}
    public static function RAD_ANG(n:Number):Number{return n*180/Math.PI;}
    public static function ANG_RAD(n:Number):Number{return n*Math.PI/180;}
    public static function ONE_SHOT_ON(n:Boolean,o:Boolean):Boolean{return n && (!o); }
    public static function ONE_SHOT_OFF(n:Boolean,o:Boolean):Boolean{return (!n) && o; }
    public static function LATCH(v:Boolean,s:Boolean,r:Boolean):Boolean{if(s)v=true;if(r)v=false;return v;}
    public static function DOT2(x1:Number,y1:Number,x2:Number,y2:Number):Number{return x1 * x2 + y1 * y2; }//内積
    public static function SLOPE(x1:Number,y1:Number,x2:Number,y2:Number):Number{return (y1-y2)/(x1-x2) }//傾き(無限の可能性あり)
    public static function DISTANCE(x1:Number,y1:Number,x2:Number,y2:Number):Number{var a:Number=(x2-x1);var b:Number=(y2-y1);return Math.sqrt(a*a+b*b);}//距離
}

class Main extends Sprite{
    public const H:Number = 456;
    public const W:Number = 456;
    public const BAL_W_MAX :Number = 15;
    public const BAL_H_MAX :Number = H/(BAL_W*2)-5;
    public const BAL_W     :Number = (W/BAL_W_MAX)/2;
    public const BAL_IX:Number = W/2;
    public const BAL_IY:Number = H - BAL_W;
    public const BAL_OFFSET:Number = Math.sqrt((BAL_W*BAL_W)/2);
    public var n:Object={x:0,y:0,nx:0,ny:0,ax:0,ay:0,tou:false,otou:false};
    
    public var BAL_COLOR_S :Array  = [0x00ff00,0xccff00,0xcc00cc,0x5500ff,0x555500];
    
    public var kal:Boolean = false;
    public var kar:Boolean = false;
    public var kau:Boolean = false;
    public var ksp:Boolean = false;
    
    public var tx:TextField=new TextField();
    public var bb:Bitmap,pen:Shape,canvas:Sprite;
    
    // constructor
    public function Main() {addEventListener(Event.ADDED_TO_STAGE, init);}
    
    public function msg(s:String):void{
        tx.text = s;
        tx.x = W/2-tx.textWidth  / 2;
        tx.y = H/2-tx.textHeight / 2;
    }
    // init
    public function init(e:*):void{
        // debug
        // debug.out.autoSize=flash.text.TextFieldAutoSize.LEFT;
        // addChild(debug.out);
        pen=new Shape();
        canvas=new Sprite();
        canvas.addChild(pen);
        bb = new Bitmap(new BitmapData(W,H,false,0xffffff));
        pen.graphics.beginFill(0);
        pen.graphics.drawCircle(0,0,3);
        addChild(bb);
        addChild(canvas);
        
        
        // msg init
        tx.autoSize   = flash.text.TextFieldAutoSize.CENTER;
        tx.selectable = false;
        addChild(tx);
        
        addEventListener(Event.ENTER_FRAME ,ef);
        stage.addEventListener(KeyboardEvent.KEY_DOWN ,key);
        stage.addEventListener(KeyboardEvent.KEY_UP   ,key);
       //stage.addEventListener(MouseEvent.MOUSE_DOWN ,modechg);
        
        n.x=W/2;
        n.y=H;
    }
    public function key(e:KeyboardEvent=null):void{
        if (e.keyCode == 37) { kal = ( e.type == KeyboardEvent.KEY_DOWN ); }// left
        if (e.keyCode == 38) { kau = ( e.type == KeyboardEvent.KEY_DOWN ); }// up
        if (e.keyCode == 39) { kar = ( e.type == KeyboardEvent.KEY_DOWN ); }// right
        if (e.keyCode == 32) { ksp = ( e.type == KeyboardEvent.KEY_DOWN ); }// space
    }

    public function ef(e:Event=null):void{
        
        // goto文の代わりに while to break
        while(1){
             // ~~~~前処理~~~~~
             n.otou = n.tou;       // 地面判定前回値保存
             n.tou = (n.y >= H);   // めり込み確認
             if(n.tou){n.y = H;}   // めり込み修正
             
             // ~~~~演算~~~~~
             if(kal){n.nx -= 0.1;}// left
             if(kar){n.nx += 0.1;}// right
             if(MF.ONE_SHOT_OFF(n.tou,n.otou)){n.ay += 0.9/25;}// gravity
             
             if(n.tou && n.ny > 0){n.ny=0;}// 床についていてマイナス方向に速度があるとき0
             if(n.tou && n.ay > 0){n.ay=0;}// 床についていてマイナス方向に加速度があるとき0
             if(kau && n.tou){n.ny -= 2.0;}// up
             
             if(n.tou && n.nx != 0){n.nx*=0.85;}// 床の摩擦による減速
             
             if(  1 < n.nx ){n.nx = 1;}// right速度制限
             if( -1 > n.nx ){n.nx =-1;}// left速度制限
             
             // ~~~~移動~~~~~
             n.nx += n.ax;
             n.ny += n.ay;
             n.x  += n.nx;
             n.y  += n.ny;
             
             pen.x = n.x;
             pen.y = n.y;
             // ~~~~描画~~~~~
             bb.bitmapData.fillRect(new Rectangle(0, 0, W, H), 0xffffff);
             bb.bitmapData.draw(canvas);
             break;
        }
    }
}