サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

MovieClip._alphaの微調整ができない/値が端数になる

ID: FN0409004 Product: Flash

Platform: All
Version: 5.0 and above

問題
MovieClip._alphaプロパティに整数のパーセンテージを設定したのに、端数の出ることが少なくありません。さらに、小数点以下のパーセンテージを加えると、MovieClip._alphaの値が変わらなかったり、もっと大きな値で変化してしまうこともあります。

以下のスクリプトを、MovieClipインスタンスのMovieClipアクションに設定すると、その現象を確認することができます(スクリプト001。結果を早く確認するには、フレームレートを高くしてください)。

スクリプト001■MoiveClip._alphaが変化しない/設定以上に変化する例

// MovieClip: アルファ値を変更する対象のインスタンス
// MovieClipアクション
onClipEvent (load) {
  // [1]MovieClip._alphaが変化しない例
  var nIncrement = 0.3;
  this._alpha = 0;
  // [2]MovieClip._alphaが設定以上に変化する例
  // var nIncrement = -0.1;
  // this._alpha = 100;
}
onClipEvent (enterFrame) {
  this._alpha += nIncrement;
  trace(this._alpha);  // 実際の値を出力
}

スクリプト001の[1]の処理では、毎フレームMovieClip._alphaの値を0.3%ずつ加算しているにもかかわらず、値は0のまま変化しません。つまり、インスタンスは、いつまで経っても透明のままです。[1]のステートメント2行をコメントアウトし、[2]の2行を有効にすると、設定以上にMovieClip._alphaの値が変化します。変更する値を-0.1%に設定しているのに、実際のMovieClip._alphaの変化は約-0.4%になります。

原因
Flashはアルファ値を、内部的に1/256刻みで管理しています。したがって、MovieClip._alphaプロパティの値は、1/256つまり0.390625%刻みで変化します。この中間の値を設定しても、1/256単位の数値に丸められます。たとえば、45%に設定すると、実際の数値は44.921875%になります。この値は、115/256に相当します。

対処法
設定したパーセンテージと実際のプロパティ値に誤差が生じること自体は、回避することはできません。誤差は小数点以下の値ですので、それが直接問題となることは少ないでしょう。

実際に問題になるとすれば、微小な値を加算/減算し続けるスクリプト001の例がひとつです。あるいは、加算/減算し続けた結果の値が重要であったり、ある値に達するまでの時間(フレーム数)が問題となるときだと思われます。これらの場合には、値をMovieClip._alphaプロパティに直接代入せず、一旦変数に格納してから、変数値をプロパティに設定すればよいでしょう。

以下のスクリプトは、アルファ値格納用の変数を用意して、アルファ値変更のための関数を定義しました。

スクリプト002■変数を用意してアルファ値変更のための関数を定義

// MovieClip: アルファ値を変更する対象のインスタンス
// MovieClipアクション
onClipEvent (load) {
  // [1]MovieClip._alphaが変化しなかった例
  var nIncrement = 0.3;
  this._alpha = 0;
  // [2]MovieClip._alphaが設定以上に変化した例
  // var nIncrement = -0.1;
  // this._alpha = 100;
  var nMyAlpha = this._alpha;  // アルファ値格納用の変数を設定
  // フルファ値変更のための関数を定義
  function xAddAlpha(nAddAlpha) {
    this._alpha = nMyAlpha += nAddAlpha;
  }
}
onClipEvent (enterFrame) {
  this.xAddAlpha(nIncrement);
  trace(this._alpha); // 実際の値を出力
}

テスト用に使用した設定値は、スクリプト001と同じ([1]と[2])です。変数を加え関数を定義したことにより、問題が解消されています。

関連項目
MovieClip._alphaの処理について

_____

作成者: 野中文雄
更新日: 2006年4月28日 関連項目を追加
作成日: 2004年9月15日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.