ページ 11

太鼓の達人ぽい(?)ゲーム

Posted: 2011年9月13日(火) 17:22
by おしあ
環境:VC++
言語:C++

初心者です。
太鼓の達人のようなミニゲームを作りたいのですが、
あのゲームは判定等どういう仕組みなのかさっぱり分かりません。
音との同期は別に考えてなくて、
ただタイミングに合わせてボタンを押すという簡単な作業がどう作ったらいいか分かりません。

何か参考になるような情報が欲しいです。
参考程度のコードでも参考になるサイトの紹介でもいいので教えていただけるとありがたいです。

ついでですが、オブジェクト指向も併せて勉強しているのでオブジェクト指向関連のサイトとかも教えていただけるとありがたいです。
長々とすいません。よろしくお願いします。

Re: 太鼓の達人ぽい(?)ゲーム

Posted: 2011年9月13日(火) 18:46
by Dixq (管理人)
> 音との同期は別に考えてなくて

これでもかと言う位神経質に音ズレが起きないようにしないと音ゲーは成り立たないと思いますが・・。

とりあえずさっぱり分からないとのことなので、流れてくる譜面に合わせてキーを入力する簡単なゲームを作ってはどうでしょう。
画面右端から譜面を左向きに発射します。
秒速100ピクセルで進むようにしておくとすれば、500ピクセル目にあるhitpointには5秒でたどり着くことになりますから、5秒目の瞬間キーを押せばパーフェクトになります。
実際は発射してからの時間で評価を行うのではなく、hitpointまでの距離と速度で評価した方が良いでしょう。
例えばhitpointより100ピクセル左にいる地点でキーが押されたら1秒遅いことが分かります。

もしゲームを一度も作ったことが無ければまずSTGを作ってみるといいですよ。あれは全ての基本になるように思います。

Re: 太鼓の達人ぽい(?)ゲーム

Posted: 2011年9月13日(火) 19:12
by おしあ
管理人様、返信ありがとう御座います。
なるほど、時間より位置で評価するほうがよいのですね、
ゲーム作りは初めてなので、おっしゃるとおりSTGから作ってみることにします。ありがとうございました

Re: 太鼓の達人ぽい(?)ゲーム

Posted: 2011年9月13日(火) 19:45
by おしあ
と、すみません
STGを作る前にやれるだけやっとこうとおもい、今適当にコードを書いたのですが、
弾を複数作成して、またそれらを管理するにはどうすればいいのでしょうか?

コード:

#include <list>
#include <iostream>
#include "DxLib.h"
using namespace std;

class Hyouteki
{
	int x;
public:
	Hyouteki(){ x = 500; };
	int GetX(){ return x;};
	void Move(){ x -= 2;};
};

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
		 LPSTR lpCmdLine, int nCmdShow )
{
	int Cr ;

	// ウインドウモードに変更
	ChangeWindowMode( TRUE ) ;

	if( DxLib_Init() == -1 )	// DXライブラリ初期化処理
	{
		 return -1;	// エラーが起きたら直ちに終了
	}
	Hyouteki *p;
	// 白色の値を取得
	Cr = GetColor( 255 , 255 , 255 ) ;
	SetDrawScreen( DX_SCREEN_BACK ) ;
	int point;
	list<Hyouteki*> list;  // 双方向リスト?
	p = new Hyouteki;
	list.push_back( p );
	list.pop_front();
	point = 2;
	switch(point){
		case 1://初期化
			
			point = 2;
			break;
		case 2://メインループ
			while(CheckHitKey(KEY_INPUT_ESCAPE) == 0){
				ClearDrawScreen();
				DrawLine(500,50,500,150,GetColor(255,0,0));
				DrawLine(100,50,100,150,GetColor(255,0,0));
				if( ProcessMessage() == -1 )
				{
					break;		// エラーが起きたらループを抜ける
				}
				//標的の作成
				p->Move();
				//キーチェック

				//描画
				DrawString(p->GetX(),100,"□",GetColor(255,255,255));
				if( p->GetX() == 100 ){
					delete[]p;
				}
				ScreenFlip();
			}
			break;
	}
	
	DxLib_End() ;		// DXライブラリ使用の終了処理

	return 0 ;		// ソフトの終了
}
誰か教えて下さい

Re: 太鼓の達人ぽい(?)ゲーム

Posted: 2011年9月13日(火) 19:55
by うしお
それはまた別トピでやられたほうが良いかと思います。

それとは別ですが、
私は位置で判定するのは反対意見を投じたいと思います。
見た目、スピードはかなり変更点が多い箇所で、
不安定な箇所を判定に使うのはちょっと疑問に思います。

譜面データとしてシンプルなのは、
位置(時間ミリ秒くらいでしょうか)とマーカーのデータの2つの集合かと思います。

再生開始時間を保存しておいて、
ボタンが押されたときに、
押された時間を調べ、マーカー位置(時間)と経過時間を比較し、差が一定量以下ならば点数を加算すればよいでしょう。
一定時間経過するごとに、サウンドの再生位置と、経過時間を同期するようにすれば、ズレを修正することができるでしょう。