CF2.5のゲームは『タイマーベース』ではなく『フレームベース』で作ろう

※本記事は、『インディゲームクリエイター Clickteam Fusion 2.5 無料版』をダウンロードして下さったユーザーへ向けて配信されたメールマガジンに掲載されたものと同内容ですが、重要なので本ブログでも改めてご紹介します。

■CF2.5のゲームは『フレームベース』で作る

CF2.5無料版および通常版でのゲーム作成は順調でしょうか?
今回は、CF2.5でゲームを作成するにあたって、是非知っておいてほしい作法がありますのでご紹介いたします。
それは、

1. 『フレームプロパティ』の『タイマーベース動作』のチェックを外す
cf25_blog_kj_2014-11-06_timerbase

2. イベントで『タイマー条件』を使用しない
cf25_blog_kj_2014-11-06_timerconditions

の2点です。この2点を守ることにより、動作の安定したトラブルの少ないゲームを作ることができます。

上記の作法を守る必要がある理由の説明として、まず、ゲームの動作方式には『フレームベース』と『タイマーベース』の2つの方式があることをご説明します。

■『フレームベース』と『タイマーベース』について

『フレームベース』と『タイマーベース』とは、簡単に言いますと、

・『タイマーベース』:プログラムの動作をタイマー(実時間)ベースで動かす方式
・『フレームベース』:プログラムの動作をフレーム(画面更新回数)ベースで動かす方式

ということになります。
タイマーというのは、1秒(1000ミリ秒)、2秒、3秒と現実に経過している時間の流れのことです。
対してフレームというのは、プログラムが1秒間に何回画面の表示を更新して動きを表示しているかの回数の単位のことです。
例えば、秒間60フレームで動くプログラムであれば、1秒間に60回画面更新が行われます(処理落ちが無い状態)。

今までのゲームは基本的にフレームベースでしたが最近ではタイマーベースで動作するゲームも増えています。
タイマーベースのメリットとしては、「処理落ちしても経過している実時間は変わらないので、ゲームスピードを落とさずに実行することができる(処理落ち中は動作の滑らかさは落ちます)」というものがあります。
フレームベースの場合は、処理落ちすると、処理落ちしていない時は60フレーム更新するのに1秒かかっていたものが、
2秒、3秒と長くなり、結果ゲームスピードが下がります。

これなら、タイマーベースの方が良いように思えますし、CF2.5にも『タイマーベース動作』というオプションがあるので
タイマーベースで作った方が良いように思えますが、実はCF2.5のタイマーベース動作対応は中途半端なので注意が必要です。
『タイマーベース動作』オプションをONにして、動作がタイマーベース化されるのは『オブジェクトの標準動作』と『オブジェクトのアニメーションスピード』だけなのです。標準でない他のオブジェクトによる動作や、イベントの実行間隔はフレームベースのままです。
これではゲームが処理落ちした場合、キャラの動作はタイマーベースで動いているのに、イベントの処理はフレームベースで遅くなっているのでタイミングが合わなくなって進行が破綻してしまう恐れがあります。

『タイマーベース動作』オプションを外せば全てがフレームベース動作になるので、処理落ちするとそれだけゲームは遅くなりますが、タイミングがズレることはありません。

『タイマー条件』を使わない、というのも同じ理屈で、タイマー条件を設定しているイベントはタイマーの間隔で実行されますが、それ以外の条件は基本的にフレームベースです(例:『常に実行』条件はタイマーではなく毎フレームごとに実行されます)。
全てのイベントにタイマー条件を挿入するのも現実的ではない(全てに挿入しても完全にタイマーベース化できるとは限らない)ので、タイマー条件を一切使わないようにして作成するのが無難です。

■フレーム単位でイベントの実行間隔を設定する

フレームベースでイベントの実行間隔を設定するには、オブジェクトの変数やカウンタを利用します。
『常に実行』や『フラグが有効(無効)』などの、その条件を満たす限り毎フレーム実行される条件にて、変数やカウンタを1ずつ増加させ、それが特定の値になった時を条件にアクションを実行するように組んで行きます。
アプリケーションプロパティにてフレームレートが60に設定されている場合、毎フレームごとに1ずつ増やしていって、値が60になれば1秒経過したと規定することができます。2秒なら120、3秒なら180といった感じです。
cf25_blog_kj_2014-11-06_framebase1
↑フレーム単位でイベントの実行間隔を設定した例。画像では変数が1フレーム毎に+1され、60になったらオブジェクトが発射されるように設定されています。つまり、「60フレーム経過すると実行」されるようになっています。繰り返し実行させたい場合は値をリセットします。Xフレーム経過するのにどれだけの時間が掛かるかは、『アプリケーションプロパティ』で設定された『フレームレート(秒間フレーム数)』に依存します。

※2014-1-08追記1
1フレーム経過するのに要する時間は『1000(ミリ秒)÷フレーム数=所要時間(ミリ秒)』で求められます。フレームレートによって1フレームに何ミリ秒かかるかは違いますし、60フレームでは「1000÷60=16.666666666…」となり、割り切れなかったりもしますので、タイマー条件で指定していた時間をそのままフレーム数に置き換えることはできませんので、実際に実行してみて近いフレーム数に妥協することになるでしょう。
ですので、ゲームを作るなら「最初からフレームベースで作る」と決めて掛かったほうが良いです。

※2014-1-08追記2
cf25_blog_kj_2014-11-06_framebase2
↑もう一つ別の組み方の例です(左右どちらの組み方でもOK)。先の例では、「指定のフレーム数が経過するまで待ってから実行」という形になっていましたが、こちらはフレームのカウントが始まれば即目的のイベントが実行されます。その後、何フレーム待ってからイベントを繰り返すか(変数をリセットするか)という組み方になっています。こちらは、シューティングゲームの自機の攻撃のように「ボタン押しっ放しで繰り返し発射されるが、最初の弾はボタンを押した瞬間に発射されてほしい」といったような場合に有効です。

慣れるまではややこしいかもしれませんが、変数の扱いに慣れることも今後の制作で重要なことなのでがんばってください。

※公式サイトよりダウンロード可能な『MMF2オリジナルガイドブック』のサンプルゲームでは、タイマーベース動作についての解説がいきなり来るのも初心者向けではないとの思いからタイマー条件を使っておりますが、本来であれば前述の通り、使用しないのがベターです。

↑サンプルゲームでは、敵弾の発射間隔にタイマー条件が使われている。この状態では、プレイ中に処理落ちをした場合にゲームの動作が遅くなっているのに、敵弾の発射間隔は長くならないので、画面にどんどん弾が溜まってしまうことになる。

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.