AVIの読み込みの続き(まだまだ続くよ!)

AVIの読み込み - 永字八法の続き。
movie.dllをずっといじっていました。しかしながら、本当に実装したい機能はまだできていないので、今回のこれは本当に中間報告的なものです。
http://www.eiji8pou.net/download/movie20091101.zip

  1. ダウンロードして解凍
  2. 無圧縮AVIを用意して、できたフォルダに入れる。
  3. 00.txtを開いてファイル名を動画に書き直す。

基本

  1. 動画を読み込んで、それを再生する機能。(基本的なフレームコントロール機能は持っています)
  2. 再生した画像をスプライトに転写する機能。(複数のスプライトに転写できます)
*define
layermessage 10,40,"movie.dll" ; 二つ目の数値はアクセス頻度です。40に設定すれば、1秒間に25フレームになります。
*start
lsp 999,"*10" ; スプライト番号は適当に。文字列の数値は、define節のlayermessageの数値と同じで
layermessage 10,"set_file,xxx.avi" ; ファイル名は動画で。nsaアーカイブには未対応
lsp 50,":c;>100,100,#FFFFFF",50,50 ; 適当に動画転写先のスプライトを作る。
layermessage 10,"set_channel,0,50" ; チャンネル番号は今回は0で。最大19までです。50番のスプライトを転写先に設定。
layermessage 10,"visible,0" ; 0番チャンネルへの転写を開始。
layermessage 10,"play" ; 動画の再生を開始。
click
layermessage 10,"set_area,0,10,10,30,30" ; 0番チャンネルは、動画の(10,10)から(30,30)までのエリアのみを転写する。
click
end
  • 動画と、転写先のスプライトの大きさが違う場合は、自動的に伸縮されて転写されます。
  • set_area命令を使って、動画の転写する部分を設定することができます。その場合は、その限られたエリアを自動的に伸縮します。
  • エリアの設定、転写先スプライトの大きさについては充分に気をつけてください。不用意な数値にすると、極端にアスペクト比のおかしな動画になってしまいます。

命令一覧

基本的に、設定命令と取得命令を対で作っています。

命令名A 解説A 命令名B 解説B
set_file 動画を設定する命令です。,の後にファイル名を記述してください。読み込めるファイルは無圧縮AVIに限定されています。nsaアーカイブには対応していません。 get_file 現在読み込まれているファイルを取得します。実行後getret $0で取得してください。
set_channel 動画の転写先のスプライトを設定します。,の後にチャンネル番号(0〜19)と、スプライト番号を記述してください。 get_channel そのチャンネルがどのスプライトを転写先にしているかを調べます。もし、設定されていなければ、-1を返します。実行後、getret %0で取得してください。
get_length 動画のフレーム数を取得します。getret %0で取得してください。
set_cursor どのフレームを再生するか設定できます。,の後に、数値を入れてください。数値の最大値はget_lengthで調べてください。 get_cursor 現在、どのフレームを再生しているかを取得できます。実行後getret %0で取得してください。
set_step フレームを何番飛ばしで再生するかです。初期値は1になっています。増やせば早回し、マイナスにすれば巻き戻しになります。 get_step 現在のステップ数を取得します。実行後getret %0してください。
play, stop 再生と中止のコマンドです。 get_play 現在、プレイ中が停止中かを取得します。getret %0で取得してください。0なら停止中、1なら再生中です。
set_loop ループモードの設定です。0なら、再生して一旦はしっこに到着したら、そこで止まります。1なら通常のループです。2にすると、端までいきつくとステップ数をプラスマイナス反転して再生を続けます。 get_loop 現在のループモードを取得します。getret %0で取得してください。
visible, invisible チャンネル番号をつけてください。そのチャンネルに設定したスプライトへの転写をするかしないかです。 get_view チャンネル番号をつけてください。そのチャンネルのスプライトへの転写を行っているかどうかを取得します。実行後getret %0です。
set_area 詳しくは上記の実例を見てください。 get_area ありません。未実装です。
get_movie_width, get_movie_height 動画の大きさを取得します。それぞれ、getret %0です。

演出の指針

スプライトに転写することの利点は色々考えられると思います。半透明の動画を作ることで、SF的表現(ホログラム電話)のようなこともできるでしょう。その他、テレビの画像のブラウン管部分に固定するのも定番ですね。

今後の予定

動画に透過属性をつけます。色を指定して、その色もしくは近い色が動画に含まれていると、それを透明化するようにします。
この透過属性をつけられるのはチャンネル番号20番だけで、転写先はレイヤーに指定した番号に固定です。その他、扱いも多少変わります。
また、これには四つの座標を指定して、その中に納まるように変形する、擬似射影変換の機能を持たせます。

感想

でもなんか、バッドノウハウをひたすら蓄積しているだけのような気もしないでもないんだ俺。