Flashゲーム講座 & アクションスクリプトサンプル集

 

ブレンドについて

 


■ブレンドとは?


Photoshop などの、画像編集ツールではおなじみの機能です。
 
 
ブレンドを使用すると、「任意のムービークリップ」と「背景」とで、色の合成を行う事ができます。
 
ブレンドの種類として、14 パターンのモードが用意されています。
 
色の演算は、1ピクセルごとに行われ、全ピクセルが変換されます。
 

■ブレンドモード利用時の注意点


ブレンドを使用すると、自動的にビットマップキャッシュが有効になります。
 
ビットマップキャッシュについては、こちらで解説します。
 
■Flash Player 9 以前の場合
 
幅と高さが 2880 ピクセルまでのグラフィックに適用できます。
 
グラフィックのサイズがこの範囲を超えてしまうと、ブレンドが動作しません。
 
■Flash Player 10 の場合
 
幅と高さが 8192 ピクセルまでのグラフィックに適用できますが、総ピクセル数は 16777216 までとなります。(幅が 8192 なら高さは 2048 まで)
 
グラフィックのサイズがこの範囲を超えてしまうと、ブレンドが動作しません。
 
■Flash Player 11 以降の場合
 
ピクセルサイズの制限はありません
 
メモリ不足の場合、ブレンドが動作しません。
 

■Flash 8 Basic 版でも利用可能

 
ブレンドは、Flash 8 Professional 版から利用できる新機能です。
 
Flash 8 Basic 版では対応していませんが、アクションスクリプトから動作させることは可能です。
 


 

インスタンスにブレンドを適用する

 

サンプルをダウンロード
 


■ブレンドを使用する

 
MovieClip、Button、TextField などの、配置可能なオブジェクトで利用可能です。
 
任意のインスタンスにブレンドを適用するには、blendMode プロパティを使用します。
 
以下の文字列か数値をセットします。
 
■ブレンドモードの種類
 
文字列 番号 名称
"normal" 1 標準
"layer" 2 レイヤー
"multiply" 3 乗算
"screen" 4 スクリーン
"lighten" 5 比較(明)
"darken" 6 比較(暗)
"difference" 7 差の絶対値
"add" 8 加算
"subtract" 9 減算
"invert" 10 反転
"alpha" 11 アルファ
"erase" 12 消去
"overlay" 13 オーバーレイ
"hardlight" 14 ハードライト
 
■使用例
 
ムービークリップ mc に加算合成を使用する

mc.blendMode = "add";
 
ムービークリップ mc に減算合成を使用する

mc.blendMode = "subtract";
 


 

ブレンドの種類について

 
 


■標準 "normal"

 
ブレンドを使用していない状態です。通常の表示です。
 
素材 結果
 

■レイヤー "layer"

 
複数のレイヤーを持つムービークリップを半透明にすると、以下のように表示されます。
 
レイヤーごとに半透明が適用されるので、重なる部分が透けて表示されます
 
素材 半透明を適用
 
ブレンドで「レイヤー」を適用すると、描画結果に対して半透明がかかるようになります。
 
重なる部分が透けて表示される事はありません
 
素材 半透明を適用
 

■乗算 "multiply"

 
シャドウや深度効果に使用します。
 
黒色に近づけるのに最適です。
 
グラフィックが黒色であるほど、結果は黒色に近づきます。
 
グラフィックが白色であるほど、結果に影響はありません。
 
背景 ソース 結果
 
乗算は、以下の計算が行われます。
 
各カラーは、「0 ~ 255」までありますが、この値を「0.0 ~ 1.0」までの小数値と考えます。
 
「背景」と「小数値」を乗算して結果を出力します。
 
乗算の変換式(透過成分は除外)

新しい赤色 = (ソースの赤色 / 255) * 背景の赤色;
新しい緑色 = (ソースの緑色 / 255) * 背景の緑色;
新しい青色 = (ソースの青色 / 255) * 背景の青色;
 

■スクリーン "screen"

 
ハイライトなどに使用します。
 
白色に近づけるのに最適です。
 
グラフィックが白色であるほど、結果は白色に近づきます。
 
グラフィックが黒色であるほど、結果に影響はありません。
 
背景 ソース 結果
 
スクリーンは、以下の計算が行われます。
 
スクリーンの変換式(透過成分は除外)

