CheckSoundMemの使いかたがわかりません!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
LEMO
記事: 23
登録日時: 9年前
住所: 関東地方ですね

CheckSoundMemの使いかたがわかりません!

#1

投稿記事 by LEMO » 8年前

CheckSoundMemでMainSoundという曲を監視して
もしも流れていなかったら再生、流れていたらスルーという処理を作りたいです

使わないでやってみたところ、1ループごとに再生されてしまい、すごくおかしいです!
リファレンスのやつの

コード:

while( CheckSoundMem( SHandle ) == 1 )

コード:

if ( CheckSoundMem( MainSound ) == 0 ){
PlaySoundMem(MainSound,DX_PLAYTYPE_LOOP);
}
に変えてみました
想像として、再生中じゃなかったら再生、再生してあったらスルーを思っていましたが
できませんでした



CheckSoundMemの使い方を教えてください!

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: CheckSoundMemの使いかたがわかりません!

#2

投稿記事 by みけCAT » 8年前

LEMO さんが書きました: リファレンスのやつの

コード:

while( CheckSoundMem( SHandle ) == 1 )

コード:

if ( CheckSoundMem( MainSound ) == 0 ){
PlaySoundMem(MainSound,DX_PLAYTYPE_LOOP);
}
に変えてみました
「リファレンスのやつ」がDXライブラリのCheckSoundMem関数の所に載っている

コード:

#include "DxLib.h"

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

    if( DxLib_Init() == -1 )    // DXライブラリ初期化処理
    {
         return -1;    // エラーが起きたら直ちに終了
    }

    // test.wavのメモリへの読み込みサウンドハンドルをSHandleに保存します
    SHandle = LoadSoundMem( "test.wav" ) ;

    // 読みこんだ音をバックグラウンド再生します(『PlaySoundMem』関数使用)
    PlaySoundMem( SHandle , DX_PLAYTYPE_NORMAL ) ;

    // なり終わるまでここでループ
    while( CheckSoundMem( SHandle ) == 1 )
    {
        // メッセージ処理
        if( ProcessMessage() == -1 )
        {
            break ;    // エラーが起きたらループを抜ける
        }
    }

    DxLib_End() ;        // DXライブラリ使用の終了処理

    return 0 ;        // ソフトの終了
}
のことだと仮定すると、このコードにはバックグラウンド再生をしたいはずなのにDX_PLAYTYPE_NORMALが使用されているというバグ(?)がある上、
書かれている通りwhile文をif文に変えると(ユーザーから見える)「ループ」は無くなってしまいます。
オフトピック
なぜかDX_PLAYTYPE_NORMALが使用されている件は、公式の掲示板に投稿しました。
最小限で、かつコンパイルして検証できるように必要なものが揃ったコードを提示していただけますか?
LEMO さんが書きました: 使わないでやってみたところ、1ループごとに再生されてしまい、すごくおかしいです!
使ってやった場合はどうなりましたか?
LEMO さんが書きました: 想像として、再生中じゃなかったら再生、再生してあったらスルーを思っていましたが
できませんでした
どういう根拠(実験の内容とその結果など)をもとに「できませんでした」と判断したのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

LEMO
記事: 23
登録日時: 9年前
住所: 関東地方ですね

Re: CheckSoundMemの使いかたがわかりません!

#3

投稿記事 by LEMO » 8年前

このコードが全てです
新ゲームプログラムの館さんにそのまま書き足している感じです

コード:

#include "DxLib.h"


typedef enum {
	eScene_Menu,    //メニュー画面
	eScene_Game,    //ゲーム画面
	eScene_Config,  //設定画面
	eScene_Title,
} eScene;

static int Scene = eScene_Title;  //現在の画面(シーン)

								   //シーンを更新する
void UpdateScene() {
	DrawString(0, 20, "Gキーでゲーム画面、Cキーで設定、Mキーでメニュー画面になります。", GetColor(255, 255, 255));
	if (CheckHitKey(KEY_INPUT_G) != 0) {
		Scene = eScene_Game;
	}
	if (CheckHitKey(KEY_INPUT_C) != 0) {
		Scene = eScene_Config;
	}
	if (CheckHitKey(KEY_INPUT_M) != 0) {
		Scene = eScene_Menu;
	}
	if (CheckHitKey(KEY_INPUT_T) != 0) {
		Scene = eScene_Title;
	}
}

