CheckSoundMemの使いかたがわかりません!
CheckSoundMemの使いかたがわかりません!
CheckSoundMemでMainSoundという曲を監視して
もしも流れていなかったら再生、流れていたらスルーという処理を作りたいです
使わないでやってみたところ、1ループごとに再生されてしまい、すごくおかしいです!
リファレンスのやつの を に変えてみました
想像として、再生中じゃなかったら再生、再生してあったらスルーを思っていましたが
できませんでした
CheckSoundMemの使い方を教えてください!
もしも流れていなかったら再生、流れていたらスルーという処理を作りたいです
使わないでやってみたところ、1ループごとに再生されてしまい、すごくおかしいです!
リファレンスのやつの を に変えてみました
想像として、再生中じゃなかったら再生、再生してあったらスルーを思っていましたが
できませんでした
CheckSoundMemの使い方を教えてください!
Re: CheckSoundMemの使いかたがわかりません!
「リファレンスのやつ」がDXライブラリのCheckSoundMem関数の所に載っている
のことだと仮定すると、このコードにはバックグラウンド再生をしたいはずなのにDX_PLAYTYPE_NORMALが使用されているというバグ(?)がある上、#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 ; // ソフトの終了 }
書かれている通りwhile文をif文に変えると(ユーザーから見える)「ループ」は無くなってしまいます。
オフトピック
なぜかDX_PLAYTYPE_NORMALが使用されている件は、公式の掲示板に投稿しました。
使ってやった場合はどうなりましたか?LEMO さんが書きました: 使わないでやってみたところ、1ループごとに再生されてしまい、すごくおかしいです!
どういう根拠(実験の内容とその結果など)をもとに「できませんでした」と判断したのですか?LEMO さんが書きました: 想像として、再生中じゃなかったら再生、再生してあったらスルーを思っていましたが
できませんでした
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: CheckSoundMemの使いかたがわかりません!
このコードが全てです
新ゲームプログラムの館さんにそのまま書き足している感じです
結果としては再生しているのにもかかわらず、追加で更に再生されてしまいます
できない、と判断した理由は再生中じゃなかったら再生、はできるのですが
再生だったら処理をスルーというのができなかったからです
質問させてもらっている立場なのに、ちゃんとした文ではなくてすみませんでした
新ゲームプログラムの館さんにそのまま書き足している感じです
#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の使いかたがわかりません!
まず、メモリに大量の無駄が発生し、システムの限界に到達して誤動作の原因になる可能性も考えられるので、
毎フレーム画像や音声をロードするのをやめてください。
【追記】毎フレーム同じ値でSetGraphModeするというのもおかしな話でしょう。
毎フレーム画像や音声をロードするのをやめてください。
【追記】毎フレーム同じ値でSetGraphModeするというのもおかしな話でしょう。
最後に編集したユーザー みけCAT on 2016年12月08日(木) 20:02 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: CheckSoundMemの使いかたがわかりません!
それは常に新しいまだ再生していない音声データについてチェックしていて、「再生だったら」のパターンを実行していないからでしょう。LEMO さんが書きました:再生中じゃなかったら再生、はできるのですが
再生だったら処理をスルーというのができなかったからです
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: CheckSoundMemの使いかたがわかりません!
ご指摘ありがとうございます!
何度もすみません
どのようにすればちゃんとチェックできるようになるのでしょうか?
何度もすみません
どのようにすればちゃんとチェックできるようになるのでしょうか?
Re: CheckSoundMemの使いかたがわかりません!
まずは、チェック対象のハンドルを即投げ捨てるのではなく、ちゃんと次のフレーム以降にも使える場所(静的変数かグローバル変数)に保存しましょう。LEMO さんが書きました:どのようにすればちゃんとチェックできるようになるのでしょうか?
もちろん、せっかく保存したハンドルを次のフレームで別のデータに上書きしてはダメですよ。
保存したハンドルを用いてチェックをしましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: CheckSoundMemの使いかたがわかりません!
int MainSound;
にstaticをつければいいのでしょうか?
にstaticをつければいいのでしょうか?
Re: CheckSoundMemの使いかたがわかりません!
それも含めて音声を1度だけ読み込んで以降そのハンドルを使うようなプログラムをちゃんと書けばいいですが、それだけではだめです。LEMO さんが書きました:int MainSound;
にstaticをつければいいのでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: CheckSoundMemの使いかたがわかりません!
まったくやり方がわかりません.....
ですが、頑張って模索してみます!
解決したら報告させていただきます
ですが、頑張って模索してみます!
解決したら報告させていただきます
Re: CheckSoundMemの使いかたがわかりません!
面白そうなので今までの意見とコードを参考にして作っています(動くコードなので)。言われてることが当たっているとおもいます。
#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の使いかたがわかりません!
自分でいろいろ調べてみましたがどうしてもできませんでした....
Cbさん、コードありがとうございます!
みけさん、何度も教えていただきありがとうございます!
C言語の基本からもう一度よく見てみたいと思います
ありがとうございました!
Cbさん、コードありがとうございます!
みけさん、何度も教えていただきありがとうございます!
C言語の基本からもう一度よく見てみたいと思います
ありがとうございました!