Help us understand the problem. What is going on with this article?

Starling用テクスチャアトラスのXMLを出力するJSF

More than 5 years have passed since last update.

これは、Fireworksで選択中のスライスを元に、Starling用テクスチャアトラスのXMLを出力するFireworksのJSFです。
個人用途で作成したのですが、バックアップも兼ねてアップいたします。

テクスチャ(画像)は、別途書き出しする必要があります。
書き出すXMLのファイル名、ディレクトリは元のFireworksPNGと同じになります。
※ファイル名の『.fw』は自動で除去するようになっています。

【使い方】

  1. テクスチャアトラスとして書き出したいサイズや位置でスライスを切る。
  2. 各スライスにテクスチャ名をふっておく。
  3. XMLに書き出したいスライスをすべて選択する。
  4. JSFを実行する。
outputStarlingXML.jsf
function execute(){
    var dom = fw.getDocumentDOM();

    var sliceArray = [];
    sliceArray = getSliceObject(fw.selection);

    var docname = dom.filePathForRevert;
    var fileDir = Files.getDirectory(docname);
    var imagName = Files.getFilename(docname);
    imagName = imagName.replace(/¥.fw/,'');
    var xmlName = imagName.slice(imagName.indexOf('/')+1, imagName.lastIndexOf('.'))+".xml";

    var _outputFilePath = fileDir+"/"+xmlName;
    var _xmlText = getSpriteText(imagName,sliceArray);

    var fileForSave = confirm("XMLファイルを保存します。よろしいですか?");
    if (fileForSave){
        if(saveXMLFile(_outputFilePath,_xmlText)){
            //alert("ファイルの保存が完了しました。");
        }else{
            alert("ファイルの保存に失敗しました。");
        }
    }else{
        //alert("キャンセルしました。");
    }
}

//////////////////////////////////////////////////
function getSliceObject($v) {
    var array = [];
    var length = $v.length;
    for (var i=0;i<length;i++){
        if($v[i] == "[object SliceHotspot]"){
            array[i] = {};
            array[i].name = $v[i].baseName;
            array[i].x = $v[i].left;
            array[i].y = $v[i].top;
            array[i].width = $v[i].width;
            array[i].height = $v[i].height;
        }
    }
    array.sort(
        function(a,b){
        var aName = a["name"];
        var bName = b["name"];
        if( aName < bName ) return -1;
        if( aName > bName ) return 1;
        return 0;
        }
    );
    return array;
}

function getSpriteText($imagePath,$v) {
    var str = '';
    var length = $v.length;
    str += '<?xml version="1.0" encoding="UTF-8"?>\n<TextureAtlas imagePath="'+$imagePath+'">\n'
    for (var i=0;i<length;i++) {
        str += '\t<SubTexture name="'+$v[i].name+'" x="'+$v[i].x+'" y="'+$v[i].y+'" width="'+$v[i].width+'" height="'+$v[i].height+'"/>\n';
    }
    str += '</TextureAtlas>'

    return str;
}

function saveXMLFile($path,$value){
    if (writeFile()){
        return true;
    }else{
        var fileForSave = confirm("同名のファイルが存在します。上書きしてもよろしいですか?");
        if (fileForSave){
            if (Files.deleteFileIfExisting($path)){
                if (writeFile()){
                    return true;
                }else{
                    //alert("ファイルの保存に失敗しました。");
                }
            }
        }else{
            //alert("キャンセルしました。");
        }
    }

    function writeFile(){
        if(Files.createFile($path,".xml","")){
            var fileReference = Files.open($path,true);
            if (fileReference){
                fileReference.writeUTF8($value);
                fileReference.close();
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }
    }
}
//////////////////////////////////////////////////

this.execute();
necogane
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away