ゲーム:サウンドの時間調整

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シャドウ

ゲーム:サウンドの時間調整

#1

投稿記事 by シャドウ » 5年前

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(TRUE); // ウィンドウモードに設定
DxLib_Init(); // DXライブラリ初期化処理

int Handle; // データハンドル格納用変数
Handle = LoadGraph("画像/game_back.png"); // 画像をロード
DrawGraph(0, 0, Handle, TRUE); // データハンドルを使って画像を描画



int Handle2, Count = 0;
Handle2 = LoadSoundMem("サウンド/bgm_gisau.wav"); // サウンド/1up.wavをロードし、識別番号をHandleに格納

// while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
while (ScreenFlip() == 0 && ProcessMessage() == 0) {

if (Count % 120 == 0) { // 2秒に一度
PlaySoundMem(Handle2, DX_PLAYTYPE_LOOP); // 効果音を再生する
}

Count++;

}



WaitKey(); // キー入力待ち
DxLib_End(); // DXライブラリ終了処理
return 0;
}
おはようございます。
ゲームを作っているのですが、増加しているカウンタを120で割った余りが0の時鳴らせば2秒に一度成らせることになるのであのような実行結果になっています。
と意味がよく解らないのですが、サウンドが流れている時間をもっと増やすにはどうしたら良いですか?
ループしてもすぐ途切れてしまうので(時間が短すぎる)のでもっと増やしたいです。
よろしくお願いします。

よもやま
記事: 68
登録日時: 8年前
連絡を取る:

Re: ゲーム:サウンドの時間調整

#2

投稿記事 by よもやま » 5年前

”あのような実行結果”とはなんぞや?

シャドウ

Re: ゲーム:サウンドの時間調整

#3

投稿記事 by シャドウ » 5年前

https://dixq.net/g/02_07.html
ここと同じサイトを参考にさせてもらっています。

あのようなは少々揶揄的な表現ですよね。

シャドウ

Re: ゲーム:サウンドの時間調整

#4

投稿記事 by シャドウ » 5年前

解決しました、どうもお手数かけました。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: ゲーム:サウンドの時間調整

#5

投稿記事 by Dixq (管理人) » 5年前

そのコードだと2秒毎に無限ループする効果音が鳴り始めそうですが、やりたいこととあってますか?

# 全然質問とは関係ないですが、そこで「揶揄的な表現」って変じゃないですかね。
# 本当に、揶揄う(からかう)意図があったのなら別ですが…。比喩的でもないし、抽象的とかでしょうか。

シャドウ

Re: ゲーム:サウンドの時間調整

#6

投稿記事 by シャドウ » 5年前

回答ありがとうございます。
揶揄ではなっく抽象的でした、失礼しました。
割られる数を増やしたら、解決しました。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: ゲーム:サウンドの時間調整

#7

投稿記事 by Dixq (管理人) » 5年前

いちいちつっかかるようで申し訳ないですが、割られる数ってCountのことですよね?
何故これを増やすと解決するのか分かりません・・。
あと、上で言ったように何故DX_PLAYTYPE_BACKをDX_PLAYTYPE_LOOPにしているのかも・・。

シャドウ

Re: ゲーム:サウンドの時間調整

#8

投稿記事 by シャドウ » 5年前

countと割る数を逆にして電卓で計算したら、秒数がなぜか出てきました。
LOOPは何度も音楽を流したいので使っています。

シャドウ

Re: ゲーム:サウンドの時間調整

#9

投稿記事 by シャドウ » 5年前

こんばんは。
サウンドを長い間流すことが出来ると思ったのですが、勘違いでした。
[/code]
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
ChangeWindowMode(TRUE); // ウィンドウモードに変更
if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理

int image, image2; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph("画像/game_back.png"); //back.bmpのハンドルを代入
image2 = LoadGraph("画像/game_logo.png"); //char.pngのハンドルを代入

DrawGraph(0, 0, image, FALSE); //back.bmpを表示
DrawGraph(150, 10, image2, FALSE); //char.pngを表示

int Handle, count = 0;
Handle = LoadSoundMem("サウンド/1up.wav");

if (count % 120 =! 0) { // 2秒に一度
PlaySoundMem(Handle, DX_PLAYTYPE_BACK); // 効果音を再生する


count++;

}
WaitKey(); //何かキー入力があるまで待つ
DxLib_End(); //DXライブラリの終了処理
return 0;
}
[/code]
大体、一分ぐらいBGMの方を流したいのですが、どういう記述をすればよいでしょうか?
よろしくお願いします。

シャドウ

Re: ゲーム:サウンドの時間調整

#10

投稿記事 by シャドウ » 5年前

申し訳ありません、できていました。
ですが意味を理解できていません。

コード:

#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
	ChangeWindowMode(TRUE);               // ウィンドウモードに変更
	if (DxLib_Init() == -1) return -1;     // DXライブラリ初期化処理

	int image, image2;                      //ハンドルを受け取るためのint型変数を宣言
	image = LoadGraph("画像/game_back.png");       //back.bmpのハンドルを代入
	image2 = LoadGraph("画像/game_logo.png");       //char.pngのハンドルを代入
	
	DrawGraph(0, 0, image, FALSE);    //back.bmpを表示
	DrawGraph(150, 10, image2, FALSE);    //char.pngを表示
	
	int Handle, count = 0;
	Handle = LoadSoundMem("サウンド/bgm_yume.wav");
	
	if (count % 120 == 0) { // 2秒に一度
		PlaySoundMem(Handle, DX_PLAYTYPE_BACK); // 効果音を再生する


		count++;
		
	}
	WaitKey();                               //何かキー入力があるまで待つ
	DxLib_End();                            //DXライブラリの終了処理
	return 0;
}
ここの音楽を流す部分だけ教えて下さい、2秒に一度というのもよく解りません。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: ゲーム:サウンドの時間調整