//メニュー画面
void Menu() {

		
}

//ゲーム画面
void Game() {
	DrawString(0, 0, "ゲーム画面です。", GetColor(255, 255, 255));


}

//設定画面
void Config() {
	DrawString(0, 0, "設定画面です。", GetColor(255, 255, 255));

}

void Title() {
	int GH[10];
	int MainSound;
	GH[0] = LoadGraph("image/title.jpg");
	MainSound = LoadSoundMem("Sound/TS/title.ogg");

	DrawString(0, 0, "メニュー画面です。", GetColor(255, 255, 255));
	DrawGraph(0, 0, GH[0], TRUE);
	if( CheckSoundMem(MainSound ) == 0 ) {
        PlaySoundMem( MainSound, DX_PLAYTYPE_BACK ) ;
    }
		;

}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
		SetGraphMode(1200, 720, 32);

		int GH[10];
		GH[0] = LoadGraph("image/title.jpg");



		switch (Scene) {//現在のシーンにあった処理をする
		case eScene_Menu://現在のシーンがメニューなら
			Menu();//メニュー画面
			break;
		case eScene_Game://現在のシーンがゲームなら
			Game();//ゲーム画面
			break;
		case eScene_Config://現在のシーンが設定なら
			Config();//設定画面
			break;
		case eScene_Title:
			Title();
			break;

		}

		UpdateScene();//シーンを更新する


		if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) {
			break;
		}
	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}
結果としては再生しているのにもかかわらず、追加で更に再生されてしまいます

できない、と判断した理由は再生中じゃなかったら再生、はできるのですが
再生だったら処理をスルーというのができなかったからです

質問させてもらっている立場なのに、ちゃんとした文ではなくてすみませんでした

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: CheckSoundMemの使いかたがわかりません!

#4

投稿記事 by みけCAT » 8年前

まず、メモリに大量の無駄が発生し、システムの限界に到達して誤動作の原因になる可能性も考えられるので、
毎フレーム画像や音声をロードするのをやめてください。

【追記】毎フレーム同じ値でSetGraphModeするというのもおかしな話でしょう。
最後に編集したユーザー みけCAT on 2016年12月08日(木) 20:02 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: CheckSoundMemの使いかたがわかりません!

#5

投稿記事 by みけCAT » 8年前

LEMO さんが書きました:再生中じゃなかったら再生、はできるのですが
再生だったら処理をスルーというのができなかったからです
それは常に新しいまだ再生していない音声データについてチェックしていて、「再生だったら」のパターンを実行していないからでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

LEMO
記事: 23
登録日時: 9年前
住所: 関東地方ですね

Re: CheckSoundMemの使いかたがわかりません!

#6

投稿記事 by LEMO » 8年前

ご指摘ありがとうございます!

何度もすみません
どのようにすればちゃんとチェックできるようになるのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: CheckSoundMemの使いかたがわかりません!

#7

投稿記事 by みけCAT » 8年前

LEMO さんが書きました:どのようにすればちゃんとチェックできるようになるのでしょうか?
まずは、チェック対象のハンドルを即投げ捨てるのではなく、ちゃんと次のフレーム以降にも使える場所(静的変数かグローバル変数)に保存しましょう。
もちろん、せっかく保存したハンドルを次のフレームで別のデータに上書きしてはダメですよ。
保存したハンドルを用いてチェックをしましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

LEMO
記事: 23
登録日時: 9年前
住所: 関東地方ですね

Re: CheckSoundMemの使いかたがわかりません!

#8

投稿記事 by LEMO » 8年前

int MainSound;
にstaticをつければいいのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: CheckSoundMemの使いかたがわかりません!

#9

投稿記事 by みけCAT » 8年前

LEMO さんが書きました:int MainSound;
にstaticをつければいいのでしょうか?
それも含めて音声を1度だけ読み込んで以降そのハンドルを使うようなプログラムをちゃんと書けばいいですが、それだけではだめです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

