ページ 11

音ゲー(太鼓の○人)について

Posted: 2008年10月20日(月) 20:57
by ポリヲ
現在DXライブラリで音ゲー(太鼓の〇人)を作成しているのですが、
メインとなる当たり判定、構造体を利用してのターゲットの出現で躓いています。
音楽に合わせて流すのでは無く、ランダムで良いのでターゲットを流す方法を教えて下さい。
今はfor文を利用し、x座標を減らして右から左に流している状態なのですが・・・・

Re:音ゲー

Posted: 2008年10月20日(月) 21:49
by Justy

>音楽に合わせて流すのでは無く、ランダムで良いのでターゲットを流す方法を教えて下さい。
>今はfor文を利用し、x座標を減らして右から左に流している状態なのですが・・・・

 これはランダムな間隔で、ターゲットを発生させる方法を訊いているのでしょうか。
 音に合わせなくていいのであれば、大体こんなかんじです。
[color=#d0d0ff" face="monospace]
    // 判定のベースとなる間隔(ここでは20フレームに一回)
    if((++counter % 20) == 0)
    {
        // 乱数で4回に1回発生する
        if((rand() % 4) == 0)
        {
            // 発生
        }
    }[/color]
 counterは毎フレーム加算していくカウンターです。
 最初の if文は 20フレームに1回だけ真になります。
 ここの if文では発生する最低の間隔を決めています(要はリズムです)。

 次の if文は rand()を用いて4回に1回だけランダムに真になります。
 ここで真になれば発生、として、左に流していけばターゲットはランダムに
発生することになります。

Re:音ゲー

Posted: 2008年10月21日(火) 02:27
by 管理人
ちょっとサンプル作ってみるつもりが、作ってるうちに、
あれもつけないと、これもつけないと・・となってしまい、
作り初めて3時間・・サンプルと言えないようなコードになってしまいました^^;

こちらからダウンロードできるのでもしよかったら見て下さい。

画像

基本的に龍神録の館と同じ考え方でやってます。
ダンレボでいう矢印にあたるあれなんて言うんでしょう・・。
太鼓のにっこりマーク?^^;
あれをシューティングでいう弾と同じ考えで制御しています。

実行ファイルも一緒に入れてあるので、遊んで見れるので、たいしたもんじゃないですが、
遊んでみて下さい。

赤い太鼓のマークはキーボード十時キーの「下キー」
青い太鼓のマークはキーボード十時キーの「左または右キー」

です。解凍したフォルダの「太鼓の鉄人.exe」を開いて下さい。

http://l.huu.cc/zip/taiko.zip

注:何故か30fpsになることがあります・・。30fpsと表示されたら再起動して下さい。
何か60fpsにならないバグがあるのだと思いますが、パッとみよくわからないので、また改めてみてみます;

太鼓の名人ってサイトがあるみたいなので、一応鉄人にしてみましたw
サンプルといえない長さですが・・解説してみます。

Re:音ゲー

Posted: 2008年10月21日(火) 02:51
by 管理人
龍神録の館と同じ要領で作っています。
GV.hでは必要な変数の宣言をし、struct.hでは構造体の定義、define.hでは定義、
function.hでは関数のextern宣言をしています。

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	ChangeWindowMode(TRUE);//ウィンドウモード
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	load();//データロード
	ini();//初期化

	while(ProcessLoop()==0){//メインループ
		clear_se_flag();//効果音フラグを初期化
		calc_ch();//入力に対する計算
		bullet_main();//弾の計算メイン
		kekka_main();//弾ヒット結果表示メイン
		graph_main();//描画メイン
		draw_fps(0,460);//FPS表示
		play_se();//効果音
		fps_wait();//fps制御
		count++;
		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
		ScreenFlip();//裏画面反映
	}

	DxLib_End();//DXライブラリ終了処理
	return 0;
}

main.cppでは必要な関数を上のように呼んでいるだけですね。

bullet.cppでは弾についての制御をしています。

基本的に登録・計算・描画という流れになっていますから、
必要な時は登録出来る番号を探してきて、登録し、
常にそのデータを計算し、登録されているデータを描画するプログラムになっています。
これはエフェクト、ヒット結果表示、弾どれについても同じことがいえます。

serch_bullet()

で登録出来る番号を探してきて

input_bullet()

で弾を登録する
登録された弾は常に

calc_bullet()

で計算されており、描画は

graph_bullet()

で行われています。
ここで当たり判定について注意なのですが、単に当たり判定内にあるものを消したんじゃ、
2つも3つも同時に消える場合があるかもしれません。

入力が行われた時、その一番近くにある弾を消さないといけません。
もし同じ距離に2つあったら、左側にある弾を消すべきでしょう。

つまりヒットしたデータを作り、更にそれをソートしてやる必要があります。
ちょっと面倒だったので、サンプルでは一番ヒットの判定の中心に近い弾を消すようにしてあります。

また、単に現在いる弾の位置を基準にヒットしたかどうかは決められません。

□□□□□●□□□□□○

今この●の部分がヒットの判定基準位置だとしましょう。○が弾です。

□□□□□●□□□□□○
□□□□□●□□□□○□
□□□□□●□□□○□□
□□□□□●□□○□□□
□□□□□●□○□□□□
□□□□□●○□□□□□
□□□□□●□□□□□□

このように近づいている時はいいですが、弾がすごいはやさだと

□□□□□●□□□□□○
□□□□□●□○□□□□
□□□○□●□□□□□□

ってこともありえます。判定基準に入らずに通り過ぎる場合があるわけです。
この場合は軌跡を考慮する必要があるでしょう。
弾のスピードを逆算し、前回どこにいたかを計算し、
前回~今回の範囲を基準範囲と比較する必要があるでしょう。


あと、音楽とコラボする演出は私も以前やりました。
しっかりしたFPS計算にくわえ、処理落ちした時に音楽ばかり先にいってしまわないよう、
音楽も制御する必要があります。
これには非公開関数を使う必要があるので、もしわからなければお聞き下さい。

なんかちょっとサンプル組んでみるだけのはずが長くなってしまいました^^;

Re:音ゲー

Posted: 2008年10月21日(火) 06:40
by 管理人
なんか中途半端で気になって寝れなかったので音楽と譜面を付けてみました^^;

プレイしたところこんな感じです↓。

[nico]http://www.nicovideo.jp/watch/sm5001615[/nico]get=
画像
[/url]

プロジェクトと実行ファイルはこちら
http://l.huu.cc/zip/taiko2.zip

操作方法
赤弾:下キー
青弾:左か右キー

注意
何故か30FPSになることがあるので、その時は再起動を(汗

一応処理落ちしても音楽が60フレームごとに時間と同期するようになっています。
譜面はhumenフォルダに入っている0,1,2の羅列です。
1つが64分音譜だと思ってもらえると解り易いかと思います。
0が何も無い、1が赤、2が青を示しています。
このままじゃ「サンレンプ」が表現出来ないので、「3」を導入するなど何か工夫が必要そうです。

Re:音ゲー

Posted: 2008年10月23日(木) 09:46
by ポリヲ
> Justyさん
rand()の使い方が良くわからなかったので、参考になります。ありがとうございます

>管理人さん
素早い対応で、サンプルまで作っていただき助かります。
しかし、難しい内容ですね・・・・頑張って解析して、自分なりに組んでみようと思います。
まぁ、わからない所がかなり多いですが(^^;)
ありがとうございました。