Posted at

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();