Surfaces の存在は常に確認し「無ければ作る」的処理が必須だという理由を前回説明した。
if !surface_exists(User_Defined_Surface) //常に確認、無ければ作る
{
var sw,sh; sw=400; sh=200; // 矩形領域の大きさを定義
User_Defined_Surface = surface_create(sw,sh);
// Surface を作る
surface_set_target(User_Defined_Surface); // ターゲットにセット
draw_clear_alpha(c_blue,1); // ターゲットを draw で塗りつぶす
draw_text(0,0, "Try Draw"); // 試しに文字も書いてみた
surface_reset_target(); // ターゲットを解放
}
else // Application Surface への処理として
{
draw_surface(User_Defined_Surface,mouse_x,0); // 指定 surface を描画
};
surface を作る場合、矩形領域の大きさだけを定義する。座標は不要。
User_Defined_Surface = surface_create(sw,sh);
User_Defined_Surface
というユーザ定義の変数はスコープがグローバルであることが望ましく、ここには作った surface の ID が実数型として代入される。
上記コードでは意図的に手順を省いたが、
Create イベント
のタイミングで User_Defined_Surface という変数をグローバルとして事前に作成しておく必要があります。
global.User_Defined_Surface = noone;
ここで使われる
noone
とは「まだ無い」ことを示す特殊な指定。
グローバル変数である必要性は実は無いのだけど、surface は一度作成すればリソースとしてグローバル的に扱えるため、ルームを移動しても surface は GPU のメモリ上に保持されている限りどこからでも呼び出して使えます。
グローバル的に扱える surface を変数で管理する場合、インスタンス変数ではスコープ範囲が及ばない可能性があるため一応普段からグローバル変数を利用したほうが辻褄が合う、そんな理由でグローバル変数に surface の ID を格納しています。