#11

投稿記事 by Dixq (管理人) » 5年前

えぇと最終的には思ったことができていないということでいいのでしょうか?
やりたいことは1分位のBGMを流すだけですか?
2秒に一回やりたいことは何ですか?

これは別のトピックでもいっているDXライブラリの最小限のコードが入っていません。
メインループを作る必要があります。
現在のコードはただ一瞬で処理がWaitKeyまで進んでそこで待機しているだけです。
まずは1.9章の最小限のコードを組み込んでください。

シャドウ

Re: ゲーム:サウンドの時間調整

#12

投稿記事 by シャドウ » 5年前

こんにちは、遅くなってすみません。
修正しました。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定
	
	int Handle, Count = 0;
	
	Handle = LoadSoundMem("サウンド/bgm_yume.wav"); // サウンド/1up.wavをロードし、識別番号をHandleに格納

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {

		int image;                       //ハンドルを受け取るためのint型変数を宣言
		image = LoadGraph("画像/game_back.png");       //back.bmpのハンドルを代入
		

		DrawGraph(0, 0, image, TRUE);    //back.bmpを表示
		
		
		if (Count % 120 == 0) { // 2秒に一度
			PlaySoundMem(Handle, DX_PLAYTYPE_BACK); // 効果音を再生する
		}

		Count++;


	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}
BGMは、一分ぐらい流したいのですが、
どういう記述をすればいいのでしょうか?
結局解らずじまいですみません。
よろしくお願いします。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: ゲーム:サウンドの時間調整

#13

投稿記事 by Dixq (管理人) » 5年前

LoadGraphがものすごい勢いでメモリリークさせています。
newしているのにdeleteしていない状態です。
画像のロードはメインループに入る前に行ってください。

鳴らした音を正確に1分後に止めたいなら、時間を測る方がよいです。
全てのモニタが60Hzで動いているわけではありません。
ゲーミングモニタ等は144Hzなどもありますので、FPSを制御していない状態でカウンタに頼るのは危険です。

GetNowCountという関数で現在のミリ秒が取得できるので、それで60*1000ミリ秒測って止める方がよいでしょう。
ソースコードの例はこのようになります。

コード:

#include "DxLib.h"

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

    const int startTime = GetNowCount();
    const int image = LoadGraph("画像/game_back.png");
    const int sound = LoadSoundMem("サウンド/bgm_yume.wav");
    const int isPlaying = 1;

    PlaySoundMem(sound, DX_PLAYTYPE_BACK);

    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {

        DrawGraph(0, 0, image, TRUE);

        if (GetNowCount() - startTime > 60 * 1000) {
            if (CheckSoundMem(sound) == isPlaying) {
                StopSoundMem(sound);
            }
        }
    }

    DxLib_End(); // DXライブラリ終了処理
    return 0;
}

シャドウ

Re: ゲーム:サウンドの時間調整

#14

投稿記事 by シャドウ » 5年前

こんばんは、返信大変遅くなりました、申し訳ありませんでした;

コード:

#include "DxLib.h"

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

    const int startTime = GetNowCount();
    const int image = LoadGraph("画像/game_back.png");
    const int sound = LoadSoundMem("サウンド/bgm_yume.wav");
    const int isPlaying = 1;

    PlaySoundMem(sound, DX_PLAYTYPE_LOOP);

    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {

        DrawGraph(0, 0, image, TRUE);

        if (GetNowCount() - startTime > 60 * 1000) {
            if (CheckSoundMem(sound) == isPlaying) {
           
            }
        }
    }

    DxLib_End(); // DXライブラリ終了処理
    return 0;
}
ifのブロックの中のstopの所は、音楽を繰り返したいので消しました。
結果60 * 1000で一分なので最後まで音も流れました。
ありがとうございました。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: ゲーム:サウンドの時間調整

#15

投稿記事 by Dixq (管理人) » 5年前

> シャドウさん

stopを消したらif文や時間計測関連の処理がなんの意味もなしていませんよね・・。

「1分間音楽を再生したい」とのことでしたが、ずっと再生されていればそれでいいのでしょうか?
これだと終わることなく延々と音楽を繰り返し再生し続けるように思いますが。
ただ延々と音楽を再生するだけであれば以下のコードでよいですよ。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
    const int sound = LoadSoundMem("サウンド/bgm_yume.wav");
    PlaySoundMem(sound, DX_PLAYTYPE_LOOP);
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {

    }
    DxLib_End();
    return 0;
}

シャドウ

Re: ゲーム:サウンドの時間調整

#16

投稿記事 by シャドウ » 5年前

そうだったんですか・・・;
何にも解ってませんね、私…汗。
毎度新しいコード書いて頂きすみません。
精進します。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: ゲーム:サウンドの時間調整

#17

投稿記事 by Dixq (管理人) » 5年前

一つ一つのコードの理解をしながら書いてみてください。
https://dixq.net/g/
の内容をよく読んでいただいたらDXライブラリの使い方は分かると思います。
書いていて一行でも分からないコードがあれば質問しながら一つ一つ理解しながらコーディングを進めてみてください。
沢山トピックを立ててもらっても構いませんので。

C言語についてよく分からないということであれば書籍で勉強してみてください。

超初心者用ならこちら

少し初心者用ならこちら

がおすすめです。

シャドウ

Re: ゲーム:サウンドの時間調整

#18

投稿記事 by シャドウ » 5年前

管理人さんありがとうございます。
C言語の方も勉強していこうと思います。

返信

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