ページ 1 / 1
CheckSoundMemの使いかたがわかりません!
Posted: 2016年12月07日(水) 23:42
by LEMO
CheckSoundMemでMainSoundという曲を監視して
もしも流れていなかったら再生、流れていたらスルーという処理を作りたいです
使わないでやってみたところ、1ループごとに再生されてしまい、すごくおかしいです!
リファレンスのやつの
コード:
while( CheckSoundMem( SHandle ) == 1 )
を
コード:
if ( CheckSoundMem( MainSound ) == 0 ){
PlaySoundMem(MainSound,DX_PLAYTYPE_LOOP);
}
に変えてみました
想像として、再生中じゃなかったら再生、再生してあったらスルーを思っていましたが
できませんでした
CheckSoundMemの使い方を教えてください!
Re: CheckSoundMemの使いかたがわかりません!
Posted: 2016年12月08日(木) 00:08
by みけCAT
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 さんが書きました:
想像として、再生中じゃなかったら再生、再生してあったらスルーを思っていましたが
できませんでした
どういう根拠(実験の内容とその結果など)をもとに「できませんでした」と判断したのですか?
Re: CheckSoundMemの使いかたがわかりません!
Posted: 2016年12月08日(木) 17:40
by LEMO
このコードが全てです
新ゲームプログラムの館さんにそのまま書き足している感じです
コード:
#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;
}
結果としては再生しているのにもかかわらず、追加で更に再生されてしまいます
できない、と判断した理由は再生中じゃなかったら再生、はできるのですが
再生だったら処理をスルーというのができなかったからです
質問させてもらっている立場なのに、ちゃんとした文ではなくてすみませんでした
Re: CheckSoundMemの使いかたがわかりません!
Posted: 2016年12月08日(木) 19:51
by みけCAT
まず、メモリに大量の無駄が発生し、システムの限界に到達して誤動作の原因になる可能性も考えられるので、
毎フレーム画像や音声をロードするのをやめてください。
【追記】毎フレーム同じ値でSetGraphModeするというのもおかしな話でしょう。
Re: CheckSoundMemの使いかたがわかりません!
Posted: 2016年12月08日(木) 20:00
by みけCAT
LEMO さんが書きました:再生中じゃなかったら再生、はできるのですが
再生だったら処理をスルーというのができなかったからです
それは常に新しいまだ再生していない音声データについてチェックしていて、「再生だったら」のパターンを実行していないからでしょう。
Re: CheckSoundMemの使いかたがわかりません!
Posted: 2016年12月08日(木) 22:19
by LEMO
ご指摘ありがとうございます!
何度もすみません
どのようにすればちゃんとチェックできるようになるのでしょうか?
Re: CheckSoundMemの使いかたがわかりません!
Posted: 2016年12月08日(木) 22:26
by みけCAT
LEMO さんが書きました:どのようにすればちゃんとチェックできるようになるのでしょうか?
まずは、チェック対象のハンドルを即投げ捨てるのではなく、ちゃんと次のフレーム以降にも使える場所(静的変数かグローバル変数)に保存しましょう。
もちろん、せっかく保存したハンドルを次のフレームで別のデータに上書きしてはダメですよ。
保存したハンドルを用いてチェックをしましょう。
Re: CheckSoundMemの使いかたがわかりません!
Posted: 2016年12月08日(木) 22:41
by LEMO
int MainSound;
にstaticをつければいいのでしょうか?
Re: CheckSoundMemの使いかたがわかりません!
Posted: 2016年12月08日(木) 23:02
by みけCAT
LEMO さんが書きました:int MainSound;
にstaticをつければいいのでしょうか?
それも含めて音声を1度だけ読み込んで以降そのハンドルを使うようなプログラムをちゃんと書けばいいですが、それだけではだめです。
Re: CheckSoundMemの使いかたがわかりません!
Posted: 2016年12月08日(木) 23:21
by LEMO
まったくやり方がわかりません.....
ですが、頑張って模索してみます!
解決したら報告させていただきます
Re: CheckSoundMemの使いかたがわかりません!
Posted: 2016年12月09日(金) 12:47
by C6b14
面白そうなので今までの意見とコードを参考にして作っています(動くコードなので)。言われてることが当たっているとおもいます。
コード:
#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;
}
Re: CheckSoundMemの使いかたがわかりません!
Posted: 2016年12月10日(土) 18:13
by LEMO
自分でいろいろ調べてみましたがどうしてもできませんでした....
Cbさん、コードありがとうございます!
みけさん、何度も教えていただきありがとうございます!
C言語の基本からもう一度よく見てみたいと思います
ありがとうございました!