GML、ビルトイン変数、仕様
オブジェクト名と同じ名前を変数に与えて使うことはできない(関数やクラスの名前を変数に使おうとするような違反と同じ)
例えば a
というオブジェクト名のオブジェクトを作ったとする。
このオブジェクト名で作成した場合、変数名に以下は使えなくなる。
var a;
あるいは
globalvar a;
どちらもコンパイルエラー。
GML、グローバル変数、仕様
Tech blog の記事 Optimizing Your games …/グローバル変数へのアクセスはやや重い処理で、例えばループ内で値習得のため頻繁にグローバルへアクセスする場合、これを意識して処理を最適化すれば効率的。
ループ外で事前にローカル変数を新しく確保しそちらにグローバルの値を渡して、ループ内ではローカル変数を参照させるなどの方法が紹介されている。実際のボトルネックはグローバル変数へのアクセスにあるため、ローカル変数を作成するためのコストなどは考慮しなくとも良い。
Lua でもパフォーマンス向上のためのテクとしてこれとまったく同じ手法が取られており、GML の特殊な仕様というわけでもない。
GML、条件演算子
IF ELSE があるけど ELSEIF が無い、ELSE IF ( ELSE+IF 的な)なら可能。
あとは必要な場合 switch case を使う
Tech blog の記事 Optimizing Your games … の Code Tips には Nest “if” についての記述がある(この Tech blog の記事の邦訳版が 2dgames.jp で 【GameMaker:Studio】最適化・高速化させる方法 として提供されています)。
GML の仕様として if A && B then
的な処理は最初の A が false でも次の B まで評価しに行きます。しかしあきらかに無駄なのでこの場合あえて if をネストして書くと処理の効率化が図れます。
if A && B {}
上記コードなら
if A {
if B {
}
}
とネスト化する。
これだと A の評価が終わった時点で FALSE ならば if B は評価されない分が効率的。
配列( Arrays )、グリッド、データ構造
配列は動的確保。利用される全要素数を把握して、最初に最大要素数で初期化し利用した方がメモリ管理的にも効率的。
二次元配列なら Arrays 以外にもグリッドという概念/ GML 特有のアクセサリがある。
ds_maps
, ds_lists
, and ds_grids
など。
GML、距離を測る、二点間距離
オブジェクト・インスタンスとの距離を測りたい場合は distance_to_point(x,y); や distance_to_object(obj); を用いる。この関数は原点がオブジェクト・インスタンスのx , y
に固定。引数はその分省略されている。
任意の二点間距離を測りたい場合は Vector Functions から point_distance(x1, y1, x2, y2); を用いる。
GML、定数、マクロ、#define
定数とは数値や文字列などを事前に定義された「名前付きのデータ」のこと。書き換えできないので定数 ( constant ) と呼び参照専用として用いる。
基本 3 つ ( true
, false
, pi
) はだいたい万国共通
全ての定数はメニューの「scripts
>show all constants
」から一覧を見ることができる。
All constants
から見るとglobalも定数として書かれている。自分で追加した独自の定数もここに表示される
定数はユーザ定義を自由に追加できる>マクロから行う
GMS のマクロは C 言語のプリプロセッサ命令である #define (シャープデファイン)に相当
グローバルとして確保したグローバル変数より定数の方がアクセスは速いので、値が不変な場合は積極的にマクロを利用する。
GML、変数型、型変換(キャスト)、文字列を数値に、数値を文字列に
型の変換(キャスト)>string(val)
、real(str)
が基本
だが型の変換で注意点も
- 浮動小数を
string(val)
した場合に少数部が丸められる
string(pi) の結果は 3.14 など、変換の際に四捨五入されるためこうなる
数学関数の結果表示に string(val)
は不向き
この場合、string_format(val,total,decimal)
を使う
GMS、文字列、改行、エスケープシーケンス、string
文字列に改行を入れたい場合、改行コードの入力が必要になる。
一般的にはエスケープシーケンス(改行コード)として\n
を利用されるが、GM:Studio は独自仕様で#
を採用している。
var a="ハロー#ワールド"; draw_text(0,0,a);
上記サンプルの場合、「ハロー」の後に改行され、次の行頭へ移って「ワールド」が描画される。
この仕様は draw_text 系の命令以外でも全て共通している、show_message 関数なども同じ。
もうひとつの書き方コードエディタを利用してる場合ならば、# を使わないで
var a="ハロー ワールド"; draw_text(0,0,a);
上記サンプルのようにコード中で変数代入する際、実際に改行を入れればそれも改行コードとして認識される。ただしあまり推奨しない
エスケープシーケンスとして利用される #
を文字列中に含む、あるいは #
で改行されたくないのならば、
- バックスラッシュ
\
を使って回避する。
var a="ハロー\#ワールド"; draw_text(0,0,a);
\#
は「#」と表示される。
上記サンプルコードは「ハロー#ワールド」と表示され、#
で改行されない。
参考:String