希德船长 - 2006/11/30 13:10:00
这次长眠了好几个月。。。。。。
长眠的原因以后再说,先把最近的成果拿出来让大家鉴定一下。
kirikiri2用的多字幕热键切换插件,以及插件的应用实例,标准日本语 初级 上 第一课。
该插件在简体中文版WinXP下用Unicode编写,在日文版kirikiri2及Unicode编码的KAG3下调试通过。用AppLocale引导2.24版的krkrrel打包成exe后,在简体中文版WinXP和简体中文版Win2003下不使用AppLocale测试通过。
貌似论坛的上传功能不能用了,Mofile传不上去,系统忙。
我把东西放到了邮箱里
http://cn.mail.yahoo.com/?id=78001
用户名:xide_krkr2
密码:krkrkrkr
插件和脚本我直接贴在楼下了。
--------------------------------
差点忘了,切换热键是数字键(1-9代表message0-8)和PageUp(上一个)和PageDown(下一个)和Home(主字幕,即message0)
在脚本中,主字幕层还用老格式编写,其他的8个字幕层用插件控制。
希德船长 - 2006/11/30 13:14:00
直接贴代码影响帖子的阅读效果,还是把它包起来吧
[wrap=multi-message.ks 点我察看]
@if exp="typeof(global.multimessage_object) == 'undefined'"
@iscript
// 多重字幕输出指令用的Tag缓冲器
class TagBuffer
{
var owner;
var window;
var id; // 字幕序号
var fore, back; // 表/里字幕图层的引用
var forebreakglyph, backbreakglyph; // 换行/换页等待记号
var tagarray = []; // 存放本次输出的所有Tag的数组
var nexttagnum; // 将要执行的Tag的序号
var handlers; // 存放Tag处理函数的字典数组
function TagBuffer(owner, id)
{
// 构造函数
this.owner = owner;
this.id = id;
window = owner.window;
fore = window.fore.messages[id];
back = window.back.messages[id];
forebreakglyph = new ClickGlyphLayer(window, window.fore.base);
forebreakglyph.name = "换行/换页等待记号";
backbreakglyph = new ClickGlyphLayer(window, window.fore.base);
backbreakglyph.name = "换行/换页等待记号";
handlers = getHandlers();
}
function finalize()
{
// 资源释放
clear();
owner = void;
window = void;
fore = void;
back = void;
invalidate forebreakglyph;
invalidate backbreakglyph;
invalidate tagarray;
invalidate handlers;
}
function clear()
{
// 清除缓冲器中的内容
for(var i = 0; i < tagarray.count; i++)
invalidate tagarray;
tagarray.clear();
nexttagnum = 0;
}
function loadTags(strtags)
{
//载入输出指令
clear(); // 清除缓冲器中原有的内容
var p = 0;
var length = strtags.length;
var tagtemp;
var tagstart;
var taglength;
while(p < length)
{
tagtemp = void;
if(strtags[p] == '[')
{
tagstart = p;
taglength = 0;
while(p < length && strtags[p] != ']')
{
p++;
taglength++;
}
p++;
taglength++;
tagtemp = string2TagDictionary(strtags.substr(tagstart, taglength));
}
else
{
tagtemp = new Dictionary();
tagtemp["tagname"] = "ch";
tagtemp["text"] = strtags[p];
p++;
}
if(tagtemp !== void)
tagarray.add(tagtemp);
}
}
function string2TagDictionary(strtag)
{
// 将字符串转换为符合Tag格式的字典数组形式的对象
if(strtag[0] == '[')
strtag = strtag.substr(1);
if(strtag[strtag.length-1] == ']')
strtag = strtag.substr(0, strtag.length-1);
// 去掉两端的 '[' 和 ']'
var tagarr = [];
tagarr.split(' ', strtag, void, true);
var tag = %[];
var tagnodearr = [];
for(var i = 0; i < tagarr.count; i++)
{
tagnodearr.split('=', tagarr, void, true);
if(tagnodearr.count == 1)
tag["tagname"] = tagnodearr[0];
else if(tagnodearr.count == 2)
tag[tagnodearr[0]] = tagnodearr[1];
}
return tag;
}
function handleTag()
{
// 处理1个Tag,如果所有Tag都处理完了则返回false,否则返回true
var tag, handler;
if(tagarray.count > nexttagnum)
{
tag = tagarray[nexttagnum];
handler = handlers[tag.tagname];
if(handler !== void)
handler(tag);
else
Debug.message("一个名为“" + tag.tagname + "”的Tag因不在本插件的处理范围内而被忽略。");
nexttagnum++;
return true;
}
return false;
}
function getHandlers()
{
return %[ // 字典数组对象
/*
tagHandlers群是指名字和对应的函数组成的“名称-函数组”的序列。其格式为:
函数名 : function(elm)
{
// 函数体
} incontextof this,
但是,如果函数名同时也是关键字的话,就必须把「函数名 : 」换成
「"函数名" => 」。
incontextof this 的作用是把函数关联到其所在的类上。
*/
//--------------------------------------- タグハンドラ群(メッセージ操作) --
ch : function(elm)
{
// 文字表示
forebreakglyph.visible = false;
backbreakglyph.visible = false;
fore.processCh(elm.text);
back.processCh(elm.text);
} incontextof this,
graph : function(elm)
{
// グラフィックを文字として表示
forebreakglyph.visible = false;
backbreakglyph.visible = false;
fore.processGraph(elm);
back.processGraph(elm);
} incontextof this,
hch : function(elm)
{
// 縦中横
forebreakglyph.visible = false;
backbreakglyph.visible = false;
var expand = elm.expand !== void && +elm.expand;
fore.putHorizonCh(elm.text, expand);
back.putHorizonCh(elm.text, expand);
} incontextof this,
r : function(elm)
{
// 改行
//forebreakglyph.visible = false;
//backbreakglyph.visible = false;
fore.processReturn();
back.processReturn();
} incontextof this,
ruby : function(elm)
{
// 设置下一个文字对应的标注读音用的“振假名”
fore.setRuby(elm.text);
back.setRuby(elm.text);
} incontextof this,
font : function(elm)
{
// 设置字体风格风格
fore.setFont(elm);
back.setFont(elm);
} incontextof this,
deffont : function(elm)
{
// 设置默认字体风格
fore.setDefaultFont(elm);
back.setDefaultFont(elm);
} incontextof this,
resetfont : function(elm)
{
// 重置字体风格
fore.resetFont();
back.resetFont();
} incontextof this,
style : function(elm)
{
// 设置字幕显示风格
fore.setStyle(elm);
back.setStyle(elm);
} incontextof this,
defstyle : function(elm)
{
// 设置字幕显示默认风格
fore.setDefaultStyle(elm);
back.setDefaultStyle(elm);
} incontextof this,
resetstyle : function(elm)
{
// 重置字幕显示风格
fore.resetStyle();
back.resetStyle();
} incontextof this,
link : function(elm)
{
// 跳转选项开始
fore.beginHyperLink(elm);
back.beginHyperLink(elm);
} incontextof this,
endlink : function(elm)
{
// 跳转选项结束
fore.endHyperLink(elm);
back.endHyperLink(elm);
} incontextof this,
button : function(elm)
{
// 生成一个按钮
forebreakglyph.visible = false;
backbreakglyph.visible = false;
fore.addButton(elm);
back.addButton(elm);
} incontextof this,
edit : function(elm)
{
// 生成一个单行编辑框
forebreakglyph.visible = false;
backbreakglyph.visible = false;
fore.addEdit(elm);
back.addEdit(elm);
} incontextof this,
checkbox : function(elm)
{
// 生成一个选择框
forebreakglyph.visible = false;
backbreakglyph.visible = false;
fore.addCheckBox(elm);
back.addCheckBox(elm);
} incontextof this,
l : function(elm)
{
// 显示换行等待记号
fore.showLineBreakGlyph(forebreakglyph);
back.showLineBreakGlyph(backbreakglyph);
} incontextof this,
p : function(elm)
{
// 显示换页等待记号
fore.showPageBreakGlyph(forebreakglyph);
back.showPageBreakGlyph(backbreakglyph);
} incontextof this,
position : function(elm)
{
// 设置当前字幕图层的位置和属性
fore.setPosition(elm);
back.setPosition(elm);
} incontextof this,
er : function(elm)
{
// 擦除当前字幕图层的内容
forebreakglyph.visible = false;
backbreakglyph.visible = false;
fore.clear();
back.clear();
} incontextof this,
indent : function(elm)
{
// 设置缩进
fore.setIndent();
back.setIndent();
} incontextof this,
endindent : function(elm)
{
// 解除缩进
fore.resetIndent();
back.resetIndent();
} incontextof this,
locate : function(elm)
{
// 设定文字表示位置
fore.locate(elm.x, elm.y);
back.locate(elm.x, elm.y);
} incontextof this,
glyph : function(elm)
{
// 设定单击等待提示记号
fore.setGlyph(elm);
back.setGlyph(elm);
} incontextof this,
locklink : function(elm)
{
// link禁用
fore.setSelProcessLock(true);
back.setSelProcessLock(true);
} incontextof this,
unlocklink : function(elm)
{
// link禁用解除
fore.setSelProcessLock(false);
back.setSelProcessLock(false);
} incontextof this ];
}
}
// 即时切换的多重字幕插件
class MultiMessageControllerPlugin extends KAGPlugin
{
var numMessageLayers; // 字幕图层数量(2-9)
var numMessageLayersOld; // 原有的字幕图层数量
var window; // 父窗口,通常是kag主窗口
var fore = []; // 各个表图层的引用
var back = []; // 各个裏图层的引用
var tagbuffer = []; //各个字幕的tag缓冲器
var lock; // 字幕切换功能是否处于禁用状态
var stable; // 系统是否处于等待状态
var hidden; // 字幕图层是否处于隐藏状态
function MultiMessageControllerPlugin(window)
{
// 构造函数
super.KAGPlugin(); // 调用父类的构造函数
this.window = window; // 获取父窗口对象
this.numMessageLayers = 0;
Debug.message("多重字幕控制器构造完成");
}
function finalize()
{
release();
invalidate fore;
invalidate back;
invalidate tagbuffer;
window = void;
super.finalize(...);
}
function initialization(num)
{
// 初始化
if(typeof(num) == "Integer" && num >= 2 && num <= 9)
{
lock = false;
stable = false;
hidden = false;
numMessageLayersOld = window.numMessageLayers;
numMessageLayers = num;
window.allocateMessageLayers(numMessageLayers); // 设置字幕图层数量
for(var i = 0; i < numMessageLayers; i++)
{
fore = window.fore.messages;
back = window.back.messages;
tagbuffer = new TagBuffer(this, i);
}
setCurrentMessageLayer(0);// 将当前字幕图层置为Message0
window.keyDownHook.add(onKeyDown); // 向主窗口添加键盘消息响应函数
Debug.message("多重字幕控制器初始化完成, 字幕图层数为" + numMessageLayers);
}
else
{
throw new Exception("多重字幕控制器初始化失败 ( 字幕图层数量不合法,正确范围为 2 - 9 )");
}
}
function release()
{
// 释放该插件
if(numMessageLayers > 0)
{
setCurrentMessageLayer(0);
for(var i = 0; i < numMessageLayers; i++)
{
fore = back = void;
invalidate tagbuffer;
}
window.allocateMessageLayers(numMessageLayersOld);
window.keyDownHook.remove(onKeyDown);
numMessageLayers = 0;
}
}
function setCurrentMessageLayer(currentNum)
{
// 设置当前字幕图层
if(typeof(currentNum) == "Integer" && currentNum >= 0 && currentNum < numMessageLayers)
{
fore[window.currentNum].visible = false;
back[window.currentNum].visible = false;
// 将原有的字幕图层隐藏
window.currentNum = currentNum;
if(window.currentPage)
window.current = back[currentNum];
else
window.current = fore[currentNum];
//修改当前字幕图层
window.updateBeforeCh = 1;
fore[window.currentNum].visible = true;
back[window.currentNum].visible = true;
//显示设置后的当前字幕图层
Debug.message("当前字幕图层设置成功,当前字幕图层序号为" + currentNum);
}
else
{
throw new Exception("当前字幕图层设置失败 ( 指定的字幕图层序号不存在 )");
}
}
function onKeyDown(key, shift)
{
// 按键消息响应函数
Debug.message(key + "键按下");
if(key == 48 || key == 96)
{
// 主键盘数字0键或小键盘数字0键
System.inform("字幕数量为" + numMessageLayers + "\n"
+ "当前字幕为message" + window.currentNum + "\n\n"
+ "1-9的数字键:切换到message0-message8的各个字幕(如果存在的话)\n"
+ "PageUp键: 切换到上一个字幕\n"
+ "PageDown键: 切换到下一个字幕\n"
+ "Home键: 切换到第一个字幕(message0)\n"
+ "数字0键: 显示此帮助对话框",
"多重字幕插件的当前状态");
}
if(numMessageLayers == 0) // 该插件处于不可用状态
return;
if(lock)
return;
if(!stable || hidden)
return;
var index;
if(key >= 49 && key <= 57)
{
// 主键盘1-9的数字键
index = key - 49;
if(index >= 0 && index < numMessageLayers)
setCurrentMessageLayer(index);
}
else if(key >= 97 && key <= 105)
{
// 小键盘1-9的数字键
index = key - 97;
if(index >= 0 && index < numMessageLayers)
setCurrentMessageLayer(index);
}
else if(key == 33)
{
// PageUp键
if(window.currentNum > 0)
setCurrentMessageLayer(window.currentNum - 1);
}
else if(key == 34)
{
// PageDown键
if(window.currentNum < numMessageLayers - 1)
setCurrentMessageLayer(window.currentNum + 1);
}
else if(key == 36)
{
// Home键
setCurrentMessageLayer(0);
}
}
function messageOutput(elm)
{
// 输出多重字幕
var strtag, tag;
for(var i = 1; i < numMessageLayers; i++)
{
strtag = elm["message" + i];
if(strtag !== void)
{
tagbuffer.loadTags(strtag);
while(tagbuffer.handleTag())
{
}
}
else
tagbuffer.clear();
}
}
function onStore(f, elm)
{
// 栞を保存するとき
var dic = f.multimsg = %[];
dic.numMessageLayers = numMessageLayers;
dic.numMessageLayersOld = numMessageLayersOld;
}
function onRestore(f, clear, elm)
{
// 栞を読み出すとき
var dic = f.multimsg;
release();
initialization(dic.numMessageLayers);
numMessageLayersOld = dic.numMessageLayersOld;
}
function onStableStateChanged(stable)
{
// 「安定」( s l p の各タグで停止中 ) か、
// 「走行中」 ( それ以外 ) かの状態が変わったときに呼ばれる
this.stable = stable;
if(stable)
Debug.message("「安定」");
else
Debug.message("「走行中」");
if(!stable)
setCurrentMessageLayer(0);
}
function onMessageHiddenStateChanged(hidden)
{
// メッセージレイヤがユーザの操作によって隠されるとき、現れるときに
// 呼ばれる。メッセージレイヤとともに表示/非表示を切り替えたいときは
// ここで設定する。
this.hidden = hidden;
if(hidden)
Debug.message("MessageLayer「非表示」");
else
Debug.message("MessageLayer「表示」");
}
function onCopyLayer(toback)
{
// レイヤの表←→裏の情報のコピー
// backlay タグやトランジションの終了時に呼ばれる
// ここでレイヤに関してコピーすべきなのは
// 表示/非表示の情報だけ
}
function onExchangeForeBack()
{
// 裏と表の管理情報を交換
// children = true のトランジションでは、トランジション終了時に
// 表画面と裏画面のレイヤ構造がそっくり入れ替わるので、
// それまで 表画面だと思っていたものが裏画面に、裏画面だと思って
// いたものが表画面になってしまう。ここのタイミングでその情報を
// 入れ替えれば、矛盾は生じないで済む。
// ここで表画面、裏画面のレイヤに関して管理すべきなのは
// fore と back の変数だけ
var tmp;
tmp = back[0];
back[0] = fore[0];
fore[0] = tmp;
}
}
kag.addPlugin(global.multimessage_object = new MultiMessageControllerPlugin(kag));
// 插件对象的创建和注册
@endscript
@endif
;
; マクロの登録
@macro name="multimsginit"
@eval exp="multimessage_object.initialization(+mp.num)"
@endmacro
@macro name="multimsgsetcurrent"
@eval exp="multimessage_object.setCurrentMessageLayer(+mp.current)"
@endmacro
@macro name="multimsgrelease"
@eval exp="multimessage_object.release()"
@endmacro
@macro name="multimsglock"
@eval exp="multimessage_object.lock=true"
@endmacro
@macro name="multimsgunlock"
@eval exp="multimessage_object.lock=false"
@endmacro
@macro name="multimsg"
@eval exp="multimessage_object.messageOutput(mp)"
@endmacro
@return
[/wrap]
希德船长 - 2006/11/30 13:16:00
[wrap=first.ks 点我察看]
@call storage="multi-message.ks"
@multimsginit num=2
[position layer=message0 opacity=0]
@multimsg message1="[position opacity=0]"
[deffont color=0x000000 shadow=false edge=false face="宋体"]
@multimsg message1="[deffont color=0x000000 shadow=false edge=false face=宋体]"
*book1a|标准日本语 初级 上
[image storage="1A_01_01" layer=base page=fore]
@history output=false
[cm]
@nowait
@style align=center
[font size=40]中日交流[resetfont][r]
[font size=50]标准日本语[resetfont][r]
[r]
[r]
上[r]
初级[r]
[r]
[r]
[r]
[r]
[r]
人民教育出版社
[r]
@resetstyle
@endnowait
@history output=true
@waitclick
*lesson1|第一课
[cm]
[defstyle linespacing=20]
@multimsg message1="[defstyle linespacing=20]"
[playse storage="1A_01_00"]
@multimsg message1="[r][r]第一课 我是田中。[p]"
[r]
[r]
[link clickse="1A_01_00"]第一课 わたしは [ruby text="た"]田[ruby text="なか"]中です。[endlink][p]
[r]
*part1|(1)
[cm]
[position layer=message0 top=300]
@multimsg message1="[position top=300]"
[backlay]
[image storage="1A_01_02" layer=base page=back]
[trans method=crossfade time=1500]
[wt]
[playse storage="1A_01_01"]
@multimsg message1="我是田中。[l][r]"
[link clickse="1A_01_01"]わたしは [ruby text="た"]田[ruby text="なか"]中です。[endlink][l][r]
[playse storage="1A_01_02"]
@multimsg message1="田中是日本人。[l][r]"
[link clickse="1A_01_02"][ruby text="た"]田[ruby text="なか"]中さんは [ruby text="に"]日[ruby text="ほん"]本[ruby text="じん"]人です。[endlink][l][r]
[playse storage="1A_01_03"]
@multimsg message1="田中是公司职员。[p]"
[link clickse="1A_01_03"][ruby text="た"]田[ruby text="なか"]中さんは [ruby text="かい"]会[ruby text="しゃ"]社[ruby text="いん"]員です。[endlink][p]
*part2|(2)
[cm]
[backlay]
[image storage="1A_01_03" layer=base page=back]
[trans method=crossfade time=1500]
[wt]
[playse storage="1A_01_04"]
@multimsg message1="我是小王。[l][r]"
[link clickse="1A_01_04"]わたしは [ruby text="おう"]王です。[endlink][l][r]
[playse storage="1A_01_05"]
@multimsg message1="小王不是日本人。[l][r]"
[link clickse="1A_01_05"][ruby text="おう"]王さんは [ruby text="に"]日[ruby text="ほん"]本[ruby text="じん"]人では ありません。[endlink][l][r]
[playse storage="1A_01_06"]
@multimsg message1="小王是中国人。[p]"
[link clickse="1A_01_06"][ruby text="おう"]王さんは [ruby text="ちゅう"]中[ruby text="ごく"]国[ruby text="じん"]人です。[endlink][p]
[cm]
[playse storage="1A_01_07"]
@multimsg message1="小王不是公司职员。[l][r]"
[link clickse="1A_01_07"][ruby text="おう"]王さんは [ruby text="かい"]会[ruby text="しゃ"]社[ruby text="いん"]員では ありません。[endlink][l][r]
[playse storage="1A_01_08"]
@multimsg message1="小王是学生。[l][r]"
[link clickse="1A_01_08"][ruby text="おう"]王さんは [ruby text="がく"]学[ruby text="せい"]生です。[endlink][l][r]
[playse storage="1A_01_09"]
@multimsg message1="小王是东京大学的留学生。[p]"
[link clickse="1A_01_09"][ruby text="おう"]王さんは [ruby text="とう"]東[ruby text="きょう"]京[ruby text="だい"]大[ruby text="がく"]学の [ruby text="りゅう"]留[ruby text="がく"]学[ruby text="せい"]生です。[endlink][p]
*part3|(3)
[cm]
[backlay]
[image storage="1A_01_04" layer=base page=back]
[trans method=crossfade time=1500]
[wt]
[playse storage="1A_01_10"]
@multimsg message1="田中: 初次见面。[l][r]"
[ruby text="た"]田[ruby text="なか"]中: [link clickse="1A_01_10"][ruby text="はじ"]初めまして。[endlink][l][r]
[playse storage="1A_01_11"]
@multimsg message1="王: 初次见面。[l][r]"
[ruby text="おう"]王: [link clickse="1A_01_11"][ruby text="はじ"]初めまして。[endlink][l][r]
[playse storage="1A_01_12"]
@multimsg message1=" 我姓王。[p]"
[link clickse="1A_01_12"]わたしは [ruby text="おう"]王です。[endlink][p]
[cm]
[playse storage="1A_01_13"]
@multimsg message1="田中: 我是田中。[l][r]"
[ruby text="た"]田[ruby text="なか"]中: [link clickse="1A_01_13"]わたしは [ruby text="た"]田[ruby text="なか"]中です。[endlink][l][r]
[playse storage="1A_01_14"]
@multimsg message1="王: 田中先生是公司职员吗?[p]"
[ruby text="おう"]王: [link clickse="1A_01_14"][ruby text="た"]田[ruby text="なか"]中さんは [ruby text="かい"]会[ruby text="しゃ"]社[ruby text="いん"]員ですか。[endlink][p]
[cm]
[playse storage="1A_01_15"]
@multimsg message1="田中: 是,是的。是公司职员。[l][r]"
[ruby text="た"]田[ruby text="なか"]中: [link clickse="1A_01_15"]はい,そうです。[ruby text="かい"]会[ruby text="しゃ"]社[ruby text="いん"]員です。[endlink][l][r]
[playse storage="1A_01_16"]
@multimsg message1=" 是旅行社的职员。[l][r]"
[link clickse="1A_01_16"][ruby text="りょ"]旅[ruby text="こう"]行[ruby text="しゃ"]社の [ruby text="しゃ"]社[ruby text="いん"]員です。[endlink][l][r]
[playse storage="1A_01_17"]
@multimsg message1=" 您是公司职员吗?[p]"
[link clickse="1A_01_17"]あなたは [ruby text="かい"]会[ruby text="しゃ"]社[ruby text="いん"]員ですか。[endlink][p]
[cm]
[playse storage="1A_01_18"]
@multimsg message1="王: 不,不是的。[l][r]"
[ruby text="おう"]王: [link clickse="1A_01_18"]いいえ,そうでは ありません。[endlink][l][r]
[playse storage="1A_01_19"]
@multimsg message1=" 是学生。[l]"
[link clickse="1A_01_19"][ruby text="がく"]学[ruby text="せい"]生です。[endlink][l]
[playse storage="1A_01_20"]
@multimsg message1="是东京大学的留学生。[p]"
[link clickse="1A_01_20"][ruby text="とう"]東[ruby text="きょう"]京[ruby text="だい"]大[ruby text="がく"]学の [ruby text="りゅう"]留[ruby text="がく"]学[ruby text="せい"]生です。[endlink][p]
*word1|词汇1
[cm]
[backlay]
[image storage="1A_01_01" layer=base page=back]
[trans method=crossfade time=1500]
[wt]
[position layer=message0 top=0]
@multimsg message1="[position top=0]"
@nowait
@multimsg message1="(代) 我[r]"
[link clickse="1A_01_21"]わたし[endlink] (0)[r]
@multimsg message1="(名) 公司职员[r]"
[link clickse="1A_01_22"]会社員 (かいしゃいん)[endlink] (3)[r]
@multimsg message1="(名) 学生(多指高等院校的学生)[r]"
[link clickse="1A_01_23"]学生 (がくせい)[endlink] (0)[r]
@multimsg message1="(名) 留学生[r]"
[link clickse="1A_01_24"]留学生 (りゅうがくせい)[endlink] (4)[r]
@multimsg message1="(寒暄) 初次见面(寒暄语)[r]"
[link clickse="1A_01_25"]初めまして (はじめまして)[endlink] (4)[r]
@multimsg message1="(感) 是,是的(应答声或用于回答)[r]"
[link clickse="1A_01_26"]はい[endlink] (1)[r]
@multimsg message1="(副) 那样[r]"
[link clickse="1A_01_27"]そう[endlink] (1)[r]
@multimsg message1="(名) 旅行社[r]"
[link clickse="1A_01_28"]旅行社 (りょうこうしゃ)[endlink] (2)[r]
@multimsg message1="(名) 职员[p]"
[link clickse="1A_01_29"]社員 (しゃいん)[endlink] (1)[p]
[cm]
@multimsg message1="(代) 你[r]"
[link clickse="1A_01_30"]あなた[endlink] (2)[r]
@multimsg message1="(感) 不,不是(用于回答)[r]"
[link clickse="1A_01_31"]いいえ[endlink] (3)[r]
@multimsg message1="(专) 田中(姓氏)[r]"
[link clickse="1A_01_32"]田中 (たなか)[endlink] (0)[r]
@multimsg message1="(专) 日本[r]"
[link clickse="1A_01_33"]日本 (にほん)[endlink] (2)[r]
@multimsg message1="(专) 王[r]"
[link clickse="1A_01_34"]王 (おう)[endlink] (1)[r]
@multimsg message1="(专) 中国[r]"
[link clickse="1A_01_35"]中国 (ちゅうごく)[endlink] (1)[r]
@multimsg message1="(专) 东京大学[r]"
[link clickse="1A_01_36"]東京大学 (とうきょうだいがく)[endlink] (5)[r]
@endnowait
[/wrap]
pntgd - 2006/11/30 13:22:00
感谢分享~
代码看得眼花... @_@
MS这是旧版的标日,现在学的一般是新版吧?
贫困灾区 - 2006/11/30 13:39:00
好东西,可惜已经学过了不然肯定用这个-皿-
把四本全弄出来吧(汗
顺便直接有字幕的好像对听力不太好,还是该先放两遍课文的。
suika100 - 2006/11/30 14:59:00
一大串看不明的编程代码,晕星ING
Miliardo - 2006/11/30 22:00:00
话说楼主用的方法真Orz……重建了一个来做这个Phaser?
其实用不着了吧……
(话说楼主的编程实力我真的要承认……不过这个KAG插件对于游戏的用处很大么……)
(下次我把我的歌曲名称显示插件扔上来吧……)
希德船长 - 2006/12/1 12:51:00
以下引用Miliardo在2006-11-30 22:00:39的发言: 话说楼主用的方法真Orz……重建了一个来做这个Phaser? 其实用不着了吧……
(话说楼主的编程实力我真的要承认……不过这个KAG插件对于游戏的用处很大么……) (下次我把我的歌曲名称显示插件扔上来吧……)
|
其实我是没别的办法才这么做的。为了实现多国语言同时显示,我只能把整个KAG3转成Unicode编码(但是这并不影响KAG3本身的功能),为了在多个message同时显示的情况下沿用标准的Tag标记,我只能重写一个简单的Tag处理器。这个插件在官方的Shift-JIS编码或其他编码的KAG3下也能用,但是我觉得把整个KAG3转成Unicode编码有不少好处,至少不会出乱码。
我写这个东西主要是为了熟悉tjs语法和KAG3结构,还有就是为了测试一下,KAG3除了做游戏以外还能干些什么。
这个东西对于做游戏的确没多大帮助,真正的多国语言版游戏用这个插件是做不出来的,那要求各个message都具有完整的功能。本来我也考虑过让各个message都支持完整的功能,但是那可能要修改KAG3本身的Tag处理机制才能实现,结果,我放弃了。
忧郁の丸子的侍卫 - 2006/12/9 20:38:00
哇,突然发现,这语法和JAVA的还真像啊,居然现在才发现 -v-b
LZ有没有KAG的APIDOC?日文版、英文版的都无所谓,有中文版最好啦 -v-b
以前曾经下到过,但现在已经找不到了- -b
LOVEHINA-AVC - 2006/12/10 0:52:00
要说像JAVA,其实那更像JAVASCRIPT(注意JAVA与JAVASCRIPT是完全不同的两个事物,JAVASCRIPT的本名为LIVESCRIPT,与JAVA无关)
rednaxela - 2006/12/10 6:37:00
就面向对象的概念来讲,如果不考虑还没出现的ECMAScript v4的话,TJS还是更像Java.毕竟它是基于类而不是基于原型的面向对象程序设计语言.
就动态性而言,TJS又更接近于JavaScript.同样是变量无类型(而值有类型),而且都支持闭包.比JavaScript更进一步,TJS还有incontextof操作符来协助判断...
笼统来说"更像谁"都很困难呢...呃扯远了
Miliardo - 2006/12/10 13:46:00
以下引用忧郁の丸子的侍卫在2006-12-9 20:38:57的发言: 哇,突然发现,这语法和JAVA的还真像啊,居然现在才发现 -v-b
LZ有没有KAG的APIDOC?日文版、英文版的都无所谓,有中文版最好啦 -v-b
以前曾经下到过,但现在已经找不到了- -b
|
嗯……中文的还没有……不过我们有时间会争取翻译的……
api文档包含在SDK中……
忧郁の丸子的侍卫 - 2006/12/12 17:32:00
谢谢LS的回复,不过,现在网上似乎日文版的GRGR不好找。
以前在幻想森林里下到过,现在好像没有了。
如果有了中文的API的话,GRGR一定会发扬光大的
-----------------------------------------
晕,怎么把官网给忘记了 -v-b