KeyFansClub

首页 » - 同人讨论区 - » 综合同人区 » 吉里吉里2版标准日本语 初级 上 第一课(附脚本及多字幕插件的源代码)
希德船长 - 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
1