LEMO
記事: 23
登録日時: 9年前
住所: 関東地方ですね

Re: CheckSoundMemの使いかたがわかりません!

#10

投稿記事 by LEMO » 8年前

まったくやり方がわかりません.....
ですが、頑張って模索してみます!
解決したら報告させていただきます

C6b14

Re: CheckSoundMemの使いかたがわかりません!

#11

投稿記事 by C6b14 » 8年前

面白そうなので今までの意見とコードを参考にして作っています(動くコードなので)。言われてることが当たっているとおもいます。

コード:

#include "DxLib.h"
//グローバル変数:staticにしこのファイル外からは操作出来なくする
static int GH[10];     //画像ハンドル
static int MainSound; //音ハンドル
 
typedef enum {
    eScene_Menu,    //メニュー画面
    eScene_Game,    //ゲーム画面
    eScene_Config,  //設定画面
    eScene_Title,
} eScene;
 
static int Scene = eScene_Title;  //現在の画面(シーン)
 
                                   //シーンを更新する
void UpdateScene() {
    DrawString(0, 20, "Gキーでゲーム画面、Cキーで設定、Mキーでメニュー画面になります。", GetColor(255, 255, 255));
    if (CheckHitKey(KEY_INPUT_G) != 0) {
        Scene = eScene_Game;
    }
    if (CheckHitKey(KEY_INPUT_C) != 0) {
        Scene = eScene_Config;
    }
    if (CheckHitKey(KEY_INPUT_M) != 0) {
        Scene = eScene_Menu;
    }
    if (CheckHitKey(KEY_INPUT_T) != 0) {
        Scene = eScene_Title;
    }
}
 
//メニュー画面
void Menu() {
 
        
}
 
//ゲーム画面
void Game() {
    DrawString(0, 0, "ゲーム画面です。", GetColor(255, 255, 255));
 
 
}
 
//設定画面
void Config() {
    DrawString(0, 0, "設定画面です。", GetColor(255, 255, 255));
 
}
 
void Title() {
    //int GH[10];グローバル変数とする。
    //int MainSound;
    //GH[0] = LoadGraph("image/title.jpg");
    //MainSound = LoadSoundMem("Sound/TS/title.wav"); //ogg");
 
    DrawString(0, 0, "メニュー画面です。", GetColor(255, 255, 255));
    DrawGraph(0, 0, GH[0], TRUE);
    if( CheckSoundMem(MainSound ) == 0 ) {
        PlaySoundMem( MainSound, DX_PLAYTYPE_BACK ) ;
    }
        ;
 
}
void Init(){ //初期化処理としてまとめた方がいいと思うものです
	//ウィンドウモード変更と初期化と裏画面設定
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
	SetGraphMode(1200, 720, 32);//画面設定は初期化時に一度だけにする
    GH[0] = LoadGraph("image/title.jpg");//Title画面ロード
    MainSound = LoadSoundMem("Sound/TS/title.wav"); //ogg");
} 
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {

    Init();//初期化処理

    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
       //SetGraphMode(1200, 720, 32);
 
        //int GH[10];
        //GH[0] = LoadGraph("image/title.jpg");
 
         switch (Scene) {//現在のシーンにあった処理をする
        case eScene_Menu://現在のシーンがメニューなら
            Menu();//メニュー画面
            break;
        case eScene_Game://現在のシーンがゲームなら
            Game();//ゲーム画面
            break;
        case eScene_Config://現在のシーンが設定なら
            Config();//設定画面
            break;
        case eScene_Title:
            Title();
            break;
 
        }
 
        UpdateScene();//シーンを更新する
 
         if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) {
            break;
        }
    }
     DxLib_End(); // DXライブラリ終了処理
    return 0;
}

LEMO
記事: 23
登録日時: 9年前
住所: 関東地方ですね

Re: CheckSoundMemの使いかたがわかりません!

#12

投稿記事 by LEMO » 8年前

自分でいろいろ調べてみましたがどうしてもできませんでした....
Cbさん、コードありがとうございます!
みけさん、何度も教えていただきありがとうございます!
C言語の基本からもう一度よく見てみたいと思います
ありがとうございました!

閉鎖

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