問題
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日