新しい赤色 = 255 - ((255 - ソースの赤色) / 255) * (255 - 背景の赤色);
新しい緑色 = 255 - ((255 - ソースの緑色) / 255) * (255 - 背景の緑色);
新しい青色 = 255 - ((255 - ソースの青色) / 255) * (255 - 背景の青色);
 
スクリーンの変換式(最適化)(透過成分は除外)

新しい赤色 = ソースの赤色 + 背景の赤色 - ソースの赤色 * 背景の赤色 / 255;
新しい緑色 = ソースの赤色 + 背景の赤色 - ソースの赤色 * 背景の赤色 / 255;
新しい青色 = ソースの赤色 + 背景の赤色 - ソースの赤色 * 背景の赤色 / 255;
 

■比較(明) "lighten"

 
背景とソースのカラーを比較して、大きい(明るい)方を採用して出力します。
 
背景 ソース 結果
 
比較(明)は、以下の計算が行われます。
 
比較(明)の変換式(透過成分は除外)

新しい赤色 = (ソースの赤色 > 背景の赤色) ? ソースの赤色 : 背景の赤色;
新しい緑色 = (ソースの緑色 > 背景の緑色) ? ソースの緑色 : 背景の緑色;
新しい青色 = (ソースの青色 > 背景の青色) ? ソースの青色 : 背景の青色;
 

■比較(暗) "darken"

 
背景とソースのカラーを比較して、小さい(暗い)方を採用して出力します。
 
背景 ソース 結果
 
比較(暗)は、以下の計算が行われます。
 
比較(明)の変換式(透過成分は除外)

新しい赤色 = (ソースの赤色 < 背景の赤色) ? ソースの赤色 : 背景の赤色;
新しい緑色 = (ソースの緑色 < 背景の緑色) ? ソースの緑色 : 背景の緑色;
新しい青色 = (ソースの青色 < 背景の青色) ? ソースの青色 : 背景の青色;
 

■差の絶対値 "difference"

 
背景とソースのカラーを比較します。
 
大きい値から小さい値を減算して結果を出力します。
 
背景 ソース 結果
 
差の絶対値は、以下の計算が行われます。
 
差の絶対値の変換式

新しい赤色 = (ソースの赤色 > 背景の赤色) ? (ソースの赤色 - 背景の赤色) : (背景の赤色 - ソースの赤色);
新しい緑色 = (ソースの緑色 > 背景の緑色) ? (ソースの緑色 - 背景の緑色) : (背景の緑色 - ソースの緑色);
新しい青色 = (ソースの青色 > 背景の青色) ? (ソースの青色 - 背景の青色) : (背景の青色 - ソースの青色);
 

■加算 "add"

 
光源の効果などに利用します。
 
白飛びするほど明るい表現に最適です。
 
グラフィックが白色であるほど、結果は白色に近づきます。
 
グラフィックが黒色であるほど、結果に影響はありません。
 
背景 ソース 結果
 
加算は、以下の計算が行われます。
 
「背景」と「ソース」のカラーを加算します。
 
計算した結果 255 より大きくなる場合は、255 となります。
 
加算の変換式(透過成分は除外)

新しい赤色 = ソースの赤色 + 背景の赤色;
新しい緑色 = ソースの緑色 + 背景の緑色;
新しい青色 = ソースの青色 + 背景の青色;

if(新しい赤色 > 255)	新しい赤色 = 255;
if(新しい緑色 > 255)	新しい緑色 = 255;
if(新しい青色 > 255)	新しい青色 = 255;
 

■減算 "subtract"

 
黒つぶれするほど暗い表現に最適です。
 
ソースのグラフィックが黒色であるほど、結果に影響はありません。
 
ソースのグラフィックが白色であるほど、結果は黒色に近づきます。
 
背景 ソース 結果
 
減算は、以下の計算が行われます。
 
「背景のカラー」から「ソースのカラー」を減算します。
 
計算した結果 0 より小さくなる場合は、0 となります。
 
加算の変換式(透過成分は除外)

新しい赤色 = 背景の赤色 - ソースの赤色;
新しい緑色 = 背景の緑色 - ソースの緑色;
新しい青色 = 背景の青色 - ソースの青色;

if(新しい赤色 < 0)	新しい赤色 = 0;
if(新しい緑色 < 0)	新しい緑色 = 0;
if(新しい青色 < 0)	新しい青色 = 0;
 

■反転 "invert"

 
背景カラーを反転して結果を出力します。
 
背景 ソース 結果
 
反転は、以下の計算が行われます。
 
加算の変換式(透過成分は除外)

