はじめに
Steapイベントで〇〇した瞬間のみ処理を行いたい場合が結構あると思います。
例えば着地した瞬間エフェクトを出したり、草に触れた瞬間だけ一瞬揺らすなどがあると思います。
独学だとこういうところつまづきそうなので記事にしてみました。
方法
ここで重要なのは当たった瞬間の1フレームだけ処理を行うということです。
そのためには前のフレームの状態と現状の状態を比較すればOKです。
手順としては以下の通り
- Createで前のフレームの状態を監視する変数を用意
- Stepで前のフレームの状態がfalse,現在の状態がtrueなら処理を行う
- Stepで前のフレームの状態を更新
例)着地した瞬間のサンプルコード
//1.Stepイベントで前のフレームの状態を保存する変数を作成
prevIsGround = false;
//Steapイベント
//2.前のフレームの状態がfalse,現在の状態がtrueなら処理を行う
var isGround = place_meeting(x,y+1,oWall);//現在のフレームで着地しているか?
if(prevIsGround == false && isGround == true)
{
//エフェクト発生処理
}
//3. 前のフレームの状態を更新
prevIsGround = isGround;
+α 地面から離れた瞬間の判定
判定を前のフレームの状態がtrue,現在の状態がfalseに書き換えるだけで離れた瞬間などを判定できます。
上の例でいくと2.の箇所を以下に変更するだけです。
if(prevIsGround == true && isGround == false)
{
//離れた瞬間エフェクト発生
}
これができればエリアから出た瞬間なども判定でき、いろいろ応用できそうです。
Unityというゲームエンジンではこれらの判定に名前がついています。
〇〇した瞬間 =トリガー(Trigger)
しつづけている間 =ステイ(Stay)
〇〇から離れた瞬間=エグジット(Exit)
関数名などをつくるときの参考にしてみてはいかがでしょうか。
最後のUnityの話で思い当たることがありまして、
他のエンジンでの仕様や決まりごとに、ゲーム作りに役立つ概念がたくさんありますね。
とてもとてもありがたいチュートリアルです!
一番最初のチュートリアルはいくつかあるのですが、
作り始めてから、こんなことしたい、あんなことしたいっていう部分がなかなかなくて、
GMLの情報をあつめつつも、わからないことだらけで・・
ここにたどり着けたので、
とりいそぎチュートリアル記事を全部読もうと思います!