ページ 11

BGM

Posted: 2015年11月01日(日) 14:55
by もとからたぬき
下のようにしてmain内にタイトル画面を作ったのですが、
どうやったらBGMを再生できるか分かりません。
ご教授下さい。お願いします。

コード:

#define GLOBAL_INSTANCE 
#include "../include/GV.h"
extern int DrawGraphFd( int xd, int yd, int GrHandle, int TransFlag);
int timer = 0;
int menuout = 0;
int menucount = 0;
//ループで必ず行う3大処理
int ProcessLoop(){
	if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
	if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();//現在のキー入力処理を行う
	GetHitPadStateAll();  //現在のパッド入力処理を行う
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    
 
    while(ProcessLoop()==0){//メインループ
 
        static int sel = 0;//追加
        static int x = 100 ,y = 100;//追加
 
        music_ini();
        switch(func_state){
            case 0://初回のみ入る処理
                load();     //データロード
				loaduserstate(); //ユーザー情報のロード
                first_ini();//初回の初期化
                func_state=98;//ここを98に
                break;
            
            case 98://STGを始める前に行う初期化
                ini();
                load_story();
                func_state=99;//メニューへ
                break;
            case 99://メニュー
				DrawGraphFd(-32,-16,img_back[12],TRUE);
//泡の描画
				//タイトル文字
				DrawGraphFd(0,logos,img_back[13],TRUE);
				DrawGraphFd(logoss,50,img_back[14],TRUE);

				if (gameextraf == 1){
                DrawGraphFd(10 + menuout,260,img_etc[10],TRUE);
				}
				if (gameextraf == 0){
                DrawGraphFd(10 + menuout,260,img_etc[9],TRUE);
				}
				DrawGraphFd(-15 + menuout + (logoss -150) ,255 + (sel * 33),img_etc[11],TRUE);
 

                if(CheckStateKey(KEY_INPUT_UP)==1 && logoss > 120)
                {
                    if(sel > 0)
                        sel--;
                    else
                        sel = 5;
                }
                if(CheckStateKey(KEY_INPUT_DOWN)==1 && logoss > 120)
                {
                    if(sel < 5)
                        sel++;
                    else
                        sel = 0;
                }
                if(CheckStateKey(KEY_INPUT_Z)==1 && logoss > 120)
                {
                    if(sel == 0)
						menucount = 1;
                        
					if(sel == 5){
						DxLib_End();
						return 0;
					}

                }
				if (menucount ==1){
				menuout = menuout - 9;
				}
				if(menuout < -280){
					menuout = 0;
					func_state=100;
				}
                break;
            case 100://通常処理
                                 enter_func_tm("");
                calc_ch();       enter_func_tm("");
                ch_move();       enter_func_tm("");
                cshot_main();    enter_func_tm("");
                enemy_main();    enter_func_tm("");
                boss_shot_main();enter_func_tm("");
                shot_main();     enter_func_tm("");
                out_main();      enter_func_tm("");
                effect_main();   enter_func_tm("");
                calc_main();     enter_func_tm("");
                graph_main();    enter_func_tm("");
                bgm_main();      enter_func_tm("");
                if(boss.flag==0)
                    stage_count++;
                break;
            default:
                printfDx("不明なfunc_state\n");
                break;
        }
        music_play();            enter_func_tm("");
        fps_wait();              enter_func_tm("",1);
        if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
        ScreenFlip();//裏画面反映
        count++;
 
    }
    DxLib_End();//DXライブラリ終了処理
    return 0;
}

Re: BGM

Posted: 2015年11月02日(月) 14:02
by softya(ソフト屋)
こちらの質問と同じ方ですか?
http://dixq.net/forum/viewtopic.php?f=3&t=17215
名前の統一をお願いしております。質問の時系列がわかると回答しやすく成るためです。
それと回答者に失礼ですので、かならず返答をお願いします。解決したら解決チェックもお願いします。

ご質問の内容に関しては、func_stateにBGM読み込み再生のステートを付け加えると良いと思います。
ゲームプログラミングの館の「ゲームプログラミング設計」の形にしてもらう方が良いんですけどね。

Re: BGM

Posted: 2015年11月03日(火) 12:51
by トントンに統一しました
ありがとうございますー。

新ゲームプログラミングの館から改変してます。
新のほうのmusic.cppのBGM再生を使いたいのです。
よろしくおねがいします

Re: BGM

Posted: 2015年11月03日(火) 14:00
by softya(ソフト屋)
タイトル用のmusic.cppを作ったほうが簡単でしょう。
出来るならmusic.cppをタイトル、ゲーム本編両用に改造すべきですが難易度が上がります。

>新のほうのmusic.cppのBGM再生を使いたいのです。

これ意味が不明です。新ゲームプログラミングの館にmusic.cppの解説ありましたか?
章名で教えて下さい。

Re: BGM

Posted: 2015年11月03日(火) 17:58
by とんとん
返信が遅れました。申し訳ありません。
龍神録プログラミングの館48章BGMをつけてみようでの
music.cppです。
music.cppは何も変えていないです。
あと、初心者なので、書き方など細かく教えていただけるとありがたいです。
宜しくお願いします。

Re: BGM

Posted: 2015年11月03日(火) 20:16
by softya(ソフト屋)
music.cppの何処がわからないのでしょうか。ピンポイントで質問願えますか。
それと48章までは、ちゃんと理解できているんでしょうか?
ゲームプログラミングの理解のために龍神録を改造されているとすると理解することが第一番かと思います。

Re: BGM

Posted: 2015年11月03日(火) 20:58
by とんとん
music.cppは再生するタイミングをゲームのカウントを使っているのですが、
タイトル画面ではそのカウントがないので、、、。
あと、呼び出す名前を何が使えるのか見当が付かないのです。
多分私が良く理解していないだけだと想いますが、、、、。
お願い致します。

