2006/02/20(月)

●吉里吉里/KAG 用フェードのあるスタッフロールを作るための KAG プラグイン

 メールの方でフェードのあるスタッフロールの話題が出たので、1からきちんと作り直してプラグイン化してみました。

 ダウンロード ( fadestaffroll20060220.lzh )

; fadestaffroll.ks ---------------------
@if exp="typeof(global.fadestaffroll_object) == 'undefined'"
@iscript

// フェードのあるスタッフロールのプラグイン

// KAG に付属のスタッフロールプラグインとは違い、
// メッセージレイヤを移動させるタイプのスタッフロール

class FadeStaffRollPlugin extends KAGPlugin
{
    var layer; // フェードっぽく見せるためのレイヤ
    var window; // ウィンドウオブジェクトへの参照

    function FadeStaffRollPlugin(window)
    {
        this.window = window;
        layer = new KAGLayer(window, window.fore.base);
        layer.absolute = 2000000-1; // 重ね合わせ順序はメッセージ履歴よりも奥
        layer.hitType = htMask;
        layer.hitThreshold = 256; // マウスメッセージは全域透過
        layer.setPos(0, 0, window.scWidth, window.scHeight);
        super.KAGPlugin();
    }

    function finalize()
    {
        invalidate layer;
        super.finalize(...);
    }

    function init(left, top, right, bottom, vertical, accel)
    {
        // left, top, right, bottom : スタッフロールの表示範囲
        // vertical : 縦書きかどうか
        // accel : 加速度的な動きを行うか ( 負 : 0 : 正 )

        // 画面をいったん layer に重ね合わせコピー
        var base = window.fore.base;
        layer.piledCopy(0, 0, base, 0, 0, layer.width, layer.height);
        layer.face = dfMask;
        layer.fillRect(0, 0, layer.width, layer.height, 255);

        // フェードの範囲内を見えるようにする
        layer.fillRect(left, top, right - left, bottom - top, 0);

        // フェード部分
        if(vertical)
        {
            // 左側のフェード
            var margin = (right - left) / 2;
            var h = bottom - top;
            for(var i = 0; i < margin; i++)
            {
                var mask = 1 - i / margin;
                mask = calculateMask(mask, accel);
                layer.fillRect(left + i, top, 1, h, mask);
            }

            // 右側のフェード
            var r = right - margin;
            for(var i = 0; i < margin; i++)
            {
                var mask = i / margin;
                mask = calculateMask(mask, accel);                 layer.fillRect(r + i, top, 1, h, mask);
            }
        }
        else
        {
            // 上側のフェード
            var margin = (bottom - top) / 2;
            var w = right - left;
            for(var i = 0; i < margin; i++)
            {
                var mask = 1 - i / margin;
                mask = calculateMask(mask, accel);
                layer.fillRect(left, top + i, w, 1, mask);
            }

            // 下側のフェード
            var b = bottom - margin;
            for(var i = 0; i < margin; i++)
            {
                var mask = i / margin;
                mask = calculateMask(mask, accel);
                layer.fillRect(left, b + i, w, 1, mask);
            }
        }

        layer.visible = true;
    }

    function calculateMask(mask, accel)
    {
        // 加速計算
        if(accel < 0)
        {
            // 上弦 ( 最初が動きが早く、徐々に遅くなる )
            mask = 1.0 - mask;
            mask = Math.pow(mask, -accel);
            mask = 1.0 - mask;
        }
        else if(accel > 0)
        {
            // 下弦 ( 最初は動きが遅く、徐々に早くなる )
            mask = Math.pow(mask, accel);
        }
        return 255 * mask;
    }

    function uninit()
    {
        layer.visible = false;
    }

    function onRestore(f, clear, elm)
    {
        // 栞を読み出すとき
        uninit();
    }
}

kag.addPlugin(global.fadestaffroll_object = new FadeStaffRollPlugin(kag));
    // プラグインオブジェクトを作成し、登録する

@endscript
@endif

@macro name=fadestaffrollinit
@eval exp="fadestaffroll_object.init(+mp.left, +mp.top, +mp.right, +mp.bottom, +mp.vertical, +mp.accel)"
@endmacro

@macro name=fadestaffrolluninit
@eval exp="fadestaffroll_object.uninit()"
@endmacro
@return
;---------------------------------------

 シナリオの先頭などで

@call storage="fadestaffroll.ks"

として fadestaffroll.ks を呼び出すと fadestaffrollinit と fadestaffrolluninitという2つのタグが定義されます。

・fadestaffrollinit

 プラグインを初期化します。

 left, top, right, bottom 属性 : フェードアウトを表示する範囲
 vertical 属性                 : 縦書きかどうか
 accel 属性                    : 加速度的な動きを行うか ( 負 : 0 : 正 )

・fadestaffrolluninit

 プラグインの使用を中止します。

 シナリオ内での使い方などは、first.ks ファイルがサンプルになっていますので、そちらをご覧ください。

; first.ks -----------------------------
@call storage=fadestaffroll.ks

@image layer=base storage=bgimage rgamma=0.2 ggamma=0.2 bgamma=0.2
@nowait
@defstyle linespacing=100
@deffont face="MS ゴシック" size=32 color=0xf0f0f0 edge=true edgecolor=0x404040 shadow=false
@position opacity=0 top=&kag.scHeight-kag.current.defaultLineSpacing height="&kag.current.marginT + kag.current.marginB + (kag.current.defaultFontSize + kag.current.defaultLineSpacing) * 13"
@style align=right
スタッフ1[r]
スタッフ2[r]
スタッフ3[r]
スタッフ4[r]
スタッフ5[r]
スタッフ6[r]
スタッフ7[r]
スタッフ8[r]
スタッフ9[r]
スタッフ10[r]
[r]
[r]
Produced by スタッフ
@fadestaffrollinit left=0 top=60 right=&kag.scWidth bottom=&kag.scHeight-60 vertical=false accel=10
@move layer=message time=20000 path="&(kag.current.left+ ', ' + (-kag.current.height + kag.scHeight / 2 + kag.current.marginB + kag.current.defaultFontSize / 2) + ', 255')"
@wm clickskip=true
@fadestaffrolluninit
;---------------------------------------

