ゲーム中どこでも使う効果音について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ここあわい
記事: 5
登録日時: 8年前
住所: 千葉

ゲーム中どこでも使う効果音について

#1

投稿記事 by ここあわい » 8年前

ゲームの項目を移動するときに鳴る「ピッ」って効果音をLoadSoundMem()したいです。

今のところ簡潔に、
WinMein(){
  DxLib_Init();
  Title(); //タイトル画面
  Menu(); //メニュー画面
}
みたいな構造です。
どこでも使う効果音なので外部変数で最初にメモリに入れちゃおうと思ったのですがCheckSoundMem()に-1が返ってきました。
過去のスレを検索したらどうやらWinMeinにあるDxLib_Init()のせいで出来ないそうです。
ならばと思い、DxLib_Init()の後にLoadSoundMem()をしハンドルをTitle()に渡したのですが、それもCheckSoundMem()に-1が返ってきました。

全く同じ処理をそれぞれの関数の最初に書くのはあまり美しくないような気がするのですが、そうするしかないのでしょうか。
そもそもこのゲームの構造自体が悪いのでしょうか。
また、ハンドルをTitle()に渡してもダメな理由は何でしょうか。

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

Re: ゲーム中どこでも使う効果音について

#2

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

情報が少なく、答えにくく感じます。
抽象的な構造だけでなく、実際のコード(最小限の・自己完結した・確認可能なサンプルコード)を提示していただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: ゲーム中どこでも使う効果音について

#3

投稿記事 by あんどーなつ » 8年前

WinMain関数の中にwhileループ必要だった気がします。

コード:

int scene = 0;
WinMain() {
  if (DxLib_Init() == -1) return -1;
  while (1) {
    static prev = 0; // シーンの前値検出用
    if (prev != scene) {
      音を鳴らす;
    }
    switch (scene) {
    case 0: DrawTitle(); break;
    case 1: DrawMenu(); break;
    }
    prev = scene;
  }
  return 0;
}
こんなのでどうでしょうか?

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

Re: ゲーム中どこでも使う効果音について

#4

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

あんどーなつ さんが書きました:こんなのでどうでしょうか?
多分ダメでしょう。
なぜなら、prev = scene;の直後にif (prev != scene) {という判定をしており、
(デバッガや宇宙線、ハードウェアの不都合などでデータが書き換わらければ)この判定は必ず偽になるので、不自然だからです。

DrawTitleやDrawMenu()の中でsceneが別の値に書換えられたことを検出するには、
例えばprev = scene;をswitch (scene) {の直前に移動するといいでしょう。
オフトピック
そもそもこれがここあわいさんのやりたいことに合っているかわかりませんが。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ここあわい
記事: 5
登録日時: 8年前
住所: 千葉

Re: ゲーム中どこでも使う効果音について

#5

投稿記事 by ここあわい » 8年前

最小限の・自己完結した・確認可能なサンプルコードを提示しようとシンプルなものを作ったら、
「DxLib_Init()の後にLoadSoundMem()をしハンドルをTitle()に渡した」やり方が成功してしまいました。
どうやら別の部分に問題があったみたいです。
次回からはもう少し自分で足掻いてから質問しようと思います。
大変失礼しました。

ここあわい
記事: 5
登録日時: 8年前
住所: 千葉

Re: ゲーム中どこでも使う効果音について

#6

投稿記事 by ここあわい » 8年前

せっかくなので、以下がそのサンプルコードです。

コード:

#include "DxLib.h"

int Title(int);

int White = GetColor(255, 255, 255);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	DxLib_Init();
	ChangeWindowMode(TRUE);

	int Push1 = LoadSoundMem("Se/Push1.mp3");

	Title(Push1);

	DxLib_End();
	return 0;
}

int Title(int Push1)
{
	PlaySoundMem(Push1, DX_PLAYTYPE_BACK);

	//ここでエラーが出力される
	if (CheckSoundMem(Push1) == 1) {
		DrawString(0, 0, "再生成功", White);
	}
	else
	if (CheckSoundMem(Push1) == -1) {
			DrawString(0, 0, "エラー", White);
	}
	WaitKey();
	return 0;
}
大変失礼しました。

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: ゲーム中どこでも使う効果音について

#7

投稿記事 by あんどーなつ » 8年前

???Menuは?

みけCAT さん

疑似コードが間違ってるからといって怒らないでもらいたいです。
日本語で伝えるのが難しくてコードにするのも時間がかかるから書いてるだけなんですから。
そもそもDXライブラリを使ったことあるんですか?

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

Re: ゲーム中どこでも使う効果音について

#8

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

あんどーなつ さんが書きました:疑似コードが間違ってるからといって怒らないでもらいたいです。
間違いを指摘しただけで、怒ったことを示す書き込みはしていません。
間違いを指摘されたからといって怒らないでもらいたいです。
あんどーなつ さんが書きました:そもそもDXライブラリを使ったことあるんですか?
はい。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: ゲーム中どこでも使う効果音について

#9

投稿記事 by あんどーなつ » 8年前

先ほどのコード例は、ハンドルをTitleに渡すことができる、ことを示していたのですね。
了解です。

ちなみに、同じ記述を書かなくてもよくするには、オブジェクト指向を使うという手があります。

コード:

class Scene {
  public: Scene() { 音が鳴る処理; } };
class Title : public Scene { Title特有の記述 };
class Menu : public Scene { Menu特有の記述 };
WinMain() {
  DxLib_Init();
  { Title title; } // まず、音が鳴って、title画面が表示されます。
  { Menu menu; } // 次に、音が鳴って、menu画面が表示されます。
  return 0;
}
C言語でいろいろできるようになってから勉強してみてください。

閉鎖

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