[GameMaker][GMS] Heat hazeフィルターをスクリーンシェイクとして使用する
GameMakerのバージョン2.3.6から追加されたFilters and Effectsの中にある"Heat Haze"というエフェクトをスクリーンシェイクの代わりに使用してみるテストです。
Filters and Effectsの中には、普通のスクリーンシェイクも含まれているのですが、、、その他のエフェクトの諸々のパラメータを試してみている中で、このHeat Hazeを短時間だけ強めにかけることで、スクリーンシェイクの代わりのような効果を得られるのではと思い、試してみました。
作成方法
-
新規Filter/Effectレイヤーを作成し、Effect typeに"Heat haze"を設定する。
Distort1 Amountと、Distort2 Amountはのちほどコード側で制御するので、それ以外のパラメータを好みでいい感じに調節する。
レイヤー名ものちほどコード側から取得するので、分かりやすい名前をつけておく。
ここでは”Effect_shake”とする。 -
スクリーンシェイク制御用のオブジェクトを作る
“obj_effect_shake”という名前のオブジェクトを作り、CreateイベントとStepイベントを下記のように設定する。
//Effect_shakeというレイヤーのFilter/Effect効果を取得
shake_fx = layer_get_fx("Effect_shake");
//取得した効果(今回の場合Hate Haze)の編集可能パラメータを取得
shake_fx_params = fx_get_parameters(shake_fx);
//基準となるDistort amountの値を設定(何もない時は効果をゼロにしたいので、0に設定)
target_amount = 0;
//このamountの値を変化させて、スクリーンシェイク効果をかける
amount = 0;
//外部からスクリーンシェイクを読み出せるように関数化する
function set_shake(_amount = 20){
amount = _amount;
}
//設定されたamountが、徐々にtarget_amountの0に近づいていく計算式、
//最も簡単なイージング用の計算式としてよく知られたもの。
amount += (target_amount - amount)*0.2;
// 事前に定義されているパラメータ名に、amountの値を代入。パラメータ名は公式マニュアル(下記)を参照。
shake_fx_params.g_Distort1Amount = amount;
shake_fx_params.g_Distort2Amount = amount;
// 設定したパラメータを適用
fx_set_parameters(shake_fx, shake_fx_params);
Filter and Effectsのパラメータ名(公式マニュアル)
-
作成したobj_effect_shakeをルームに配置する
オブジェクトは作っただけでは実行されないので、必ずルームに配置する。 -
スクリーンシェイクを適用させたいタイミングでset_shake()を呼び出す
たとえば、シューティングゲームなどで自機の弾が敵機にヒットしたタイミングで、下記のように呼び出す。
if (instance_exists(obj_effect_shake)){
obj_effect_shake.set_shake(10);
}
ゲームサンプル
上記で示したHeat hazeによるスクリーンシェイクを多用した、シンプルなツインスティックシューターをGXCにアップロードしました。
GEOMETRIA
もともと、このHeat hazeによるスクリーンシェイク効果の実証のための、小さなプロトタイプとして作成したのですが、せっかく作成したので、ゲームとしての最低限の体裁を整えて、ミニゲームとしてリリースしました。ミニマルなツインスティックシューターの傑作THOTHっぽいゲームになってしまいましたが…。
GameMakerが頑張ってPRしている、gxcへのアップロードも一度やってみたかったので、itch.ioなどではなくgxcにて公開してみました。
Discussion