下面是附加元件 Noise 的使用例。套用 ACQUIRE 遊戲的音效,算是湊個 theme 吧。
※播放中覺得吵是正常的,因為真的有點吵……
這份設定檔也放在 noise_theme_acquire_rdf.7z (DivShare)——僅 RDF,不分享聲音檔。
索引
下面是附加元件 Noise 的使用例。套用 ACQUIRE 遊戲的音效,算是湊個 theme 吧。
※播放中覺得吵是正常的,因為真的有點吵……
這份設定檔也放在 noise_theme_acquire_rdf.7z (DivShare)——僅 RDF,不分享聲音檔。
功能類似 Extension List Dumper 和 ListZilla 兩個套件,把附加元件清單匯出成檔案。
輸出格式可用樣板(是我參考 Ext JS 寫的陽春版)方式調整,但要改原始碼、比較麻煩就是了。
Bookmarklet 在這裡 → 匯出附加元件列表(僅支援 Firefox 3 系列)
為了調整輸出格式,需要修改原始碼;可自製幾支不同的樣板,存成不同的 bookmarklet 備用(不會壓製 bookmarklet 的話可參考前文)。原始碼附在文末,重要部分如下:
樣板由 template_prefix、template_item、template_suffix 組成,輸出時會把頭(_prefix)接上一連串的項目(_item)再接上尾(_suffix)。
樣板字串中 ${foo} 型式的元素,會被代換成實際值,例如 ${name} 會變成套件名稱。
※要注意的是 _prefix、_suffix 和 _item 能用的 ${foo} 不同。預設 _prefix、_suffix 專用的是 ${date} 和 ${total},其他則是 _item 專用。
清單資料會儲存在 data 陣列裡面,要過濾的話得在 data = data.filter(function(item, idx, arr){ 內處理。例如 return item['hidden']!='true'; 會把隱藏的項目拿掉。
樣板字串可以用 ${foo:helper} 這樣的元素來修改資料,例如 ${isDisabled:isTrue( 「已停用」,)} 會在套件停用時顯示「已停用」。
相應原始碼在 var helpers = { 裡面有幾個函數,傳回值就是要輸出的字串。
template_item 可用的函數,基本型為: 函數名稱 : function( item, value[, 參數1, 參數2, …] ){}
${foo:helper} 之中 foo 的實際值,例如 ${name:helper} 傳回的是套件名稱。 ${foo:helper(參數1,參數2)} 型式傳進來的。 var leqExtDumper = {
dump: function(){
if(typeof(gExtensionsView)=='undefined') return(alert('出了點狀況,無法繼續;\n\n請在 Firefox 3 的\nchrome://mozapps/content/extensions/extensions.xul\n執行這支 bookmarklet.'));
var txt = '';
var data = [];
// 樣板
var template_prefix = '附加元件列表 (${total}) - ${date}\n<ul>';
var template_item = '<li>\n'
+ '${homepageURL:addLink} - ${version} - <small>${optionsURL}</small>'
+ '${isDisabled:isTrue( (已停用),)} ${compatible:isFalse( (與應用程式不相容),)}'
+ '<br />\n'
+ '適用於: Firefox ${min} - ${max}\n'
+ '<p>${description}</p>\n'
+ '</li>\n';
var template_suffix = '</ul>';
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
var charset = "UTF-8";
var os = Components.classes["@mozilla.org/intl/converter-output-stream;1"].createInstance(Components.interfaces.nsIConverterOutputStream);
var fos = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
fp.init(window, null, fp.modeSave);
fp.defaultExtension='txt';
fp.defaultString='附加元件列表';
fp.appendFilters(fp.filterText | fp.filterHTML);
gExtensionsView.children.forEach(
function(i){
var item = gExtensionManager.getItemForID(getIDFromResourceURI(i.getAttribute('id')));
data.push({
name : i.getAttribute('name'), // 套件名稱
id : i.getAttribute('id'), // 套件 id
min : item ? item.minAppVersion : '', // 支援的最低 Firefox 版本
max : item ? item.maxAppVersion : '', // 支援的最高 Firefox 版本
iconURL : i.getAttribute('iconURL'), // 套件的圖示位址
version : i.getAttribute('version'), // 套件版本
description : i.getAttribute('description'), // 套件的敘述
homepageURL : i.getAttribute('homepageURL'), // 套件首頁
optionsURL : i.getAttribute('optionsURL'), // 套件的選項位址
hidden : i.getAttribute('hidden'), // 是否為隱藏套件
isDisabled : i.getAttribute('isDisabled'), // 是否已停用
compatible : i.getAttribute('compatible') // 是否與目前 Firefox 版本相容
});
}, this
);
// 過濾不要列出的項目 (return false 的資料會被排除)
data = data.filter(function(item, idx, arr){
return item['hidden']!='true';
});
var helpers = {
isTrue : function(item, value, strTrue, strFalse){
return value=='true' ? strTrue : strFalse;
},
isFalse : function(item, value, strTrue, strFalse){
return value=='false' ? strTrue : strFalse;
},
addLink : function(item, value){
return value=='' ? item['name'] : '<a href="' + value + '">' + item['name'] + '</a>';
},
// 以下僅適用於 template_prefix 與 template_suffix
date : function(){
return (new Date()).toLocaleString();
},
total : function(){
return data.length;
}
};
// template_prefix
// 取代 ${key} 形式的字串
txt = template_prefix.replace( /\$\{([\w-]+)\}/g, function(m, key){ return helpers[key].apply(this); } );
data.forEach(
function(i){
// template_item
// 取代 ${key:format(args)} 形式的字串 - 參考自 Ext.Template library - http://www.extjs.com
txt += template_item.replace( /\$\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, function(m, key, format, args){
if(format){
args = [i, i[key]].concat(args.split(','));
return helpers[format].apply(this, args);
}
else {
return i[key] !== undefined ? i[key] : "";
}
});
}, this
);
// template_suffix
txt += template_suffix.replace( /\$\{([\w-]+)\}/g, function(m, key){ return helpers[key].apply(this); } );
if(!confirm('請選擇匯出檔案的位置:')) return;
if (fp.show() != fp.returnCancel) {
if (fp.file.exists()) fp.file.remove(true);
fos.init(fp.file, 0x02 | 0x08 | 0x20, 0666, 0);
os.init(fos, charset, 0, 0x0000);
os.writeString(txt);
os.close();
fos.close();
alert('資料已匯出至 ' + fp.file.path);
}
}
};
leqExtDumper.dump();
天誅4炸完日本要去炸歐美了,這篇是 1UP.com 訪談摘要,只節錄我自己想留的部分,旨在記錄,不按原文。受訪對象是 ACQUIRE 遠藤琢磨和金山圭輔……哀哉,我心目中的英雄,做出這樣的遊戲也只能窩囊啊。
訪談原文:Tenchu: Shadow Assassins Preview for the Wii from 1UP.com
對天誅4內容的說法跟先前宣傳差不多——自由度跟親和力,就是這次做不好的東西啊!
「製作跟說的方向不符」其實侍道3也有相同狀況……很荒唐的問題。
本來想把今年寫過的網頁都列出來,不過成果有點糟,所以還是自律了……刪一刪剩下1個,桃園縣的「認識世界遊戲網站」,內容大致就是把教材放上網,讓小朋友多一個地方可逛。
我從企劃開始投入,參考學校教材(有課程和繪本配合)擬網站架構,然後就做 PHP, CSS 等,除了設計、美工和 Flash、小遊戲以外的東西。
原本是夢想外國小朋友也能使用這個網站,交流含有在地文化的小遊戲(遊戲先由我們供應)之類;不過沒來得及規劃、敘述清楚,就變成「小遊戲」網站了——倒也落得明確。
程式部分有六成以上時間都花在遷就 ie(要是不用管它,收費真的可以打折),像半透明 PNG 的 hack 就跟別的功能衝到,換了幾支現成 script 卻怎麼搭都爆掉,最後認命重寫才解決;悶的是,原因還是沒搞清楚。
還是瀏覽器。網站後來有個展示會,我建議別用 ie,這時校長(案子是由小學教學團隊指導的)便爽快地指示「那個很熱門叫 Firefox 什麼的,到時候所有電腦先灌好它」—— 雖然最後只有當天有換,但領導的英明還是令我印象深刻。
再來好像就沒什麼特別的,歷經幾次修改,就變成現在的樣子,也上線一段時間了。希望別讓使用者委屈憤怒才好,曾看到小朋友留言「我覺好爛」特別逗趣,哈哈哈,(網站)是我寫的啊!
如果對網站有意見,又怕留言在那邊嚇到小朋友,不妨直接告訴我,給點檢討的機會。
製作 bookmarklet 有個問題是,怎麼把寫好的 JavaScript 縮成一行?這方面網路上有個 Bookmarklet Builder 看來不錯,像是將「%20」轉成空白這樣的功能也有準備。
而我目前的作法,是拷貝 PSPad 的擴充 script PSPadJSMin 並稍作修改(原本是用來壓縮 JavaScript 的),以後在 PSPad 下就可以「寫 JavaScript → 按熱鍵壓成 bookmarklet → 複製、貼上網址列測試」——也還算方便。
因為只有小改,故不好意思提供下載,僅列改法:
function JSMin() 改名為 function JSMinBookmarklet() function jsmin(input, level) 底部的: return ret; return 'javascript:(function(){' + ret.replace(/\n/g,'').replace(/([\s\"])/g, function(s,p){return encodeURI(p);}) + '})();'; javascript:(function(){高濃縮原始碼})(); 的樣子。 function Init() 內部的: addMenuItem("JSMin", "", "JSMin", "Ctrl+Shift+J"); addMenuItem("bookmarklet", "", "JSMinBookmarklet", "Ctrl+Alt+B");