6章.キャラクタの回りを塗りつぶさない(透明色)
1999.7.2

まず、下のサンプルプログラムを実行してみてください。
2枚のBMP画像を読み込み、1枚を背景とし、もう1枚を背景の上に描いています。

  CH=G@SETUP( 640 , 480 , 16 , 0 )        //画面初期化
  BM=G@CHRLOAD("TEST.BMP")                //画像読み込み
  BG=G@CHRLOAD("BG.BMP")                  //背景読み込み
  LOOP
    G@CHRRECT( CH , 0 , 0 )               //コピー先矩形セット
    G@CHRCOPYF( BG , CH )                 //背景書き込み
    G@CHRRECT( CH , 136 , 144 )           //コピー先矩形セット
    G@CHRCOPYF( BM , CH )                 //画像を画面にコピー
    G@FLIP( )                             //フリップ
  ENDLOOP

テスト用画像
TEST.BMP


BG.BMP



このサンプルで表現したものは、ゲームなどを作る場合、ごく自然に使用される手法であり、例えば背景の上にゲームタイトルを描いたりする場合に使用します。

しかし、ぱっと見て「タイトルの回りに四角い黒い枠が描かれてしまっており、は枠が無い方がよい」と思われなかったでしょうか?
そうは言っても、描画の元となるタイトル画像を見ると、タイトルの回りは黒で塗りつぶしているので、表示の結果で黒い枠となっても当然の話です。

では、回りの黒い部分を表示させたくない場合にはどうしたらよいでしょうか?
実はLGPには特定の色を表示させない「抜き色の指定」という機能を持っています。今回の場合は黒を表示させない(つまり、黒色を”抜く”)ようにします。
背景の上にBMP画像を描く際にG@CHRCOPY関数を使用しますが、同関数の3番目の指定値に1を指定すれば黒い部分を描画しなくなります。上のサンプルに抜き色を指定したものを下に載せます。変更した所は赤いところです。
  CH=G@SETUP( 640 , 480 , 16 , 0 )        //画面初期化
  BM=G@CHRLOAD("TEST.BMP")                //画像読み込み
  BG=G@CHRLOAD("BG.BMP")                  //背景読み込み
  LOOP
    G@CHRRECT( CH , 0 , 0 )               //コピー先矩形セット
    G@CHRCOPYF( BG , CH )                 //背景書き込み
    G@CHRRECT( CH , 136 , 144 )           //コピー先矩形セット
    G@CHRCOPYF( BM , CH , 1 )             //画像を画面にコピー
    G@FLIP( )                             //フリップ
  ENDLOOP

テスト用画像
TEST.BMP


BG.BMP




もちろん黒以外の抜き色もして出来ます。指定にはG@COLORKEY 関数を使います。
2つのカラー値を指定し、2つの範囲のカラー番号の色を抜き色にします。但し、範囲で指定できないグラフィックボードが多いので、G@COLORKEY 関数の2つの値には同じ値を指定する事をお勧めします。

ところで抜き色は画面のカラーモードで効果が違うので注意して下さい。
256カラーモード以下では、パレット番号でどの色も抜き色に指定できますが、16BITカラーモード以上では黒しか抜き色に出来ません。

また、コピー元のカラーモードとコピー先のカラーモードが異なる場合には、カラー数が少ない方に合わされることに注意して下さい。
例えば、コピー元が32BITカラーモード(RGBの各色合いは256段階)で、コピー先が16BITカラーモード(RGBの各色合いは32段階)では、コピー元の256段階の色調をコピー先の32段階の色調に調整されます。つまりコピー元の0〜7階調はコピー先の0階調と同等として処理します。

ここまで読んで「黒だけど透明にしたくない」場合にはどうしたら良いのかと言う疑問が出た方もおられるでしょう。この対策は簡単で、限りなく黒に近い色を指定すれば良いのです。人間の目はかなりいいかげんなので、これで十分です。例えば32BITカラーモードではRGBの各色調の内どれか一つでも1以上があれば黒ではないとされます。(黒=RGB=0,0,0)
ただ、32BITカラーモードより小さいカラーモードでは注意が必要です。例えば、16BITカラーモードでは、RGBの各色調は32段階になりますので、256段階指定で換算すると、0〜7は0と同等となります。ですから、
RGBの各色調の内どれか一つでも8以上であれば黒ではないとされます。