CGI State: None
document

SERIKO/1.2
SERIKO/1.3 (MAYUNA/1.0)
SERIKO/1.4
SERIKO/1.5
SERIKO/1.6
SERIKO/1.7 (MAYUNA/1.1)
SERIKO/1.8 (MAYUNA/1.2)
SERIKO/1.9
SERIKO/1.10

概要


シェルに動画ポテンシャルを与えるアプローチが SERIKO である。様々なメソッドの組み合わせにより、マバタキから全身移動まで負荷に見合った様々なアニメーションを行うことができる。
home
  +-ghost
      +-seriko
          +-surfaces.txt
          +-surface0.png
          +-surface50.png
          +-surface51.png

SERIKO/1.2

あらゆるアニメーションは surface の組み合わせで行われる。アニメーションに用いる surface も画像の作り方自体は他の surface と変わらない。

アニメーションパターンは surfaces.txt で定義される。surfaces.txt の基本的なフォーマットについてはシェル仕様書を参照。

アニメーションパターン定義エントリのフォーマットは以下の通り。


0interval,sometimes
0pattern0,100,5,overlay,0,0
0pattern1,101,5,overlay,0,0
0pattern2,100,5,overlay,0,0
0pattern3,-1,5,overlay,0,0

1interval,always
1pattern0,50,20,overlay,10,0
1pattern1,51,20,overlay,10,0
1pattern2,52,20,overlay,10,0
1pattern3,53,20,overlay,10,0
1pattern4,54,20,overlay,10,0
1pattern5,53,20,overlay,10,0
1pattern6,52,20,overlay,10,0
1pattern7,51,20,overlay,10,0

2interval,runonce
2pattern0,60,20,overlay
2pattern1,61,20,overlay
2pattern2,62,20,overlay
2pattern3,63,20,overlay
2pattern4,64,20,overlay
2pattern5,-1,20,overlay

3interval,always
3pattern0,0,15,move,0,-1
3pattern1,0,15,move,0,-2
3pattern2,0,15,move,0,-3
3pattern3,0,15,move,0,-3
3pattern4,0,15,move,0,-2
3pattern5,0,15,move,0,-1
3pattern6,0,15,move,0,0
3pattern7,0,15,move,0,1
3pattern8,0,15,move,0,2
3pattern9,0,15,move,0,3
3pattern10,0,15,move,0,3
3pattern11,0,15,move,0,2
3pattern12,0,15,move,0,1
3pattern13,0,15,move,0,0


