SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

JavaScriptとCSSによるアドベンチャーゲームの作成

フィルタによる画像処理で高度な演出を実現する


トランジション

 これまでのビジュアルフィルタは、静的に特殊な描画処理を施すフィルタが中心でしたが、時間経過と共に徐々に変化させる特殊なフィルタがあります。これをトランジションと呼びます。トランジションフィルタを使うことで、画面切り替えのアニメーションがブラウザ上で行われるため、ゲームで利用できる効果的な演出を簡単に実現することができます。

 トランジションフィルタには、BlendTransフィルタとRevealTransフィルタの2種類が用意されています。BlendTransフィルタは、オブジェクトを透明化させながら徐々にフェードイン・フェードアウトさせる基本的なトランジションフィルタです。

BlendTrans(Duration=duration)

 durationには、トランジションが終了するまでの処理時間を浮動少数点型の秒単位で指定します。小数点以下がミリ秒となります。例えば、durationに1を指定した場合、1秒間かけてオブジェクトがフェードイン・フェードアウトされます。ただし、トランジションは単純なフィルタのような静的な画像変換ではないため、スクリプトからトランジションの適用と実行を指示しなければなりません。

 トランジションフィルタをスクリプトから起動させるには、まずトランジションフィルタのオブジェクトを取得しなければなりません。フィルタオブジェクトは、HTMLの要素オブジェクトが公開しているfiltersコレクションから取得できます。

object.filters([index])

 indexには、取得するフィルタのインデックスを指定します。配列のインデックスと同様に、オブジェクトに指定されている先頭のフィルタを取得するには0を、次のフィルタならば1を、という形で指定します。トランジションフィルタが適用されている要素オブジェクトのfiltersコレクションから、フィルタオブジェクト取得できれば、処理を起動させることができます。

 まず、指定したトランジションフィルタを有効にするためにApply()メソッドを呼び出します。Apply()メソッドが呼び出されると、オブジェクトは視覚的な情報の更新を停止させます。トランジションフィルタは、オブジェクトの現在の状態から新しい状態に遷移させるものなので、最初にオブジェクトの視覚的な状態を保存しなければならないのです。

object.Apply()

 Apply()を呼び出した後でオブジェクトを変更しても再描画はされなくなります。しかし、内部の状態を変更することは可能なので、この間にオブジェクトのプロパティを変更します。オブジェクトの変更が終わった時点でPlay()メソッドを呼び出せば、トランザクションフィルタの働きによって古い状態から新しい状態に視覚的なフェードイン・フェードアウト処理が行われるでしょう。

object.Play(duration)

 durationには、フィルタの実行時間を浮動小数点数型で指定します。これはBlendTransのDurationプロパティと同じものです。フィルタオブジェクトで指定されているDurationパラメータに従う場合はdurationは省略してください。Play()メソッドでdurationを指定した場合はフィルタのDurationパラメータが無視されます。

サンプルプログラム4
<html>
    <head>
    <meta http-equiv="Content-Type"
          content="text/html; charset=shift_jis">
    <title>サンプル 03</title>
    <script language="javascript">
var changed = false;
function img_click() {
    img.style.filter = "BlendTrans(Duration=1)";

    img.filters(0).Apply()

    if (changed) img.src = "back00.jpg";
    else img.src = "back01.jpg"
    changed = !changed;

    img.filters(0).Play()
}
    </script>
    </head>

    <body>
    <h1>サンプルプログラム 03</h1>
    <p>イメージをクリックしてください</p>
    <img src="back00.jpg" id="img" onClick="img_click()">
    </body>
</html>

 このHTML文書を開いて、表示されたイメージをクリックしてください。イメージは異なるイメージに向かってフェードイン・フェードアウトします。クリックイベントが発生するとBlendTransフィルタを設定してトランジションフィルタを実行させています。最初にApply()メソッドを呼び出してオブジェクトにフィルタを適用し、一時的に再描画を停止させます。その間にsrcプロパティを更新してIMG要素オブジェクトのイメージを更新します。本来ならばこの時点でIMG要素オブジェクトのイメージが切り替わって再描画されてしまいますが、Apply()メソッドの効果で再描画は行われません。その後、Play()メソッドを呼び出してトランジションフィルタを再生すると、フェード処理が行われてイメージが切り替わります。

 もうひとつ、トランジションフィルタにはRevealTransフィルタがあります。処理方法は同じですが、オブジェクトの切り替わり方が異なります。

RevealTrans(Duration=duration, Transition=transitionshape)

 durationは、BlendTransフィルタと同様にトランジションが終了するまでの処理時間を指定します。transitionshapeには、どのようにトランジションを行うかを表す0~23までの整数を指定します。指定した値によって、オブジェクトに対するトランジションが変化します。

サンプルプログラム5
<html>
    <head>
    <meta http-equiv="Content-Type"
          content="text/html; charset=shift_jis">
    <title>サンプル 04</title>
    <script language="javascript">
var changed = false;
function img_click() {
    img.style.filter =
        "RevealTrans(Duration=1, Transition=" + transNum.value + ")";

    img.filters(0).Apply()

    if (changed) img.src = "back00.jpg";
    else img.src = "back01.jpg"
    changed = !changed;

    img.filters(0).Play()
}
    </script>
    </head>

    <body>
    <h1>サンプルプログラム 04</h1>
    <p>トランジションを選択して、イメージをクリックしてください</p>
    <p><select id="transNum">
        <option value="0">0 Box in</option>
        <option value="1">1 Box out</option>
        <option value="2">2 Circle in</option>
        <option value="3">3 Circle out</option>
        <option value="4">4 Wipe up</option>
        <option value="5">5 Wipe down</option>
        <option value="6">6 Wipe right</option>
        <option value="7">7 Wipe left</option>
        <option value="8">8 Virtical blinds</option>
        <option value="9">9 Horizontal blinds</option>
        <option value="10">10 Checkerboard across</option>
        <option value="11">11 Checkerboard down</option>
        <option value="12">12 Random dissolve</option>
        <option value="13">13 Split vertical in</option>
        <option value="14">14 Split vertical out</option>
        <option value="15">15 Split horizontal in</option>
        <option value="16">16 Split horizontal out</option>
        <option value="17">17 Strips left down</option>
        <option value="18">18 Strips left up</option>
        <option value="19">19 Strips right down</option>
        <option value="20">20 Strips right up</option>
        <option value="21">21 Random bars horizontal</option>
        <option value="22">22 Random bars vertical</option>
        <option value="23">23 Random</option>

    </select></p>
    <img src="back00.jpg" id="img" onClick="img_click()">
    </body>
</html>

 このHTML文書を開いて、表示されている選択リストから実行したいトランジション番号を選択してイメージをクリックしてください。それぞれ、トランジション番号に従った処理が実行されます。ボックスやワイプによるイメージの切り替えはプレゼンテーションやゲームでは一般的に使われている方法なので、さまざまな場面で応用することができるでしょう。ただし、あまり無意味な乱用は操作性を悪くしてしまうので、ゲームで利用する場合はユーザーが処理を省略できるような仕組みを作るべきです。

 トランジションを行っている状態でも、フィルタオブジェクトに対してStop()メソッドを呼び出すことで終了することができます。

object.Stop()

次のページ
アドベンチャゲーム

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

赤坂 玲音(アカサカ レオン)

平成13年度「全国高校生・専門学校生プログラミングコンテスト 高校生プログラミングの部」にて最優秀賞を受賞。2005 年度~ Microsoft Most Variable Professional Visual Developer - Visual C++。プログラミング入門サイト WisdomSoft の管理人。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/340 2006/05/08 10:32

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー