ページ 11

数フレームをまたぐ処理をうまく扱うには

Posted: 2013年6月10日(月) 19:57
by ym114
ゲーム開発をぽちぽちやっております.システム周りに着手しています.
多段階で,数フレームをまたぐ処理を統一的に扱いたいと思っています.(デモシーンと呼ぶことにしました)
簡潔に記述したいのですが,なにか良く使われている技法がありましたら教えてください,お願いします.

例1. メニューボタンを押したらメニューがスライドインしてくる
(条件)ボタンが押される
状態遷移でメニューを表示するような処理を開始する

スライドイン終了後に操作を受け付ける

コード:

// 適当こーど
int count = 0;
int state = 0;
void UpdateMenu()
{
    count++;
    DrawMenu(0, 100 - count*10); // 下からスライドインする, (x,y)
    if(count == 10)
         updatecursor();
}
シーンは複雑なので,上のように状態変数で分岐する処理はしたくない.
(例えば0-10カウントで下からスライドインして,10-30カウントの間くるくるまわって,30-50カウントの間に減速,停止するようなシーンだったら…)
でも同じ関数は何度も呼ばれる必要があるので現在デモシーンのどの段階にいるのかをプログラムは知らなければならない.

何か面白い方法がありましたら教えていただきたいなと思ったまでです.
処理自体を数珠つなぎにしたものをどこかに登録して,処理が終わったら次の数珠を実行するような機構は作ってみたのですが
処理の数だけクラスが必要で若干大変なことになっております.

Re: 数フレームをまたぐ処理をうまく扱うには

Posted: 2013年6月10日(月) 20:22
by softya(ソフト屋)
提案です。

1.Luaなどのスクリプト言語で動作を書く。
2.状態遷移を条件テーブルで記述する。 やることは1.とさほど変わりません。
3.stateパターンで書いてみる。→ もしかして問題になっているのはこれのこと?

Re: 数フレームをまたぐ処理をうまく扱うには

Posted: 2013年6月10日(月) 22:33
by ym114
イベントシーン(これがより正しい名前でした)を構成している各動作は小さな命令に分割できます.
それを基本的に順番に処理してほしいだけなので,毎回毎回状態を作って分岐するのはイマイチだな感じていました。
イベントシーンの実装の仕方は?という質問でも良かったかもしれません(その方が分かりやすかったか)

すみません,名前だけは何度も耳にしているのですが,Luaのスクリプトはどれほど便利なのでしょうか?
値を外部ファイルに記述して使用するイメージはあるのですが,コードを書かずにゲームの進行を記述する実感が湧きません。

Re: 数フレームをまたぐ処理をうまく扱うには

Posted: 2013年6月10日(月) 23:10
by ISLe
スクリプトを使っても、変更即実行が便利なだけで複雑なコードが簡単になるわけではないと思いますが。

各動作をいわゆるタスクモジュール化できないのですか?
イベント進行マネージャがタイムスケジュールに合わせて各動作を呼び出すような形で。
ym114 さんが書きました:処理自体を数珠つなぎにしたものをどこかに登録して,処理が終わったら次の数珠を実行するような機構は作ってみたのですが
処理の数だけクラスが必要で若干大変なことになっております.
処理の数だけクラスが必要になる理由が分からないのですが。

場面転換の演出とかを独立したモジュールで処理するのはよくあることです。

Re: 数フレームをまたぐ処理をうまく扱うには

Posted: 2013年6月10日(月) 23:51
by softya(ソフト屋)
ym114 さんが書きました:イベントシーン(これがより正しい名前でした)を構成している各動作は小さな命令に分割できます.
それを基本的に順番に処理してほしいだけなので,毎回毎回状態を作って分岐するのはイマイチだな感じていました。
イベントシーンの実装の仕方は?という質問でも良かったかもしれません(その方が分かりやすかったか)

すみません,名前だけは何度も耳にしているのですが,Luaのスクリプトはどれほど便利なのでしょうか?
値を外部ファイルに記述して使用するイメージはあるのですが,コードを書かずにゲームの進行を記述する実感が湧きません。
LuaでもC++でもコードは書きますよ。状態遷移の記述がわかりやすく成るだけです。
「Lua組み込み編」
http://marupeke296.com/LUA_main.html

Re: 数フレームをまたぐ処理をうまく扱うには

Posted: 2013年6月11日(火) 00:15
by ym114
ありがとうございます.
タスクモジュール化というのは各処理をタスクとして順次処理する認識で正しいでしょうか
一応良く使われているらしいと聞いて安心できました.

マップ切り替え時のフェードイン, アウトなどの演出等を逐次「イベント」として扱うかどうかは語感的に怪しいですが概念は一緒ですね
このゲームオブジェクトをn カウントの間にここからここまで移動する,といったモジュールは便利です。
各オブジェクトを外部から動かせるようにする必要がありますがね

※位置情報と基本的な関数を備えているGameObjectクラスから直接派生させたクラス(Playerなど)をそれぞれ動かすために
多くの処理が必要になっていたのですが,思えば GameObject -> Movable -> Player といった継承関係にすればタスクがMovableクラスを
うまく扱えます.必要なモジュールクラスも減りそうですし,私なりに一度考え直してみます

>Softyaさん
Luaのコルーチンは知りませんでした.ですがリンク先で紹介されている状態遷移が私のやりたいことに限りなく最も近かったです.
難しくC++で制御するよりスクリプトに全て任せた方が簡単なのかもしれませんね…
何らかのボタン垂下を待つ,みたいなこともコルーチンで処理できるか分かりませんが余裕があればLuaもやってみます

(とりあえず解決にしておきます)