ページ 11

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

Posted: 2016年11月06日(日) 02:47
by ここあわい
ゲームの項目を移動するときに鳴る「ピッ」って効果音をLoadSoundMem()したいです。

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

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

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

Posted: 2016年11月06日(日) 07:41
by みけCAT
情報が少なく、答えにくく感じます。
抽象的な構造だけでなく、実際のコード(最小限の・自己完結した・確認可能なサンプルコード)を提示していただけますか?

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

Posted: 2016年11月06日(日) 11:40
by あんどーなつ
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;
}
こんなのでどうでしょうか?

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

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

DrawTitleやDrawMenu()の中でsceneが別の値に書換えられたことを検出するには、
例えばprev = scene;をswitch (scene) {の直前に移動するといいでしょう。
オフトピック
そもそもこれがここあわいさんのやりたいことに合っているかわかりませんが。

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

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

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

Posted: 2016年11月06日(日) 18:38
by ここあわい
せっかくなので、以下がそのサンプルコードです。

コード:

#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;
}
大変失礼しました。

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

Posted: 2016年11月06日(日) 18:55
by あんどーなつ
???Menuは?

みけCAT さん

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

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

Posted: 2016年11月06日(日) 19:04
by みけCAT
あんどーなつ さんが書きました:疑似コードが間違ってるからといって怒らないでもらいたいです。
間違いを指摘しただけで、怒ったことを示す書き込みはしていません。
間違いを指摘されたからといって怒らないでもらいたいです。
あんどーなつ さんが書きました:そもそもDXライブラリを使ったことあるんですか?
はい。

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

Posted: 2016年11月06日(日) 19:42
by あんどーなつ
先ほどのコード例は、ハンドルを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言語でいろいろできるようになってから勉強してみてください。