How to use CannonML ?

by keim_at_Si
CannonML の基本的な使用法です。CMLObjectの継承クラスで敵や弾を作成することでCannonML script で動作するオブジェクトを作成することができます。
CannonML: http://www.libspark.org/wiki/keim/cannonML
♥4 | Line 90 | Modified 2011-08-10 01:24:48 | MIT License
play

ActionScript3 source code

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

package {
    import flash.events.*;
    import flash.display.*;
    import org.si.cml.*;
    
    
    // Simple example for the usage of cannonML
    //--------------------------------------------------
    public class CMLObjectSample extends Sprite {
    //-------------------------------------------------- stage CML 
        // CML は 砲台の動作を表現します.
        // CML text represents cannon behaviour
        public var stageCML:String = "py-160[px$??*100n{{[rw]}vy$?*10+2i40v~bm$i?(5)+2,45f5vd-10}w30]";
        
        
        
        
    //-------------------------------------------------- constructor
        function CMLObjectSample()
        {
            addEventListener(Event.ADDED_TO_STAGE, _setup);
        }
        
        
        
        
    //-------------------------------------------------- setup
        private function _setup(e:Event) : void
        {
            removeEventListener(Event.ADDED_TO_STAGE, _setup);
            
            // draw field
            field = new Sprite();
            field.x = 120;
            field.y = 160;
            field.graphics.lineStyle(1, 0);
            field.graphics.drawRect(-120, -160, 240, 320);
            addChild(field);
            
            
            // (1)
            // 初期化のために CMLObject.initialize() を最初に呼び出します.
            // call CMLObject.initialize() as first setup
            CMLObject.initialize(true);
            
            
            // (2)
            // CMLSequence は,砲台の挙動を表現します
            // cannonML 文字列 か bulletML XML をコンストラクタに渡してください.
            // CMLSequence represents sequence of cannon behaiviors.
            // pass cannonML text or bulletML xml to the constructor.
            var stageSequence:CMLSequence = new CMLSequence(stageCML);

            
            // (3)
            // ステージシーケンスを実行するための stageCannon を生成します
            // create stageCannon to execute stage sequence
            var stageCannon:Cannon = new Cannon(0);
            
            
            // (4)
            // CMLObject.create() は CMLObject を CML ステージ上に生成します.
            // 引数で,x, y 座標値を指定します.
            // CMLObject.create() creates CMLObject in the CML stage.
            // the arguments specify x and y coordinate.
            stageCannon.create(0, -160);
            
            
            // (5)            
            // CMLObject.execute() は CMLSequence を CMLObject に実行させます.
            // また,この関数は CMLFiber (thread に相当) を返値としてかえします.
            // CMLFiber を用いて,実行状態をコントロールしたり,様々な値にアクセスしたりできます. 
            // CMLObject.execute() executes CMLSequence with CMLObject.
            // And it returns CMLFiber that represents thread executor.
            // you can control execution and access any parameters by CMLFiber.
            var stageFiber:CMLFiber = stageCannon.execute(stageSequence);
            
            
            // frame handler
            addEventListener(Event.ENTER_FRAME, _draw);
        }
        
        
    //-------------------------------------------------- ENTER_FRAME event handler
        private function _draw(e:Event) : void
        {
            // (6)
            // CMLObject.update() を各フレームで呼び出します.
            // call CMLObject.update() in each frames
            CMLObject.update();
        }
    }
}




import flash.display.*;
import org.si.cml.*;


// cannons field
var field:Sprite;




