ページ 1 / 1
音楽ファイルの取得に関する質問
Posted: 2010年1月01日(金) 20:22
by ti
いつもお世話になります
音楽ファイルの読み込みに関する質問です
RPG製作中なのですが必要になったらファイルをメモリに読み込む処理をしていたのですが
プログラム開始時に一括で画像から音楽ファイルを読み込むように変更しようとおもっています
make●●.cpp(例)
extern int Sound_Cas = LoadSoundMem( "音楽ファイル名" );
//再生場所
int CHANGEMAP_Castl_1F(int CR_i,int CR_j){
//再生位置
PlaySoundMem( Sound_Cas , DX_PLAYTYPE_LOOP ) ;
}
ソースすべて載せると見難いので肝心と思うところだけを載せました
使用関数の外で宣言をしてmp3ファイルなどをメモリに終了間際まで持たせるにはどう宣言すればいいのか教えてください
Re:音楽ファイルの取得に関する質問
Posted: 2010年1月01日(金) 21:05
by MNS
提示されたコードの通り、グローバル変数で管理すればよいと思いますが、
extern int Sound_Cas = LoadSoundMem( "音楽ファイル名" );
これだと、DXライブラリの初期化(DxLib_Init関数)が行われる前に
LoadSoundMem関数が使用されてしまうと思うので、
初期化が終わった段階で、音楽などをロード擦る必要があるでしょう。
Re:音楽ファイルの取得に関する質問
Posted: 2010年1月01日(金) 21:31
by ti
MNSさん書き込みありがとうございます
ソース詳しく書いてみます
main.cpp↓
#include "DxLib.h"
#include "make town.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
// 画面モードの変更
SetGraphMode( 640 , 640 , 16 ) ;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
MAKE_ARIAHAN_TOWN();
DxLib_End();
return 0;
}
make●●.cpp(MAKE_ARIAHAN_TOWN();)などがあるところです↓
#include "make town.h"
#include "DxLib.h"
char Key[256];
static int cmdwindow;
bool CmdFlg;
int image = LoadGraph( "BMP/1138--.bmp" ) ;
int image1 = LoadGraph( "BMP/1138-.bmp" ) ;
int cr1 = LoadGraph( "BMP/cr.bmp" );
int StairsFlg =0;//MAP移動直後が階段になる場合1 それ以外は0
int cmd_x=68,cmd_y=70;
//音楽関連のメモリ取得
int Sound_Cas = LoadSoundMem( "BGM/DQ3城.mp3" );
int Sound_Town = LoadSoundMem( "BGM/Dragon_Quest_3_-_街.mp3" );
void MAKE_ARIAHAN_TOWN(void)
{
//一部非表示で
PlaySoundMem( Sound_Town , DX_PLAYTYPE_LOOP ) ;
}
ソースファイルはこんな感じになってます
DxLib_Init() の使用は一番最初のwinmain関数でのみ使用しています
みにくくて申し訳ありませんがよろしくお願いします
Re:音楽ファイルの取得に関する質問
Posted: 2010年1月01日(金) 21:53
by MNS
int Sound_Cas = LoadSoundMem( "BGM/DQ3城.mp3" );
例えば、このSound_Cas変数はグローバル変数ですね。
(環境によって異なると思うのですが)グローバル変数の初期化は、プログラムが起動してすぐ行われます。
提示されたコードにせよ、DxLib_Init() の前にSound_Cas変数の初期化が行われてしまうため、
DXライブラリ初期化前に、LoadSoundMem関数が使用されてしまいます。
よって、Sound_Cas変数の初期化に、LoadSoundMem関数を使用することは出来ませんし、プログラムも動きません。
なので、Sound_Cas変数など、画像,音楽ハンドルを保持するグローバル変数は、値を定めないで、宣言・定義をしておいて、
DXライブラリの初期化が終わった後に、その値を定める必要があります。
---何か.cpp--
int Sound_Cas; //初期化段階で読み込みはしない
---main.coo--
int WINAPI WinMain~~
{
// 画面モードの変更
SetGraphMode( 640 , 640 , 16 ) ;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
~~ここで音楽・画像の読み込み~~
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
MAKE_ARIAHAN_TOWN();
~
}
イメージは伝わるでしょうか?
Re:音楽ファイルの取得に関する質問
Posted: 2010年1月01日(金) 23:17
by ti
MNSさん丁寧な解説ありがとうございます
グローバル変数のことはスコープのことしかわかってませんでした
C言語ってやっぱり奥がとても深いですね
完全に理解しているかは正直自信ないです
main.cppからはじまって
---何か.cpp--で画像等の読み込みをする場合
どう宣言をすればいいのかわかりません
専用のヘッダファイルなどを作るべきなのでしょうか?
Re:音楽ファイルの取得に関する質問
Posted: 2010年1月02日(土) 09:18
by MNS
うーん、これはC言語というよりは、DXライブラリ特有の問題とも言えるでしょうか、
DxLib_Init()でDXライブラリを初期化する前に、LoadGraph関数などを使用してはいけないことはお分かりでしょうか?
(あまり詳しくはしりませんが、ChangeWindowMode関数など、一部の関数は大丈夫です。)
グローバル変数の初期化は、プログラム開始直後に行われるはずなので、
WinMain関数内の処理が始まる前に、グローバル変数の初期化が行われます。
そうすると、DXライブラリの初期化が行われる前に、グローバル変数の初期化が行われるので、
その初期化において、LoadGraph関数などを使用することはできないのです。
グローバル変数をほとんど使わないので若干怪しいですが、
例えば
-----Global.h-----
extern int GraphHandle; //グローバル変数の一例
------------------
----Global.cpp----
int GraphHandle; //初期化なし(0が代入されるかも?)
//読み込み用の関数を作っておく
void Load()
{
GraphHandle = LoadGraph("ほにゃらら.bmp");
}
-------------------
----main.cpp----
int WINAPI WinMain~~
{
// 画面モードの変更
SetGraphMode( 640 , 640 , 16 ) ;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
Load(); //!ここで読み込み用の関数を呼び出す
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
MAKE_ARIAHAN_TOWN();
~
}
-----------------
あくまで一例ですが、上のような作りであれば、
ほぼプログラム開始すぐに画像・音楽のロードが行われ、プログラム終了までその値が保持されます。
Re:音楽ファイルの取得に関する質問
Posted: 2010年1月03日(日) 20:06
by ti
MNSさんいつもありがとうございます
おかげで音楽ファイルのグローバルとしての読み込みができました
続き頑張ります
またよろしくお願いします