エントリ名先頭の数値はアニメーショングループ ID を表す。それぞれのグループは独立しており、非同期にアニメーションを発生させ、非同期に停止する。つまりアクションごとにグループを分けなくてはならない。上記の例では、0番をマバタキ、1番を絵文字、2番を切り替え時アニメーション、3番を縦揺れに使用している。


  • interval


    interval エントリはそのアニメーショングループが自動発生する間隔を表す。


    sometimes
    時々(マバタキ程度)
    rarely
    さらに低率
    random,n
    1秒あたり 1/n の確率
    always永久にループ
    runonceそのベースサーフィスに切り替わった瞬間1回だけ
    never
    自動では発動しない


  • patturn


    pattern エントリで実際に 1コマずつアニメーションパターンを定義する。定義文は以下の引数リストを持つ。


    ?pattern?,[surfaceid],[interval],[method],[offsetx],[offsety]


    surface はそのコマで表示されるサーフィスの ID を表す(ファイル名ではない)。

    interval はコマ送りスピードを表す。指定の値に 10ms をかけた値が採用され、その時間だけそのコマが表示される。目安として、一般的なマバタキのスピードは 5(50 ms)。

    method は描画メソッドを表す。SERIKO/1.2 では以下の 3つのメソッドが使用できる。


  • overlay


    オーバーレイによる部分動画。指定アニメーションサーフィスはベースサーフィスの上に合成される。surface 左上原点の色が透過色として使用される。合成した結果現状の可視領域を突破した場合シルエットも変化する。

    offsetx および offsety パラメータで合成する位置を設定できる。省略不可。

    最後のコマではサーフィス ID に -1 を指定し、アニメーション開始以前の状態に戻す。


  • base


    単純な前面切り替えによる全身動画。処理的には単に高速に立ち絵を切り替えているだけである。

    動作の性質上、base アニメーションは同時に 1つしか発動しない(2つ以上定義することは可能だが、それらが同時に動くことはない)。

    最後のコマではサーフィス ID に -1 を指定し、アニメーション開始以前の状態に戻す。

    offsetx および offsety パラメータは無視される。


  • move


    再描画を伴わない全体の移動。surface は変化せず座標だけが動く。

    move は offsetx および offsety パラメータに従って座標を動かす。値は元位置からの相対座標として解釈される。例えば上記の例ではサーフィスはゆっくり上下に揺れることになる。

    surfaceid パラメータは無視される。


  • パターン数


    現行、1つのベースサーフィスが持てるアニメーションパターンは最大で 128(127interval〜 まで)。

  • SERIKO/1.3(MAYUNA/1.0)


    SERIKO/1.3(MAYUNA/1.0) は着せ替え仕様を実現するための仕様です。これは内容的には動画仕様ではなく静止画仕様であることに注意して下さい。

    *

    0interval,bind
    0pattern0,200,2,bind,0,0

    1interval,bind
    1pattern0,150,2,bind,0,0

    *

    インターバルメソッド bind は極めて特殊な動作をします。bind で指定されたサーフィスはベースサーフィスに完全にバインドされ、あたかもベースサーフィスの一部であるかのように振る舞います。この特性は「サーフィス=服」という概念に最適化されたものであり、この特性を利用していわゆる「着せ替え」を実現できます。

    bind は複数定義可能です。それらは番号が若い順に重ね合わされます。

    bind は1コマ目だけをバインドします。2コマ目以降( ?pattern1 以降)は無視されます。

    xpos および ypos は有効です。method および interval は無視されます。

    *

    bind アニメーショングループはメニューから自由にON/OFF(つまり服を着せたり脱がせたり)することができますが、そのためには descript.txt を適切に編集する必要があります。

    home
      +-ghost
          +-kisekaesan
              +-thumbnail
                +-apron.png
                +-ribbonwhite.png
              +-descript.txt
    

    *

    sakura.bindgroup0.name,服,エプロンドレス,apron
    sakura.bindgroup1.name,リボン,白リボン,ribbonwhite
    sakura.bindgroup2.name,服,黒服,black
    sakura.bindgroup3.name,リボン,黒リボン,ribbonblack

    sakura.bindgroup0.default,1
    sakura.bindgroup1.default,1

    kero.bindgroup0.name,ネクタイ,ネクタイ
    kero.bindgroup1.name,腕章,黒腕章
    kero.bindgroup2.name,腕,ドリル

    kero.bindgroup0.default,1
    kero.bindgroup1.default,1

    sakura.menuitem0,2
    sakura.menuitem1,3
    sakura.menuitem2,-
    sakura.menuitem3,0
    sakura.menuitem4,1

    kero.menuitem0,0
    kero.menuitem1,1
    kero.menuitem2,-
    kero.menuitem3,2

    *

    上記のように記述することでさくら側の「着せ替え」メニューに「エプロンドレス」「黒服」「白リボン」「黒リボン」、うにゅう側のメニューに「ネクタイ」「腕章」「腕」が出現し、それらを自由に着脱することができるようになります。

    引数は左から順に、カテゴリ名、パーツ名、サムネイルファイル名です。

    同じ種類のグループに常に同じIDを振る必要があることに注意して下さい。例えば上記の例では全てのベースサーフィスにおいてアニメーショングループ0番が必ず「服」として設定されていなくてはなりません(ある立ち絵では0番が服、ある立ち絵では2番が服‥‥のような一貫性のない設定ではダメだということです)。

    *.bindgroup[id].default はそのシェルのデフォルトの姿を設定します。この設定ではデフォルトでエプロンドレス&白リボン、ネクタイ&黒腕章になります。0を指定もしくは省略するとOFFとなります。

    *.menuitem[id] はメニュー項目の構造を表しています。この例だと着せ替えアイテムは上から順に黒服、黒リボン、セパレータ、エプロンドレス、白リボンとなります。

    サムネイルは thumbnail メニュー選択時のガイドとして表示されます。不要な場合無指定でも構いません。

    SERIKO/1.4


    SERIKO/1.4 は複数オブジェクトのネストおよび同期を行うための仕様です。


  • start


    ?pattern?,0,0,start,[patturnid]


    start メソッドを使うことでアニメーショングループ自身が別のアニメーショングループを発動させられます。


    0pattern0,100,5,ovrelay,0,0
    0pattern1,101,5,ovrelay,0,0
    0pattern2,0,0,start,1
    0pattern3,-1,5,overlay,0,0


    上記のスクリプトでは、アニメーショングループ0はターミネート直前にアニメーショングループ1を発動させます。

    このとき個々のアニメーションパターンはブロックされないことに注意して下さい。SERIKO において個々のアニメーションパターンは独立したスレッドのような存在であり、start メソッドがコールされても呼び出し側・呼び出され側ともに一切停止しません。


  • -2 によるターミネート


    -1 は現アニメーショングループのターミネートを表しますが、SERIKO/1.4 では -2 による全アニメーションのターミネート(全アニメーション即時停止)を指示できます。


    0pattern0,100,5,ovrelay,0,0
    0pattern1,101,5,ovrelay,0,0
    0pattern2,0,0,start,1

    1pattern0,150,100,ovrelay,0,0
    1pattern1,-2,5,overlay,0,0


    グループ0はグループ1を発動させて終了しますが、ターミネートが行われていないためアニメーション終了後も surface 101 が生き続けます。しかしネストされたグループ1が -2 でターミネートを行っているためグループ1が終了すると同時に surface 101 も消滅します。


  • alternativestart


    alternativestart は複数の候補からランダムに start を行います。

    0pattern2,0,0,alternativestart,[1.2]

    このように記述することでグループ 1 もしくは 2 にそれぞれ 50% の確率でジャンプします。

  • SERIKO/1.5


    SERIKO/1.5 は「喋る」アクションを実現するための仕様です。


  • talk


    ?interval,talk,[interval]


    インターバルメソッド talk は文字が表示されるたびに(伺か喋るたびに)呼び出されます。頻度は字数単位で指定できます。


    4interval,talk,4
    4pattern0,0,0,alternativestart,[28.29.30.31]

    28interval,never
    28pattern0,1000,10,overlay,109,119
    28pattern1,-1,10,overlay,0,0

    29interval,never
    29pattern0,1001,10,overlay,109,119
    29pattern1,-1,10,overlay,0,0

    30interval,never
    30pattern0,1000,10,overlay,109,119
    30pattern1,-1,10,overlay,0,0

    31interval,never
    31pattern0,1001,10,overlay,109,119
    31pattern1,-1,10,overlay,0,0


    上記のスクリプトは字数にして4文字喋るたびに口パクのアニメーションパターンである 1000 もしくは 1001 を表示します。

  • SERIKO/1.6


    SERIKO/1.6 はクリーンアップアクションを実現するための仕様です。


  • yen-e


    ?interval,yen-e


    インターバルメソッド yen-e はさくらスクリプトにおいて \e が出現した瞬間に呼び出されます。


    27interval,yen-e
    27pattern0,-2,0,overlay


    上記のスクリプトは \e と同時に全てのアニメーショングループを強制停止させます。

  • SERIKO/1.7 (MAYUNA/1.1)


    SERIKO/1.7(MAYUNA/1.1)は複数サーフィスの同時バインドおよび領域減少付き着せ替えを実現するための仕様です。


  • add / reduce


    0interval,bind
    0pattern0,100,2,add,0,0
    0pattern1,101,2,add,0,0
    0pattern2,102,2,reduce,0,0
    0pattern3,103,2,add,0,0


    MAYUNA/1.0 においてはアニメーションパターンは着せ替えオブジェクトそのものを表す 0番しか有効性を持っていませんでしたが、MAYUNA/1.1 ではオブジェクト数は無制限です。また従来 bind 固定で具体的な意味を持っていなかったアニメーションメソッドに add と reduce が追加され、それぞれ別の動作を行うようになっています。

    add は MAYUNA/1.0 相当の領域増加 bind 処理です。base surface + binded surface の領域が可視領域となります。新たに追加された reduce は領域減少 bind 処理で、現在の可視状態から特定の領域を明示的に削除します。


  • reduce の具体例


    上記のようなスクリプトで surface 102 が





    このようなビットマップだった場合、キャラクタの胸元に風穴が開きます。


  • レイヤ順序


    アニメーションパターン0から順番に処理されます。0番の上に1番が、1番の上に2番が描画されます。従って、例えば上記のような形で 102 がキャラクタに穴を開けたとしても、それが 103 で再び塞がれれば表示上は穴は開かないことになります。

  • SERIKO/1.8 (MAYUNA/1.2)


    SERIKO/1.8(MAYUNA/1.2)は複雑な重ね合わせ順序を持ったバインドを解決するための仕様です。

    これは「元々 2D であるサーフィスに仮想的な Z 値を付与するための仕様」とも言えます。これが問題になるのはバインドオブジェクトとして長袖の服とエプロンが存在し、かつ腕が身体の前で組み合わされているようなサーフィスがあった場合、服の腕の部分はエプロンより手前に来る(エプロンが服で隠れる)が、胴の部分はエプロンより奥に行く(エプロンで服が隠れる)といったようなケースです。MAYUNA/1.1 は「0番から順に重ねる」という極めて単純な Z 軸コントロール構造しか持っていなかったため、エプロンは必ず服の手前か裏のどちらかにしか来ず、このような複雑な重ね合わせを行うことは不可能でした。


  • insert


    //服1,巫女装束
    0interval,bind
    0pattern0,3,0,add,0,0
    0pattern1,0,0,insert,1
    0pattern2,1,0,add,0,0

    //服2,エプロン
    1interval,bind
    1pattern0,2,0,bind,0,0


    バインドメソッド insert は他のバインドグループの挿入を表します。上記の例では グループ0が服、グループ1がエプロンであり、グループ0の服は胴の部分(エプロンで隠れる部分)と袖の部分(エプロンで隠れない部分)の2つのパーツに分かれています。これが MAYUNA/1.2 の基本と言える形です。

    具体的な動作は以下のようなものです。まずサーフィス3(胴)がバインドされます。次に insert によってグループ1がコールされ、サーフィス2(エプロン)がバインドされます。そして最後にサーフィス1(腕)がバインドされます。以上の動作によりエプロンは腕より後ろで胴より手前の Z 値を持つことになり、3次元的に完全なビューが提供されます。

    最も重要なのはエプロンが巫女装束とは関係ない独立したオブジェクトであり、エプロンがあってもなくてもビューの完全性が維持されるという点です。このオブジェクト独立性によりエプロンの高い再利用性が保証されます。

    insert は入れ子にできます。insert でコールされたグループ内にさらに insert があった場合でも期待された通りの動作をします。

  • SERIKO/1.9


    SERIKO/1.9 は排他的なアニメーションを実現するための仕様です。


  • option エントリ


    0interval,never
    0option,exclusive
    0pattern0,500,0,base,0,0
    0pattern1,501,0,base,0,0
    0pattern2,502,0,base,0,0


    interval、pattern に加え、option エントリが追加されています。このエントリは省略できます。省略した場合はデフォルト値が使用されます。


  • exclusive


    0interval,never
    0option,exclusive
    0pattern0,500,0,base,0,0
    0pattern1,501,0,base,0,0
    0pattern2,502,0,base,0,0


    上記のような指定を行うと、アニメーショングループ 0 は必ず排他的にアニメーションを行うようになります。つまり、グループ 0 が発動した時点で他の全てのアニメーショングループが即座に停止し、またグループ 0 が停止するまで他のアニメーショングループは絶対に発動しなくなります。

  • SERIKO/1.10


    SERIKO/1.10 は具体的な数値によるランダムトリガを実現するための仕様です。


  • random


    0interval,random,8
    0pattern0,500,0,base,0,0
    0pattern1,501,0,base,0,0
    0pattern2,502,0,base,0,0


    上記のような指定を行うと、アニメーショングループ 0 は 毎秒 1/8 の確率で発動します。


    (参考)

    sometimes は random,2 と等価です。
    rarely は random,4 と等価です。

  • 戻る