音ゲーでの譜面の作り方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sadora3
記事: 175
登録日時: 11年前

音ゲーでの譜面の作り方について

#1

投稿記事 by sadora3 » 6年前

現在DXライブラリでandroid向けの音ゲーを作っています。
譜面制作でノーツの表し方が分からずに困っています。
1.PNG
1.PNG (16.01 KiB) 閲覧数: 12139 回
上記の画像を例に挙げると、1つ目と2つ目のノーツは1ビート目にありますよね。
では3つ目のノーツはなんといえばいいのでしょうか?
3ビート目の○○みたいな言い方になると思いますが、どう表現すればいいのでしょうか?

h1j1k1
記事: 37
登録日時: 6年前

Re: 音ゲーでの譜面の作り方について

#2

投稿記事 by h1j1k1 » 5年前

3ビート目の真ん中の辺り としか表現できないと思います


※余計なお世話
n秒にノーツが幾つあるという考え方でいいのでは?
それで重くなるのでしたらn小節目のn秒目のノーツみたいな考え方とかはどうでしょう
もっと細かくするのでしたらn小節目mビート目のo秒目のノーツ
単位を秒にする必要はありませんが、オブジェクトをセットできる枠みたいなのをイメージしてあげると感覚的にできると思います
あとソースを軽くするとしたらスクリプトじゃないですが note: 10, 2, 1 | 2, 2 (適当ですが10小節目2ビート目1行目2行目の中心)みたいな感じにファイルにまとめれるようにすると後から修正聞きやすく、ソースが読みやすくなると思います

sadora3
記事: 175
登録日時: 11年前

Re: 音ゲーでの譜面の作り方について

#3

投稿記事 by sadora3 » 5年前

h1j1k1さん回答ありがとうございます。

>>3ビート目の真ん中の辺り としか表現できないと思います
うーん。やっぱりそうですよね。流石にそういう音楽の専門の用語とかは無い感じですよね。
現状は、仮でScaleという変数を用意して、どうにかしてます。
3ノーツ目は、3ビート・0.5スケールという表現にしました。
今までは仮にしてきましたが、仮じゃなくてこの表現で決定しようと思います。

>>n秒にノーツが幾つあるという考え方でいいのでは?
それですと、ちょっと譜面が作りにくいような気がします。
ビートを無視した譜面には出来ないですし、ビートに合わせようとすると、恐らく計算して配置していかなければなりませんよね。

現状の表現方法は、
ビート番号 スケール レーン番号 ホールドフラグ ホールド時間
0 0.00000 4 0 0
0 0.00000 5 0 0
2 0.50000 1 0 0
3 0.00000 2 0 0
3 0.50000 3 0 0
4 0.00000 3 0 0
のようにして譜面を作っています。
これをtxtに手書きではなく、譜面エディターを作成し、グラフィカルに配置していく感じです。
画像

もしもう少しいいやり方があれば、教えて欲しいです。
一様問題は解決されましたので、解決にしたいのですが、掲示板が新しくなってあの機能消えたっぽいですかね。

h1j1k1
記事: 37
登録日時: 6年前

Re: 音ゲーでの譜面の作り方について

#4

投稿記事 by h1j1k1 » 5年前

素早い返信有難うございます
現状の表現方法に対する良い案は思い浮かばなかったのですが、
ノーツ番号(ノーツID)を設定してあげると
通り過ぎ次第データを破棄していけるので動作が軽くなる気がします。

他には,ゲームの内容にもよりますがノーツの横幅などの項目も増やすと、
ゲーム製作の幅が広がる気がします。


少し話がずれますが、
これってandroid向けの音げー製作ですよね?
上に載っているような表現方法になりますと,非常に動作が重くなる予感がします。
androidはPCやエミュレーターと違ってメモリもストレージも小さいので、
譜面の長さが5分ぐらいになるとメモリがいっぱいになってクラッシュする気がします

sadora3
記事: 175
登録日時: 11年前

Re: 音ゲーでの譜面の作り方について

#5

投稿記事 by sadora3 » 5年前

回答ありがとうございます。

通り過ぎたノーツの破棄は、Y座標が画面外に出たら行ってるので大丈夫です。

これは確かにandroid向けの音ゲーですね。

メモリの話はとても参考になりました。ありがとうございました。
一様実機で動かしてみた感じは、3分くらいの曲でしたが大丈夫っぽかったです。

やっぱりandroidはメモリのことも気にしなければいけないのでしょうか・・・。
今は下記のクラスを、

コード:

