LoginSignup
2
2

More than 3 years have passed since last update.

ビットマップからナインスライスMCを生成.jsfl

Last updated at Posted at 2012-12-26

FlashProのライブラリ上の画像を使ってナインスライスMCを生成するJSFLです。

ビットマップ画像を使用したナインスライスMCは、画像をあらかじめスライスしておかないと正しく伸縮しません。また、画像の境界に正確にスライスガイドを設置しないと伸縮に失敗します。
このJSFLを使用すれば、手動でスライスガイドを設置する必要がなくなります。

/**
* ドロップシャドウなど、矩形の周囲を覆うナインスライスクリップを生成するjsfl
*
* 使用方法  ライブラリでビットマップなどのオブジェクトを8もしくは9個選択してコマンドを実行する。
*       8つ指定した場合は中央の画像が無い状態のMCが作成される。
*
* 注意点     1.原点は中央の画像の左上に固定されています。
*        変更したい場合は文中のコメントに従ってオフセット処理を追加するか、Flash Pro上で画像とスライスガイドを移動してください。
*       2.画像はライブラリ名順に配置されます。予め画像のライブラリ名の末尾に連番を割り当ててください。
*
* @since 2009.09.24
*/

var doc;
var lib;

main();

function main()
{
    var doc = fl.getDocumentDOM();
    if(doc){

        lib = doc.library;// ライブラリ
        var selItems = lib.getSelectedItems();  // 選択中のアイテム
        var num = selItems.length;  // アイテム数

        if(num != 9 && num != 8){
            alert("ライブラリのアイテムを選択してください");
            return; 
        }

        var clipName = prompt("MovieClipの名前を指定してください", "SliceClip_mc");

        if( !clipName ){
            alert("処理を中断します");
            return;
        }

        //MCの生成---------------------
        var isCreated = lib.addNewItem("movie clip" , clipName );
        if(!isCreated){ return; }

        //配列の再編成---------------------
        var center;         //中央のビットマップ
        var arounds = [];       //周囲のビットマップライブラリアイテム

        if( num == 8 ){
            arounds = selItems;
        } 
        else if ( num == 9 ){
            center = selItems[5];
            selItems.splice( 5, 1 );
            arounds = selItems;
        }

        //ライブラリ名順にソート
        arounds = arounds.sort( function(a, b) { return (a.name > b.name)? 1:-1 } );

        //MCの編集開始---------------------

        lib.selectItem( clipName );
        lib.editItem();

        var aroundObj = []; //配置されたアイテム

        var n = arounds.length;
        for ( var i =0; i < n; i++ ){
            lib.selectItem(arounds[i].name);
            lib.addItemToDocument( {x:0, y:0} ) ;
            doc.mouseClick({x:0, y:0}, false, true);
            aroundObj.push(doc.selection[0]);
            doc.selectNone();           
        }

        aroundObj[0].x = -aroundObj[0].width;
        aroundObj[0].y = -aroundObj[0].height;

        aroundObj[1].x = 0;
        aroundObj[1].y = -aroundObj[1].height;

        aroundObj[2].x = aroundObj[1].width;
        aroundObj[2].y = -aroundObj[2].height;

        aroundObj[3].x = -aroundObj[3].width;
        aroundObj[3].y = 0;

        aroundObj[4].x = aroundObj[1].width;
        aroundObj[4].y = 0;

        aroundObj[5].x = -aroundObj[5].width;
        aroundObj[5].y = aroundObj[3].height;

        aroundObj[6].x = 0;
        aroundObj[6].y = aroundObj[3].height;

        aroundObj[7].x = aroundObj[1].width;
        aroundObj[7].y = aroundObj[3].height;

        if( center )
        {
            lib.selectItem(center.name);
            lib.addItemToDocument( {x:0, y:0} ) ;
            doc.mouseClick({x:0, y:0}, false, true);
            doc.selection[0].x =0;
            doc.selection[0].y =0;
            doc.selectNone();
        }

        //配置をオフセットしたい場合はここに処理を追加してください。
        //
        /*
        doc.selectAll();
        */

        //ナインスライスの矩形を指定---------------
        lib.selectItem( clipName );
        lib.setItemProperty ("scalingGrid" , true);
        lib.setItemProperty ("scalingGridRect",
            {
                left:aroundObj[1].x, 
                top:aroundObj[3].y,
                right:aroundObj[1].x + aroundObj[1].width,
                bottom:aroundObj[3].y + aroundObj[3].height
            }
        );
    }
}
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2