// (0)
// CMLObject の継承クラスで,5個のコールバック関数をオーバーライドします.
// Define class extension of CMLObject, and override 5 callback functions.
class Cannon extends CMLObject {
    // constructor
    function Cannon(radius:Number) 
    {
        createNewCannonShape(radius);
    }
    
    
    // onCreate は,このオブジェクトが CML ステージ上に生成されたときに呼び出されます.
    // CMLObject.create() か,"n/f" CMLコマンド実行時に内部から呼び出されます.
    // "n/f" CMLコマンド時は,onNewObject/onFireObject で返した CMLObject の create() が内部で呼び出されています.
    // onCreate is called when this object is created.
    // This function is called from system when CMLObject.create() or "n" or "f" command in CML.
    // When called from "n" or "f" command, the system calls create() of CMLObject that is returned from onNewObject/onFireObject.
    override public function onCreate() : void
    {
        // フィールドに cannonShape を追加
        // add cannonShape to the field
        field.addChild(cannonShape);
        
        // cannonShape の位置と回転方向を更新
        // update position and angle of cannonShape
        cannonShape.x = this.x;
        cannonShape.y = this.y;
        cannonShape.rotation = this.angle;
    }
    
    
    // onDestroy は,このオブジェクトが CML ステージ上から消えたときに呼び出されます.
    // この関数は,CMLObject.destroy() が呼ばれた際に呼び出されます.
    // より正確には,CMLObject.destroy() により破壊フラグがセットされ,
    // 全てのオブジェクトの update が終了後,破壊フラグがチェックされて,その際に onDestroy が呼び出されます.
    // onDestroy is called when this object is destroyed (or escaped)
    // This function is called from system when CMLObject.destroy().
    // To be exact, the CMLObject.destroy() sets destruction flag, 
    // and after all updates, flags are checked and system calls all onDestroys.
    override public function onDestroy() : void
    {
        // CMLObject.destructionStatus で destory() 呼び出しの際に引数で指定した値を参照できます.
        // CMLObject.destructionStatus refers the number that is specifyed by your CMLObject.destory() call.
        if (this.destructionStatus == 1) {
            // 通常,destructionStatus == 0 でステージから逃避,1 でプレイヤーによる破壊を示します.
            // Usually,destructionStatus == 0 means escape from stage, and 1 means destruction by player.
            createExplosion();
        }
        field.removeChild(cannonShape);
    }
    
    
    // onUpdate は,各 CMLObject.update() 呼び出し時に呼び出されます.
    // onUpdate is called in each CMLObject.update().
    override public function onUpdate() : void
    {
        // cannonShape の位置と回転方向を更新
        // CMLObject の x, y, angle プロパティは,そのCMLObjectの現在の座標と回転方向です.
        // update position and angle of cannonShape
        // the properties of CMLObject "x", "y"and "angle" represents coordinate and rotation.
        cannonShape.x = this.x;
        cannonShape.y = this.y;
        cannonShape.rotation = this.angle;
        
        // ステージからいなくなったら,destructionStatus = 0 で destroy() 呼び出し
        // destroy() with destructionStatus of 0, when the object escape from the stage
        if (this.x<-140 || this.x>140 || this.y<-180 || this.y>180) this.destroy(0);
    }
    
    
    // onNewObject は,"n" CMLコマンド実行時に呼び出されます.新たな CMLObject を返す必要があります.
    // 返した新たな CMLObject は,適切な初期化を施され内部で create()/(必要なら)execute() されます.
    // onNewObject is called by "n" command in CML, and it should return new CMLObject.
    // The returned CMLObject is initialized and system calls create() and execute()(if necessary).
    override public function onNewObject(args:Array) : CMLObject
    {
        // return new Cannon
        return new Cannon(8);
    }
    
    
    // onFireObject は,"f" CMLコマンド実行時に呼び出されます.新たな CMLObject を返す必要があります.
    // 返した新たな CMLObject は,適切な初期化を施され,内部で create()/(必要なら)execute() されます.
    // onFireObject is called by "f" command in CML, and it should return new CMLObject.
    // The returned CMLObject is initialized and system calls create() and execute()(if necessary).
    override public function onFireObject(args:Array) : CMLObject
    {
        // return new Cannon
        return new Cannon(4);
    }
    
    
    // shape
    private var cannonShape:Shape;
    
    
    // create new cannon shape
    private function createNewCannonShape(radius:Number) : void
    {
        var graphics:Graphics;
        cannonShape = new Shape();
        graphics = cannonShape.graphics;
        if (radius > 0) {
            graphics.lineStyle(2, 0x404080);
            if (radius > 6) {
                graphics.moveTo(0, 0);
                graphics.lineTo(radius+4, 0);
            }
            graphics.beginFill(0xc0c0f0);
            graphics.drawCircle(0, 0, radius);
            graphics.endFill();
        }
    }
    
    
    // create explosion
    private function createExplosion() : void
    {
    }
}

Forked