//ノーツクラス
class cNote {
private:
	static const int SIZE;	//大きさ
	static const float PERFECT_DECISION;	//パーフェクト判定
	static const float GREET_DECISION;		//グレート判定
	static const float BAD_DECISION;		//ナイス判定
	static const float MISS_DECISION;		//ミス判定

	static float Speed;			//速さ
	static int Thickness;		//太さ
	static float Bpm;			//ビート/分
	static short PerfectNum;	//パーフェクトの数
	static short GreetNum;		//グレートの数
	static short BadNum;		//バッドの数
	static short MissNum;		//ミスの数
	static short ComboNum;		//コンボの数
	static bool AutoPlayFlag;	//オートプレイフラグ

	float TapTime;	//タップタイム(0になった瞬間にタップするとPEFECT)
	int PosX;		//X座標
	float PosY;		//Y座標
	bool Exist;		//生存フラグ

	bool HoldFlag;		//ホールドフラグ(これがONのノーツはホールドノーツになる)
	int HoldTime;		//ホールド時間(1~。1の場合8分1個。10の場合8分10個)
	int HoldPosY;		//ホールドノーツの長さ
	bool HoldFirstTap;	//ホールドノーツの最初のタップがされたかどうか
	int HoldCount;		//ホールドの判定カウント

	void TapProc();		//タップ
	void AutoTapProc();	//オートタップ
public:
	void Init(const float _Beat, const float _Scale, const int _Lane, const bool _HoldFlag, const int _HoldTime);	//初期化
	void Update();	//更新
	void Draw();	//描画

	static void DecisionNumDraw();	//判定数の描画

	static float GetSpeed();		//速さのゲッター
	static int GetThickness();		//太さのゲッター

	static void AddSpeed(const float _Speed);	//速さの加減算
	static void SetSpeed(const float _Speed);	//速さのセッター
	static void AddThickness(const int _Thickness);	//太さの加減算
	static void SetThickness(const int _Thickness);	//太さのセッター
	static void SetBpm(const float _Bpm);	//BPMのセッター
	static void SetAutoPlayFlag(const bool _Flag);	//オートプレイフラグのセッター
};
このように1446個リストにプッシュして動かしています。

コード:

//譜面読み込み
int fp = FileRead_open("data/Test.txt");
if (fp == 0) { return; }
float TempBeat, TempScale;
int TempLane, TempHoldFlag, TempHoldTime;
while (FileRead_scanf(fp, "%f %f %d %d %d", &TempBeat, &TempScale, &TempLane, &TempHoldFlag, &TempHoldTime) != -1) {
	NotesList.push_back(cNote());
	(--NotesList.end())->Init(TempBeat, TempScale, TempLane, TempHoldFlag, TempHoldTime);
}
FileRead_close(fp);

あとこのクラス色々機能詰め込みすぎでしょうか・・・?

h1j1k1
記事: 37
登録日時: 6年前

Re: 音ゲーでの譜面の作り方について

#6

投稿記事 by h1j1k1 » 5年前

コード:

	static short PerfectNum;	//パーフェクトの数
	static short GreetNum;		//グレートの数
	static short BadNum;		//バッドの数
	static short MissNum;		//ミスの数
スコアの計算式等が分からないためどうともいえないのですが、このあたりの数値が何のために使われているのかが気になります。
後、他にはスライダー?ホールダー?ノーツと通常ノーツを同じクラスにするとメモリがちょっともったいない気がします。
機能詰め込みすぎというのは私は少しわかりかねます…(ソースファイル1つ(数千行)とかがよくあるので,,,)

sadora3
記事: 175
登録日時: 11年前

Re: 音ゲーでの譜面の作り方について

#7

投稿記事 by sadora3 » 5年前

回答ありがとうございます。

コード:

	static short PerfectNum;	//パーフェクトの数
	static short GreetNum;		//グレートの数
	static short BadNum;		//バッドの数
	static short MissNum;		//ミスの数
これはタップしたときの各判定の数をカウントしておくための変数です。
スコアの計算はまだできていません。

確かにホールドノーツとタップノーツを一緒にしてしまうと、メモリがかなり無駄になってしまいますね・・・。時間があるときに改善策を考えようと思います。

機能を詰め込み過ぎというのは、ノーツのクラスが判定やオートプレイフラグまで持っているのはおかしいかなといった意味です。判定はそれほどおかしくはないと思うのですが、オートプレイフラグは自分でもかなり怪しいと思っています・・・。

返信

“C言語何でも質問掲示板” へ戻る