🧂

[GameMaker][GMS] Heat hazeフィルターをスクリーンシェイクとして使用する

2022/07/14に公開

GameMakerのバージョン2.3.6から追加されたFilters and Effectsの中にある"Heat Haze"というエフェクトをスクリーンシェイクの代わりに使用してみるテストです。

Filters and Effectsの中には、普通のスクリーンシェイクも含まれているのですが、、、その他のエフェクトの諸々のパラメータを試してみている中で、このHeat Hazeを短時間だけ強めにかけることで、スクリーンシェイクの代わりのような効果を得られるのではと思い、試してみました。


作成方法

  1. 新規Filter/Effectレイヤーを作成し、Effect typeに"Heat haze"を設定する。

    Distort1 Amountと、Distort2 Amountはのちほどコード側で制御するので、それ以外のパラメータを好みでいい感じに調節する。
    レイヤー名ものちほどコード側から取得するので、分かりやすい名前をつけておく。
    ここでは”Effect_shake”とする。

  2. スクリーンシェイク制御用のオブジェクトを作る
    “obj_effect_shake”という名前のオブジェクトを作り、CreateイベントとStepイベントを下記のように設定する。

Create event
//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;
}
Step event
//設定された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のパラメータ名(公式マニュアル)

  1. 作成したobj_effect_shakeをルームに配置する
    オブジェクトは作っただけでは実行されないので、必ずルームに配置する。

  2. スクリーンシェイクを適用させたいタイミングで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