新しい赤色 = (255 - 背景の赤色);
新しい緑色 = (255 - 背景の緑色);
新しい青色 = (255 - 背景の青色);
 

■アルファ "alpha"

 
アルファを動作させるには、親のムービークリップのブレンドモードが、「"layer" (レイヤー)」である必要があります。
 
背景カラーの 赤 緑 青 成分はそのままで、透過成分はソースから出力します。
 
背景 ソース 結果
 
アルファは、以下の計算が行われます。
 
アルファの変換式(背景の透過成分は除外)

新しい赤色 = 背景の赤色;
新しい緑色 = 背景の緑色;
新しい青色 = 背景の青色;
新しい透過色 = ソースの透過色;
 

■消去 "erase"

 
消去を動作させるには、親のムービークリップのブレンドモードが、「"layer" (レイヤー)」である必要があります。
 
背景カラーの 赤 緑 青 成分はそのままで、透過成分はソースから反転して出力します。
 
背景 ソース 結果
 
消去は、以下の計算が行われます。
 
消去の変換式(背景の透過成分は除外)

新しい赤色 = 背景の赤色;
新しい緑色 = 背景の緑色;
新しい青色 = 背景の青色;
新しい透過色 = 255 - ソースの透過色;
 

■オーバーレイ "overlay"

 
背景のカラーが 127 以下であれば、乗算として動作します。
 
背景のカラーが 129 以上であれば、スクリーンとして動作します。
 
背景のカラーが 128 であるほど、ソースのカラーがそのまま出力されます。
 
背景のグラフィックが白色であるほど、結果は白色に近づきます。
 
背景のグラフィックが黒色であるほど、結果は黒色に近づきます。
 
背景 ソース 結果
 
オーバーレイは、以下の計算が行われます。
 
オーバーレイの変換式(透過成分は除外)

if(背景の赤色 > 129)      新しい赤色 = -255 + 2 * (ソースの赤色 + 背景の赤色) - ソースの赤色 * 背景の赤色 / 127.5;
else if(背景の赤色 < 127) 新しい赤色 = (ソースの赤色 / 127.5) * 背景の赤色;
else                      新しい赤色 = ソースの赤色;

if(背景の緑色 > 129)      新しい緑色 = -255 + 2 * (ソースの緑色 + 背景の緑色) - ソースの緑色 * 背景の緑色 / 127.5;
else if(背景の緑色 < 127) 新しい緑色 = (ソースの緑色 / 127.5) * 背景の緑色;
else                      新しい緑色 = ソースの緑色;

if(背景の青色 > 129)      新しい青色 = -255 + 2 * (ソースの青色 + 背景の青色) - ソースの青色 * 背景の青色 / 127.5;
else if(背景の青色 < 127) 新しい青色 = (ソースの青色 / 127.5) * 背景の青色;
else                      新しい青色 = ソースの青色;
 

■ハードライト "hardlight"

 
ソースのカラーが 127 以下であれば、乗算として動作します。
 
ソースのカラーが 129 以上であれば、スクリーンとして動作します。
 
ソースのカラーが 128 であるほど、背景のカラーがそのまま出力されます。
 
ソースのグラフィックが白色であるほど、結果は白色に近づきます。
 
ソースのグラフィックが黒色であるほど、結果は黒色に近づきます。
 
背景 ソース 結果
 
ハードライトは、以下の計算が行われます。
 
ハードライトの変換式(透過成分は除外)

if(ソースの赤色 > 129)      新しい赤色 = -255 + 2 * (ソースの赤色 + 背景の赤色) - ソースの赤色 * 背景の赤色 / 127.5;
else if(ソースの赤色 < 127) 新しい赤色 = (ソースの赤色 / 127.5) * 背景の赤色;
else                        新しい赤色 = 背景の赤色;

if(ソースの緑色 > 129)      新しい緑色 = -255 + 2 * (ソースの緑色 + 背景の緑色) - ソースの緑色 * 背景の緑色 / 127.5;
else if(ソースの緑色 < 127) 新しい緑色 = (ソースの緑色 / 127.5) * 背景の緑色;
else                        新しい緑色 = 背景の緑色;

if(ソースの青色 > 129)      新しい青色 = -255 + 2 * (ソースの青色 + 背景の青色) - ソースの青色 * 背景の青色 / 127.5;
else if(ソースの青色 < 127) 新しい青色 = (ソースの青色 / 127.5) * 背景の青色;
else                        新しい青色 = 背景の青色;