非公式 SERIKO 仕様書
はじめに
この仕様書で述べる仕様「SERIKO」は,2000年に「偽春菜」の名前で開発が始まり,2007年現在「伺か」の名前で呼ばれるデスクトップマスコットでアニメーションを行うための仕様である。
この仕様書は,伺か公式ページ内の旧仕様書,履歴,first のマスターシェル定義ファイルなどを元につくられた非公式仕様書であることに注意。
基本的なシェル定義に関しては非公式シェル仕様書を参照。
概要
シェルに動画ポテンシャルを与えるアプローチが SERIKO である。様々なメソッドの組み合わせにより,マバタキから全身移動まで負荷に見合った様々なアニメーションを行うことができる。
本来,着せ替え仕様「MAYUNA」も含むが,一般的にはアニメーションに関する仕様のみを指す。
あらゆるアニメーションは surface の組み合わせで行われる。アニメーションに用いる surface も画像の作り方自体は普通の surface と変わらない。
アニメーションパターンは surfaces.txt で定義される。surfaces.txt の基本的なフォーマットについては非公式シェル仕様書を参照。
この文書では,公式には文書化されていない新しい SERIKO の記法を SERIKO/2.0 として,その仕様を説明する。
SERIKO/1.x に関しては公式の SERIKO 仕様書を参照。
SERIKO/2.0 の SERIKO/1.x との違いは以下の通り。
- エントリ名の初めに
animation
が付いた - pattern エントリのパラメータの順番が変更された
- interval パラメータが 10ms 単位から 1ms 単位になった
- alternativestart メソッドでの ID 指定の括弧が
[
]
から(
)
に変更された
descript スコープ
descript { version,1 }
SERIKO/2.0 によりアニメーションを行う場合は,descript スコープの version エントリに 1
を指定する。
surface スコープ
例示。
surface0 { animation0.interval,never animation0.pattern0,overlay,1001,50,118,78 animation0.pattern1,overlay,1000,50,118,78 animation0.pattern2,overlay,-1 animation1.interval,never animation1.pattern0,overlay,1001,50,118,78 animation1.pattern1,overlay,1000,200,118,78 animation1.pattern2,overlay,-1 animation2.interval,sometimes animation2.pattern0,alternativestart,(0,1) } surface20 { animation1.interval,runonce animation1.pattern0,overlay,2230,100,17,228 animation1.pattern1,overlay,-1,100 animation1.pattern2,overlay,2230,100,17,228 animation1.pattern3,overlay,-1,100 }
アニメーションパターンは各 surfaces スコープで定義する。
エントリ名 animation 後の数値はアニメーショングループ ID を表す。それぞれのグループは独立しており,非同期にアニメーションを発生させ,非同期に停止する。つまりアクションごとにグループを分けなくてはならない。
現行,1 つのベースサーフィスが持てるアニメーションパターンは最大で 128(animation127.* まで)。ID は 0 から順に使用する必要はない。
各アニメーションパターンは以下のエントリから構成される。
interval エントリ
interval エントリはそのアニメーショングループが自動発生する間隔を表す。
sometimes | 時々(マバタキ程度,random,2 と等価) |
rarely | さらに低率(random,4 と等価) |
random,n | 1秒あたり 1/n の確率 |
always | 永久にループ |
runonce | そのベースサーフィスに切り替わった瞬間1回だけ |
yen-e | さくらスクリプトにおいて ¥e が出現した瞬間1回だけ |
talk,n | n 文字表示されるたびに(何か喋るたびに) |
never | 自動では発動しない |
bind | 着せ替え。内容については別項にて解説する。 |
option エントリ
option エントリはそのアニメーショングループの付加情報を表す。このエントリは省略できる。
exclusive | 排他的にアニメーションを行う。 |
- exclusive
-
animation0.interval,never animation0.option,exclusive animation0.pattern0,base,500,50 animation0.pattern1,base,501,50 animation0.pattern2,base,502,50
上記のような指定を行うと,アニメーショングループ 0 は必ず排他的にアニメーションを行うようになる。つまり,グループ 0 が発動した時点で他の全てのアニメーショングループが即座に停止し,またグループ 0 が停止するまで他のアニメーショングループは絶対に発動しない。
pattern エントリ
pattern エントリで実際に 1コマずつアニメーションパターンを定義する。定義文は以下の引数リストを持つ。
animation?.pattern?,(method),(surfaceid),(interval),(offsetx),(offsety)
method パラメータ
method は描画メソッドを表す。SERIKO/2.0 では以下のメソッドが使用できる。
- overlay / overlayfast メソッド
-
オーバーレイによる部分動画。指定アニメーションサーフィスはベースサーフィスの上に合成される。surface 左上原点の色が透過色として使用される。
overlay はリージョンの更新が行われ,合成した結果,現状の可視領域を突破した場合シルエットも変化する。
overlayfast はリージョンの更新が行われないため,シルエットが変化しない場合にのみ使用可能。アニメーションによる負荷が小さくなる利点がある。
offsetx および offsety パラメータで合成する位置を設定する。省略不可。
一般的に最後のコマではサーフィス ID に
-1
を指定し,アニメーション開始以前の状態に戻す。この場合,offsetx および offsety パラメータは無視される。省略可。合成する画像は,(互換性のため) ベースサーフィスの (透過色を含むサイズの) 外へはみ出ないように指定する必要がある。
Materia ではベースサーフィスの範囲内のみが表示され,はみ出た部分は表示されない。CROW では外へはみ出る指定をした場合,合成して表示できない。SSP は正常に表示できる。
- base メソッド
-
animation0.interval,runonce animation0.pattern0,base,1001,50 animation0.pattern1,base,1002,50 animation0.pattern2,base,1003,50 animation0.pattern3,base,-1,50
単純な全面切り替えによる全身動画。処理的には単に高速に立ち絵を切り替えているだけである。動作の性質上,base アニメーションは同時に 1つしか発動しない(2つ以上定義することは可能だが,それらが同時に動くことはない)。
offsetx および offsety パラメータは無視される。省略可。
一般的に最後のコマではサーフィス ID に
-1
を指定し,アニメーション開始以前の状態に戻す。 - move メソッド
-
animation0.interval,always animation0.pattern0,move,0,150,0,-1 animation0.pattern1,move,0,150,0,-2 animation0.pattern2,move,0,150,0,-2 animation0.pattern3,move,0,150,0,-1 animation0.pattern4,move,0,150,0,0 animation0.pattern5,move,0,150,0,1 animation0.pattern6,move,0,150,0,2 animation0.pattern7,move,0,150,0,2 animation0.pattern8,move,0,150,0,1 animation0.pattern9,move,0,150,0,0
再描画を伴わない全体の移動。サーフィスは変化せず座標だけが動く。
move は offsetx および offsety パラメータに従って座標を動かす。値は元位置からの相対座標として解釈される。例えば上記の例ではサーフィスはゆっくり上下に揺れることになる。
surfaceid パラメータは無視される。ただし省略不可。
move による移動はそのアニメーション中でのみ有効であり,ターミネートさせると元の位置に戻ります。
- reduce メソッド
-
animation3.interval,never animation3.pattern0,reduce,400,5,0,-200 animation3.pattern1,reduce,400,5,0,-180 animation3.pattern2,reduce,400,5,0,-160 animation3.pattern3,reduce,400,5,0,-140 animation3.pattern4,reduce,400,5,0,-120 animation3.pattern5,reduce,400,5,0,-120 animation3.pattern6,reduce,400,5,0,-100 animation3.pattern7,reduce,400,5,0,-80 animation3.pattern8,reduce,400,5,0,-60 animation3.pattern8,reduce,400,5,0,-40 animation3.pattern8,reduce,400,5,0,-20 animation3.pattern9,reduce,400,5,0,0
サーフィスを切り抜く。フェードアウトを行う際などに使用する。
現在の透過領域に加えて,指定したサーフィスの透過色 (左上の色) の部分が透過領域となる。合成するサーフィスに pna が存在する場合は,アルファチャンネル合成となり,png の透明部分は無視される。
offsetx および offsety パラメータで合成する位置を設定する。省略不可。
SSP拡張。
- replace メソッド
-
サーフィスを透明部分を含めて上書きする。
サーフィスの輪郭を変更するアニメーション(手を振る,など)を行う場合,まず最初にreduceした後にoverlayでアニメーションを行うか,全身をbaseでアニメーションする必要があったが,replaceを使うと楽に行うことが出来る。
offsetx および offsety パラメータで合成する位置を設定する。省略不可。
SSP拡張。
- start メソッド
-
別のアニメーショングループの発動する。
animation0.pattern0,ovrelay,100,50,0,0 animation0.pattern1,ovrelay,101,50,0,0 animation0.pattern2,start,1 animation0.pattern3,ovrelay,-1,50
上記のスクリプトでは,アニメーショングループ 0 はターミネート直前にアニメーショングループ 1 を発動させる。
このとき個々のアニメーションパターンはブロックされないことに注意。SERIKO において個々のアニメーションパターンは独立したスレッドのような存在であり,start メソッドがコールされても呼び出し側・呼び出され側ともに一切停止しない。
interval, offsetx および offsety パラメータは無視される。省略可。
- alternativestart メソッド
-
alternativestart は複数の候補からランダムに start を行う。
surfaceid パラメータの欄にはサーフィス ID の替わりに複数のアニメーショングループ ID を
(
)
で囲って記述する。animation0.pattern2,alternativestart,(1,2)
上記のスクリプトでは,グループ 1 もしくは 2 にそれぞれ 50% の確率でジャンプ。
interval, offsetx および offsety パラメータは無視される。省略可。
切り替えながら移動
animation0.interval,yen-e animation0.pattern0,base,1001,0 animation0.pattern1,move,0,150,2,0 animation0.pattern2,base,1002,0 animation0.pattern3,move,0,150,4,0 animation0.pattern4,base,1003,0 animation0.pattern5,move,0,150,6,0 animation0.pattern6,base,1004,0 animation0.pattern7,move,0,150,8,0
サーフィスを切り替えながら移動させるには base メソッドと move メソッドを交互に記述することで実現できる。上記の例ではサーフィスが切り替わった瞬間に移動させている。逆に移動した瞬間にサーフィスを切り替えることでも実現できる。
しかしながら,この方法は原理的にちらつきが生じる。あらかじめアニメーションが及ぶ範囲まで含めてサーフィスを作っておき,base で切り替えるのが無難。
surfaceid パラメータ
surfaceid はそのコマで表示されるサーフィスの ID ,起動するアニメーショングループ,又はアニメーションの終端を表す。
- サーフィス ID
-
指定された ID のサーフィスを表示する。
指定した ID の surface スコープが存在する場合,そのスコープで定義 (element による定義) されたサーフィスが表示されます。
指定した ID の surface スコープ に書かれた SERIKO / MAYUNA は無効になります。例外として SSP は MAYUNA (interval,bind) のみ有効となるようです。たぶん……
- -1
-
surfaceid に
-1
を指定すると,アニメーション開始以前の状態を表示する。-1
は通常,ターミネートに使用するが,アニメーション途中に記述することも可能である。 - -2
-
-1
は現アニメーショングループのターミネートを表すが,-2
により全アニメーションのターミネート (全アニメーション即時停止) を指示できる。animation0.pattern0,overlay,100,50,0,0 animation0.pattern1,overlay,101,50,0,0 animation0.pattern2,start,1 animation1.pattern0,overlay,150,100,0,0 animation1.pattern1,overlay,-2,50
この例ではグループ 0 はグループ 1 を発動させて終了するが,ターミネートが行われていないためアニメーション終了後も surface 101 が生き続ける。しかし,ネストされたグループ 1 が
-2
でターミネートを行っているため,グループ1が終了すると同時に surface 101 も消滅する。 - アニメーショングループ ID
-
method に start 又は alternativestart を指定した場合は,サーフィス ID の代わりに起動を指示するアニメーショングループ ID を指定する。
interval パラメータ
interval はコマ送りスピードを表す。単位は milli-second。指定した時間が経過した後,コマが表示される。目安として,一般的なマバタキのスピードは 50
(50 ms)。
ウェイトが画像が表示される前に実行されることに注意。
animation0.interval,sometimes animation0.pattern0,base,301,50 animation0.pattern1,base,302,100 animation0.pattern2,base,-1,200
例えば,上記のようなアニメーションパターンの場合以下のように動作する。
- アニメーション開始
- 50 ms のウェイト
- surface301 を表示
- 100 ms のウェイト
- surface302 を表示
- 200 ms のウェイト
- ターミネート
offsetx / offsety パラメータ
詳細は各メソッドの項目を参照。