指定のスプライトのアルファ値を別のスプライトで変更します
sprite_set_alpha_from_sprite(ind, spr);
この関数は指定のスプライトのvalue/saturationを使用し、ターゲットスプライトのアルファ値に乗算します。 理想としては、合成元のスプライトは不透明を白、透過を黒とするグレースケールとします。 合成元のスプライトは恒久的なリソースにすることはできず、アルファ値を設定するものとなります。 この関数が正しく機能するためには、新しいスプライトを作成する必要があります。 これは、サーフェースを使用して、サーフェースを元にスプライトを作成することで実現することができます。 ここのコード例ではサーフェースで実装しています。 以下は、この関数がどのように機能するかを示した画像です。
この例では2つのスプライトリソースから特殊効果用のスプライトを作成する方法を示しています。 "spr_create"変数はスプライトを一度だけ作成することを保証するフラグとなります。
spr_create = true;
それが終わったら、Drawイベントで以下のように記述します
if spr_create { spr_create = false; var surf, spr; surf = surface_create(sprite_get_width(spr_Explosion_Alpha), sprite_get_height(spr_Explosion_Alpha)); surface_set_target(surf); draw_clear_alpha(c_black, 0); draw_sprite(spr_Gradient, 0, 0, 0); sprite_index = sprite_create_from_surface(surf, 0, 0, sprite_width, sprite_height, false, false, sprite_get_xoffset(spr_Gradient), sprite_get_xoffset(spr_Gradient)); draw_clear_alpha(c_black, 0); draw_sprite(spr_Explosion_Alpha, 0, sprite_get_xoffset(spr_Gradient), sprite_get_xoffset(spr_Gradient)); spr = sprite_create_from_surface(surf, 0, 0, sprite_width, sprite_height, false, false, sprite_get_xoffset(spr_Gradient), sprite_get_xoffset(spr_Gradient)); surface_reset_target(); surface_free(surf); sprite_set_alpha_from_sprite(sprite_index, spr); sprite_delete(spr); } draw_sprite(sprite_index, 0, x, y);
上記コードではフラグが真であるかをチェックし、trueであれば、フラグをfalseにして、スプライトのアルファ値を設定するためのコードを実行します。 そしてサーフェースの一部分をスプライトとし、sprite_indexに格納します。 その後アルファマップ用のスプライトを作成しインデックス番号を格納、サーフェースの割り当てを解除した後、スプライトにスプライト指定でアルファ値を設定します。 最後にスプライトを削除します。
ここで作成したスプライトは不要になってもメモリ上に残り続けるので、DestroyイベントやRoom終了イベントで、以下の関数を呼び出し削除します
sprite_delete(sprite_index);