Re: BGM

Posted: 2015年11月03日(火) 21:06
by softya(ソフト屋)
>music.cppは再生するタイミングをゲームのカウントを使っているのですが、
>タイトル画面ではそのカウントがないので、、、。

想定される条件が曖昧すぎますが、タイトル用のカウントを処理すれば他が適切にされていれば解決する気もします。

>あと、呼び出す名前を何が使えるのか見当が付かないのです。

何の名前でしょうか?
DXライブラリの関数名 → DXライブラリのリファレンスを御覧ください。 http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
龍神録の関数名 → 龍神録から関数名を抜粋して自分なりの整理メモ・テキストを作成して下さい。
龍神録の変数名 → 龍神録から変数名を・・・。以下同様。

Re: BGM

Posted: 2015年11月04日(水) 21:34
by とんとん
戻ってまいりました-。
カウントする奴以外の変数を作ってみたのですが、
うまく動きません。どこか根本的におかしいのでしょうか
お願い致します。

Re: BGM

Posted: 2015年11月04日(水) 21:41
by softya(ソフト屋)
とんとん さんが書きました:戻ってまいりました-。
カウントする奴以外の変数を作ってみたのですが、
うまく動きません。どこか根本的におかしいのでしょうか
お願い致します。
これだけの情報ではエスパーではないので、まったく分かりません。
ソースコードをお願いします。

>カウントする奴以外の変数を作ってみたのですが、

じゃあ、何の変数だろう?で思考停止。
情報の提供が不十分なので答えられないなのです。
あれ取っての、あれが想像もできない状態と言ってよいかと。

Re: BGM

Posted: 2015年11月05日(木) 21:22
by とんとん
int titlemusicf = 0;
これをmainの最初の
#define GLOBAL_INSTANCE
中に入れて、GV.hに定義したのです。
これを

コード:

        music_ini();
        switch(func_state){
            case 0://初回のみ入る処理
                load();     //データロード
				loaduserstate(); //ユーザー情報のロード
                first_ini();//初回の初期化
                func_state=98;//ここを98に
				titlemusicf = 1;
 
こんな感じに入れてみたのです。
そして、music.cppの方は

コード:

 
	if(area.bgm.flag==0){//最初に読み込む
		load_bgm(0);
		SetLoopPosSoundMem( area.bgm.loop_pos[0], area.bgm.handle );//ループ位置セット
		area.bgm.flag=1;
	}
	if(area.bgm.flag==1){//種類に応じて再生をはじめる
		switch(area.bgm.knd[0]){
			case 0://再生種類0なら
				if(titlemusicf ==1){//はじまって60カウント後に再生
					PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
					area.bgm.flag=2;
				}
				break;
といった感じに書き換えてみたのです。
変数はgamestartを選択したら0に戻るようにしてあります。

コード:

                if(CheckStateKey(KEY_INPUT_Z)==1)
                {
                    if(sel == 0){
						menucount = 1;
						titlemusicf = 0;
					}
 

何がどうダメなのかがわからず、
初心者でどこをどう説明すればいいかも分からずです。
面倒くさい人ですけど、よろしくおねがいします。

Re: BGM

Posted: 2015年11月06日(金) 15:35
by softya(ソフト屋)
とりあえず、music.cppの動作をよく理解されていないのは確認できました。
music.cppには通常の曲とボスの曲を切り替える機能がありますが、これを応用してタイトル曲を追加する事は出来るかと思います。
そのまえにmusic.cppの理解が必要ですので、試しにタイトル画面でボス曲を再生できるようにしてみてください。
そこまで理解できたら次に進みましょう。

titlemusicf 関連は一時的にコメントアウトして、music.cppを元通り動くようにしてください。

Re: BGM

Posted: 2015年11月06日(金) 21:42
by とんとん
どうしても理解できません。
コードは自分で何とかして書けるようにしたいので、
もう少し細かい説明をいただけませんか?
宜しくお願いします。

Re: BGM

Posted: 2015年11月06日(金) 21:51
by softya(ソフト屋)
解説しても理解した気になるだけの場合が多いので、もう少しがんばりましょう。
龍神録の48章まで動作を理解できずに来たのは、説明だけ読んで理解できた気になっていただけだと思います。
よく理解しようとしたら3から4章辺りから疑問だらけのはずですので。

では、music.cppを取り出して下記のプログラムと結合してみてください。必要なヘッダは自分で用意しましょう。
http://dixq.net/g/37.html
龍神録の基礎的な復習のようなものです。

それも難しいなら、music.cppに一行ごとにコメントを書いてみましょう。
music.cppが使っている変数にもコメントを書きます。

Re: BGM

Posted: 2015年11月07日(土) 21:14
by とんとん
お待たせしましたー。
解決しました。
解決の色々の方法をメモしておきます。

main.cpp
case 99://メニュー内で
bgm_main();をよぶ。

あと、music.cpp内に
PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
を入れ忘れていました。

コード:

	if(area.bgm.flag==0){//最初に読み込む
		load_bgm(0);
		SetLoopPosSoundMem( area.bgm.loop_pos[0], area.bgm.handle );//ループ位置セット
		area.bgm.flag=1;
	}
	if(area.bgm.flag==1){//種類に応じて再生をはじめる
		switch(area.bgm.knd[0]){
			case 0://再生種類0なら
				if(titlemusicf ==1){//はじまって60カウント後に再生
				//if(stage_count==0){//はじまって60カウント後に再生
					PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
					area.bgm.flag=2;
				}
				break;
			default:
				break;
		}
	}
softya(ソフト屋) さん、ありがとうございました。
また続きをがんばりますー。