2006/01/29(日)

●次期吉里吉里の音まわりが楽しみでならん!

 W.Dee さんが日記 ( http://kikyou.info/diary/?200601#i29 ) で、

音程を保ったまま再生速度を変えたり、再生速度を保ったまま音程を変えたりできる(使い方によってはもっといろいろできる) Phase Vocoder ですが、あまり使い勝手のよいものが無かったので結局自分で吉里吉里3用に書きました。

とおっしゃってます。いいですねー、この機能。実際に変換した音を聴ける日が楽しみでなりません。確か、Sound Player Lilith が FFT だったと思うので、あんな感じの音になるのかなー、などと勝手に想像してます。

2006/01/28(土)

●試験運用開始!

 雑記帳をはてなダイアリー ( http://d.hatena.ne.jp/taro_901/ ) から、Movable Type に移そうかと思います。

 とりあえず少しの間、http://www.edolfzoku.com/diary/ で試験運用をしてみて、調子が良さそうであれば、完全に移行するつもりです。

 ついでに、今まで「雑記帳」という名前だったのを、「日記」に変えることにします。「雑記帳」はやっぱり分かりにくいかな~、と思いまして。

2005/07/23(土)

●ノベルゲーム風テキストビューア

 ノベルゲーム風テキストビューア というのを公開してみました。

 ウィンドウ上にドロップされたテキストファイルを、ノベルゲーム風に表示していくってだけのソフトなんですけど、これ意外に読みやすいです。

 いやーしかし、このソフト、「吉里吉里/KAG」のシステムを使ってるんですけど、やっぱりすごいですね、「吉里吉里/KAG」。このぐらいソフトなら、とても簡単にできてしまいます。

 まあ、良かったら使ってみてください。

2005/06/25(土)

●Studioついんくる

 何度かメールでのやりとりをさせていただいているStudioついんくる 制作委員会の方から、「ThinkQuestのサーバに残ることが決まりました」という内容のメールをいただきました。

 いやー、良かったですね。「吉里吉里/KAG」ユーザーの方は、もうご存知かと思いますが、KAG についてのとても分かりやすい講座を公開なさっているサイト様なので、ぜひぜひ訪れてみてくださいませ。

2005/03/16(水)

●吉里吉里への道

 「吉里吉里/KAG」関連のコンテンツを別サイトとして独立させました。『吉里吉里以外は興味ね~』ってな人もいるかと思いまして。いや、吉里吉里以外にも興味は持ってほしいんですよ。せっかくですし。まあでも正直、いますよね。『吉里吉里以外は興味ね~』って人。「さあそこのアナタ、吉里吉里以外にも興味を持つんだ!」と、いくら叫んでみたところで、まあ無駄でしょう。それでも、私は叫びますよ。さあそこのアナタ、吉里吉里以外にも興味を持つんだー!!! ……ハイ。無駄なことするの大好きです。

 タイトルは、『吉里吉里への道』としました。講座名をそのまま持ってきただけですね。講座を書くのはなかなかの苦痛なので、もうちょっとまとまった時間が取れるようになってから、がんばりたいです。とりあえず、気軽にできる『「吉里吉里/KAG」実験室』の方は更新するかもしれません。

 ソフトウェア、音楽の方もコンテンツが大きくなってきたら、独立させようかと思います。そのうち、『ソフト以外は興味ね~』とか『音楽以外は興味ね~』ってな人が、出てくることを祈りつつ。『全部、興味ありますよ~』って人。いたら最高ね、ハイ。

2005/03/07(月)

●「吉里吉里/KAG」実験室を更新しました

(  ̄ _ ̄)/ ど~も。

 気分転換に、「吉里吉里/KAG」実験室の「Borland C++ Compiler を使った吉里吉里プラグインサンプルのコンパイル」というのを書き直してみました。

 気分転換には、大失敗しましたが、前から「はやく書き直さんとな~」と気になっていたので、まあ良かったです。

 Visual C++ を使ったコンパイルとかは要りませんよね。めちゃくちゃ短い文章になりそうですし。

2004/11/13(土)

●NScripter の解説書

 NScripter の解説書を本屋で少しだけ立ち読みしてきました。なかなか良いです。やっぱり解説書や講座などの類は、書く人によってものすごく差がでますね。自分にはクリエイターとしての視点が欠けてるなあ、というのを痛感しました。まあしょうがないんですけど。あと「吉里吉里への道」は、画像がひどいです。だって、こんなん ですよ。ひ、ひどい。

2004/10/31(日)

●タイプライターのようなほにゃらら

 KAG でタイプライターのような音を出すスクリプトを書いてみました。


 しかし、MEG さんのサイトに同じようなスクリプトが載っているのを、さっき知りました。そして泣きました。


 明日までにレポートを書かにゃならんのに、わしゃ何をやっとるんだ。

2004/10/18(月)

●「吉里吉里/KAG」実験室、開設

 「吉里吉里/KAG」実験室というコンテンツを開設しました。ここでは、「吉里吉里/KAG」に関する実験を行っていきます。

 今のところ、ただ実験をしてそれを載せて……というだけなので、かなり不親切です。もっと読みやすくするかどうかは検討中。