GMSでコードを遅れて実行させる方法について解説
GameMakerStudioでコードを遅延させて
実行する方法についていくつか紹介させていただきます。
基本的にScriptに書いて呼び出したりするとコードが綺麗になり、わかりやすいです。
コードだけ実装したい場合は空オブジェクト等を作成してインスタンスに配置しましょう。
ー利用する基本的なノードの機能ー
create = オブジェクト生成時に内部のコードを一度だけ実行
step = オブジェクトがある限りフレーム毎に内部のコードを何度も実行
1:アラームを使用する
alarmは11個まで用意されており
alarm[0] ~ alarm[10]まで使用する事が可能です。
※増やす事も可能
alarmを使用する事で中に記述したコードを遅れて実行する事が出来ます。
※基本的にはアラームは一度限り実行されます。(書き方で何度でも使えます)
仕様としてデフォルトではalarmはカウントが0になったらコードを実行するという関数になります。
1:room_speedを利用する
alarm[0] = 2 * room_speed;
このようにするとroom_speedはそのルームのフレームレートになるため
ゲームのフレームレートを60に設定しているとalarm[0]は2*で120フレームとなるため
2秒の遅延を発生させるというコードになります。
もしゲームのフレーム自体を変えたい場合は
現在ではroom_speedは全てのルームに影響するため推奨されておらずgame_set_speedを使用する事が推奨されています。
そのため警告文が出ます。煩わしい場合は下記を使用してください。
アラームでroom_speedを使用する場合は全てのルームに影響するという点は覚えておきましょう。
基本的に上記コードはCreate(そのコードを書いた物が生成されたら1度だけ実行される)の中に一度だけ記述する事が多いです。
※この方法は推奨されていません
2: game_get_speedを利用する
alarm[0] = 2 * game_get_speed(gamespeed_fps);
ゲームのフレームレートを取得する方法です。
上記方法はroom_speedと同じですがほかのルームに影響を与えません。
しかし、フレームレートに影響を受けるため
最適化するためにはマクロを使う事をおすすめします。
関数をそのまま呼び出すのではなく関数に保存する事でFPSの変化を防げます。
このような細かな最適化をしていきましょう。
#macro CODESPEED game_get_speed(gamespeed_fps)
alarm[0] = CODESPEED * 2;
3: そのまま値を入力
alarm[0] = 180;
単にコードを遅らせたい場合は
アラームの中にコードを記述した後
alarm[0] = 遅らせたいフレーム数 をセットする事で実行可能です。
つまり、alarm[0] = 180 であるとすると
ゲームのフレームを60にしていたら180÷60=3 で3秒後に実行される。
といった事が可能です。
とても便利!
また、この値に変数を利用するととても便利です。
timer1 = 180;
alarm[0] = timer1;
これにより timer1 -30;(1フレームごとに30フレーム遅延を減らす) 等の記述でだんだん早くなる等のコードが作成可能です。
※数値がマイナスにならないように気を付けてください。
例:if (alarm[0] <= 0){ alarm[0] = 180; }
※PR
2:自分で遅延タイマーを作る
自分で変数にて遅延タイマーを作成する方法です。
遅延タイマーを作成する場合はローカル変数やグローバル変数にするか等考えて作成しましょう。
手順1:Stepを作成
ステップはオブジェクトがある限り
1フレームごとに何度も繰り返し処理します。
UnrealEngine等で例えるとtick等に近い物だと思ってください。
そのため、中にカウント情報を入れる事で遅延等が簡単に作成できます。
手順2:変数を設定
ここでは、生成時にタイマー用の変数を作りたいので先に
createを作成してcreateの中に下記の様な変数を宣言するコードを記述してください。
framcounter = 180;
※ローカル変数にしたい場合 (ローカル変数は各インスタンスのみに生成されている変数です)
var _framecounter = 180;
この変数の値は任意で設定してください。
後で設定するなら初期値を0にしても大丈夫です。
手順3:stepにコードを記述
次にstepの中にコードを作成します。
if (framecounter%60 == 0){
任意の遅延実行したいコード }
こうする事で、60で割り切れる場合のみ実行となり、60フレームカウントされた時に実行されるようになります。
そして、フレームカウントをしたいので下記のように
stepは1フレーム毎に実行されるため1フレームにframecounterに1を追加されるようにします。
又、遅延実行を繰り返したいので変数を初期化します。
今回は1秒の遅延なので60フレームで割り切れるときに実行しています。
(※例 ゲーム自体の動作設定が120FPSの場合は%120で1秒)
if (framecounter%60 == 0)
{任意の遅延実行したいコード;
framecounter = 0;
}
framecounter ++;
こうする事でカウンターが初期値に戻り、またマイフレーム毎にカウントが始まります。
elseを使用しても良いです。