ロード画面について

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

ロード画面について

#1

投稿記事 by 素人 » 16年前

今度は改造龍神録のロード画面を作ってるんですけど
↓これをうまく使いたいのですが
全ての画像や音楽データをLoadingFileに
置き換える方法が分からなくて困ってます。例えば
img_board[10] = LoadGraph("../dat/img/board/10.png");
	img_board[11] = LoadGraph("../dat/img/board/11.png");
	img_board[12] = LoadGraph("../dat/img/board/12.png");
を、下記の
	GrHandle[LoadingFile] = LoadGraph( "Test1.bmp" );
に置き換える方法など。
うまく龍神録に実装出来る方法のアドバイスをお願いします。




#include "DxLib.h"

// 読み込むファイルの総数
#define FILENUM 1000

// ゲージの幅
#define GAUGEWIDTH 200

// 画像ハンドル
int GrHandle[FILENUM];

// 読み込んでいる画像の番号
int LoadingFile;

// 読み込み画面描画関数
void DrawLoadingScreen( void )
{
	// 「読み込み中」の表示
	DrawString( 0, 0, "Now Loading ...", GetColor( 255,255,255 ) );

	// ゲージの全体を灰色で描画
	DrawBox( 0, 32, GAUGEWIDTH, 56, GetColor( 128,128,128 ), TRUE );

	// 現時点で読み込み終わっている分を白色で描画
	DrawBox( 0, 32, LoadingFile * GAUGEWIDTH / FILENUM, 56, GetColor( 255,255,255 ), TRUE );
}

// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	// ウインドウモードで起動
	ChangeWindowMode( TRUE );

	// DXライブラリの初期化
	if( DxLib_Init() < 0 ) return -1;

	// 描画先を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK );

	// 読み込む画像の数だけ繰り返し
	for( LoadingFile = 0; LoadingFile < FILENUM; LoadingFile ++ )
	{
		// 画像の読み込み
		GrHandle[LoadingFile] = LoadGraph( "Test1.bmp" );

		// 20個読み込み終わる毎に読み込み中画面を一回更新する
		if( LoadingFile % 20 == 0 )
		{
			// 画面の初期化
			ClearDrawScreen();

			// 読み込み中画面を描画
			DrawLoadingScreen();

			// 裏画面の内容を表画面に反映
			ScreenFlip();

			// メッセージ処理
			if( ProcessMessage() != 0 ) break;
		}
	}

	// DXライブラリの後始末
	DxLib_End();

	// ソフトの終了
	return 0;
}

Justy

Re:ロード画面について

#2

投稿記事 by Justy » 16年前


>全ての画像や音楽データをLoadingFileに置き換える方法が分からなくて困ってます

 テーブルを使えば楽にできそうです。
[color=#d0d0ff" face="monospace]
static const char * const ImageFileList[/url] =
{
"../dat/img/board/10.png",
"../dat/img/board/11.png",
"../dat/img/bullet/b0.png",
"../dat/img/enemy/hp.png",
};
[/color]


 こんなかんじのテーブルを用意して、
[color=#d0d0ff" face="monospace]
GrHandle[LoadingFile] = LoadGraph(ImageFileList[LoadingFile]);
[/color]


 とすればできるはずです。


 画像だけで且つ読み込むファイル全てが "../dat/img/"にあるのなら
[color=#d0d0ff" face="monospace]
static const char * const ImageFileList[/url] =
{
"board/10.png",
"board/11.png",
"bullet/b0.png",
"enemy/hp.png",
};

char filePath[MAX_PATH];
sprintf(filePath, "../dat/img/%s", imageFileList[LoadingFile]);
GrHandle[LoadingFile] = LoadGraph(filePath);
[/color]

としてもいいですね。

素人

Re:ロード画面について

#3

投稿記事 by 素人 » 16年前

なるほど、テーブルを使う考えは思いつかなかったです
Justyさん、非常に助かりました。
ありがとうございます!

素人

Re:ロード画面について

#4

投稿記事 by 素人 » 16年前

すみません。よく分からなかった部分があったのですが
読み込むファイルの総数が74個あるんですが
なぜか
#define FILENUM 89 //読み込むファイルの総数
まで読み込み可能でした。
ちなみに
#define FILENUM 90 //読み込むファイルの総数
ではエラーが返ってきました。
これはどういう計算で89まで読み込めることになってるのでしょうか?
あと、下記にプログラムを書いておきましたが
これでちゃんとロードが出来ているのか不安なんですが
これでロードプログラムとして合ってるのでしょうか?
何か間違ってる部分があれば指摘お願いします。

load.cpp内

#include "../include/GV.h"

#define FILENUM 89		//読み込むファイルの総数
#define GAUGEWIDTH 200	//ゲージの幅
int GrHandle[FILENUM];	//画像ハンドル
int LoadingFile;			//読み込んでいる画像の番号

void DrawLoadingScreen(){	//読み込み画面描画関数
	img_back[1] = LoadGraph("../dat/img/back/3/loading.png");			//ロード画面
	DrawGraph(0,0,img_back[1],TRUE );									//ロード画面
	DrawString( 0, 0, "Now Loading ...", GetColor( 255,255,255 ) );		//「読み込み中」の表示
	DrawBox( 0, 32, GAUGEWIDTH, 56, GetColor( 128,128,128 ), TRUE );	//ゲージの全体を灰色で描画
	//現時点で読み込み終わっている分を白色で描画
	DrawBox( 0, 32, LoadingFile * GAUGEWIDTH / FILENUM, 56, GetColor( 255,255,255 ), TRUE );
}


void load(){
	int t;
	SetCreateSoundDataType( DX_SOUNDDATATYPE_MEMPRESS ) ;
	t=GetNowCount();


	static const char * const ImageFileList[/url] = 
    {
		"../dat/img/board/10.png",//1
		"../dat/img/board/11.png",//2
		"../dat/img/board/12.png",
		"../dat/img/board/20.png",
		"../dat/img/board/subject0.png",//5
		"../dat/img/char/atari.png",

		略			

		"../dat/se/graze.wav",//74
    };


	for( LoadingFile = 0; LoadingFile < FILENUM; LoadingFile ++ ){		//読み込む画像の数だけ繰り返し
		GrHandle[LoadingFile] = LoadGraph(ImageFileList[LoadingFile]);	//読み込み
		if( LoadingFile % 2 == 0 ){				//2個読み込み終わる毎に読み込み中画面を一回更新する
			ClearDrawScreen();					//画面の初期化
			DrawLoadingScreen();				//読み込み中画面を描画
			ScreenFlip();						//裏画面の内容を表画面に反映
		}
	}


	img_board[10] = LoadGraph("../dat/img/board/10.png");
	img_board[11] = LoadGraph("../dat/img/board/11.png");
	img_board[12] = LoadGraph("../dat/img/board/12.png");
	img_board[20] = LoadGraph("../dat/img/board/20.png");
	img_board[30] = LoadGraph("../dat/img/board/subject0.png");
	img_chetc[0]	= LoadGraph( "../dat/img/char/atari.png" );

		以下略

ねこ

Re:ロード画面について

#5

投稿記事 by ねこ » 16年前

エラーはコンパイルエラーなのか、強制終了なのか分かりませんが。
なんかwavファイル混じってませんか・・・?LoadGraphしてもダメな気が・・・

Justy

Re:ロード画面について

#6

投稿記事 by Justy » 16年前


>これはどういう計算で89まで読み込めることになってるのでしょうか?

 89まで読めたのは偶然でしょう。

 そもそも ImageFileListが 74しかないのに、FILENUMが 89もあると、
ImageFileList[LoadingFile] のところで配列の領域をオーバーしてアクセスしていますので
75個目以降はいつ異常な動作を起こしても不思議ではありません。

 つまり、
[color=#d0d0ff" face="monospace]
efor( LoadingFile = 0; LoadingFile < FILENUM; LoadingFile ++ ){
[/color]

の部分は
[color=#d0d0ff" face="monospace]
const int MAX_IMAGE_FILE_LIST = sizeof(imageFileList) / sizeof(imageFileList[0]);
for( LoadingFile = 0; LoadingFile < MAX_IMAGE_FILE_LIST; LoadingFile ++ {
[/color]

とか、配列のサイズに応じてループを回すようにした方がいいでしょう。

 ところで、その 89というのはどこから出てきたのですか?


 あとねこさんもおっしゃっていますが、音声データに対して LoadGraphはまずいので、
画像とか音声とかの種類毎にテーブルを分けて処理するとか、
[color=#d0d0ff" face="monospace]
struct LoadFileInfo
{
enum Type { TypeImage, TypeSound };
Type type;
const char *fileName;
};
static const LoadFileInfo imageFileList[/url] =
{
{ LoadFileInfo::TypeImage, "../dat/img/board/10.png" },
{ LoadFileInfo::TypeImage, "../dat/img/board/11.png" },
{ LoadFileInfo::TypeImage, "../dat/img/board/12.png" },
{ LoadFileInfo::TypeImage, "../dat/img/char/atari.png" },
{ LoadFileInfo::TypeSound, "../dat/se/graze.wav" },
};

[/color]

のような情報を読み込むファイルの情報を入れる構造体に作って、
その typeに応じて処理を分けるなどしてください。




>何か間違ってる部分があれば指摘お願いします

 DrawLoadingScreen()が呼ばれる度に "loading.png"が LoadGraphされていますが、
これはいつ解放されるのでしょうか?

素人

Re:ロード画面について

#7

投稿記事 by 素人 » 16年前

強制終了です。
確かに、wavファイルが混じってました。
"../dat/se/enemy_shot.wav",//60
"../dat/se/enemy_death.wav",
"../dat/se/cshot.wav",
etc
これって一緒に入れたらまずかったのでしょうか?
ロードだからこれも一気にロードしようと思ったのですが・・

すると、このwavファイルをロードする方法ってないんでしょうか?
それとも最初にロードする必要はない?

もう一つ、このwavファイル全部(15個)をコメントアウトすると
読み込むファイルの総数は59個になるはずのですが
#define FILENUM 75 //読み込むファイルの総数
以上で強制終了
#define FILENUM 74 //読み込むファイルの総数
以下で読み込み可能でした。
これっていったいどういうことなのでしょうか?

素人

Re:ロード画面について

#8

投稿記事 by 素人 » 16年前

>>Justyさん
89まで読めたのは偶然って・・
プログラムで偶然って存在したんですか・・知らなかったです・・

89というのは、
まず、
"../dat/img/board/10.png",//1
"../dat/img/board/11.png",//2
"../dat/img/board/12.png",
"../dat/img/board/20.png",
"../dat/img/board/subject0.png",//5
5個読み込んだらどうなるか試してみたら
#define FILENUM 5で正常に起動して
#define FILENUM 6以上でエラー、
とくにプログラムどおりだったので特に問題はなかったのですが

74個読み込んだところ
#define FILENUM 74で正常に起動したので
75でエラーかな?と思って念のため調べてみたら
エラーが返ってこなかったので、おかしいと思って、
76、77と増やしていって調べてみたら90でエラーが返ってきたんです。
この原因が不明なため質問させていただきました。

とりあえず、この原因は偶然ということが分かり、
音声データと配列のサイズに応じてのループ処理が出来たので
とても助かりました、ありがとうございます。

loading.pngの解放についてですが、解放してません。
やはりまずいでしょうか?どこで解放するべきでしょうか?

Justy

Re:ロード画面について

#9

投稿記事 by Justy » 16年前

[color=#d0b0c0" face="monospace]
>loading.pngの解放についてですが、解放してません。
やはりまずいでしょうか?どこで解放するべきでしょうか?
[/color]

 まずいですね。
 LoadGraphを行うということは行った分だけ画像データ+管理領域分のメモリを消費するわけですが
この場合 LoadingFileが2つ進むと1回ロードする仕組みになっているので
LoadingFileのカウントが増えれば増えるほど、多くのメモリを消費することになります。

 しかも同じテクスチャを毎回ファイルからロードしているのでそれなりの処理負荷がかかりますし、
img_back[1]を上書きしているので1つ前のロードした img_back[1]のテクスチャを
解放することすらできません。

 とりあえず load()の先頭あたりで1回だけLoadGraphを呼んで "loading.png"を読み込み、
load()を抜けるところで DeleteGraph()してはどうでしょうか。

素人

Re:ロード画面について

#10

投稿記事 by 素人 » 16年前

loading.pngの解放についてはJustyさんの指示どおりしたら、
凄くスムーズにロードが進むようになりました。
ロードが遅い感じはしてたのですが、これが原因だったのですね。
ありがとうございます。
ただ、この後あれこれ試してみたんですが、
No:37650の記事の内容がうまく行かないです。
まず、
const int MAX_IMAGE_FILE_LIST = sizeof(imageFileList) / sizeof(imageFileList[0]); 
    for( LoadingFile = 0; LoadingFile < MAX_IMAGE_FILE_LIST; LoadingFile ++ { 
についてですが、
error C2065: 'imageFileList' : 定義されていない識別子です。
error C2070: ''unknown-type'': sizeof オペランドが正しくありません。
とポインタエラーが返ってきました。特にC2070が初めてみるエラーなので
どう対処したらいいか分からなくて困ってます。
あと、
    struct LoadFileInfo 
    { 
        enum Type { TypeImage, TypeSound }; 
        Type        type; 
        const char *fileName; 
    }; 
    static const LoadFileInfo imageFileList[/url] = 
    { 
        { LoadFileInfo::TypeImage, "../dat/img/board/10.png" }, 
        { LoadFileInfo::TypeImage, "../dat/img/board/11.png" }, 
        { LoadFileInfo::TypeImage, "../dat/img/board/12.png" }, 
        { LoadFileInfo::TypeImage, "../dat/img/char/atari.png" }, 
        { LoadFileInfo::TypeSound, "../dat/se/graze.wav" }, 
    }; 
についてですが、typedef structとはちょっと違う感じで
うまく分けられないです。
タイプ別に分けるとは
具体的にどのようにすれば画像と音声データを綺麗に分けることが出来るのでしょうか?
また、分けてしまういうことは
	//現時点で読み込み終わっている分を白色で描画
	DrawBox( 0, 32, LoadingFile * GAUGEWIDTH / FILENUM, 56, GetColor( 255,255,255 ), TRUE );
を二つに分けるやり方になってしまうような感じがするのですが、一つで出来ないのでしょうか?
ここの部分を特に具体的に教えていただけたら幸いです。よろしくお願いします。

Justy

Re:ロード画面について

#11

投稿記事 by Justy » 16年前


>特にC2070が初めてみるエラーなのでどう対処したらいいか分からなくて困ってます

 まんまなのですが、imageFileListの定義がない、ということです。
 imageFileList -> ImageFileListに変えてください。



>typedef structとはちょっと違う感じで

 厳密にはいろいろ違うのですが、ここで使う分には使い方は変わらないはずです。



>タイプ別に分けるとは
>具体的にどのようにすれば画像と音声データを綺麗に分けることが出来るのでしょうか?

 メンバに typeがあるので、それを利用します。
[color=#d0d0ff" face="monospace]
for( LoadingFile = 0; LoadingFile < MAX_IMAGE_FILE_LIST; LoadingFile ++ )
{
const LoadFileInfo *loadInfo = &imageFileList[LoadingFile];
if(loadInfo->type == LoadFileInfo::TypeImage)
...; // グラフィックスの処理を書く
else
if(loadInfo->type == LoadFileInfo::TypeSound)
...; // サウンドの処理を書く
[/color]

 typeを見て ifで分岐して処理を変えていきます。



>二つに分けるやり方になってしまうような感じがするのですが、一つで出来ないのでしょうか?

 ?
 どちらの方式でやってもならないと思いますけど……。

 リストを2つに分けたのなら、FILENUMが2つのリストの総数を、LoadingFileが2つのリストの進行カウンタの合計に
なっていれば1つで処理できるはずですし、上の構造体方式で1つにリストをまとめたのなら
従来通りの方法でOKです。

素人

Re:ロード画面について

#12

投稿記事 by 素人 » 16年前

仰るとおりにしてみると再び同じエラーが出て、どうやってもエラーがとれなく困っているんですが、
どこのプログラムが原因でどこを直したらロードが出来るようになるでしょうか?
エラーは
error C2065: 'ImageFileList' : 定義されていない識別子です。×4
error C2070: ''unknown-type'': sizeof オペランドが正しくありません。
というエラーです。
ソースも公開しておきます。
#define FILENUM 60		//読み込むファイルの総数
#define GAUGEWIDTH	640	//ゲージの幅(横)
int GrHandle[FILENUM];	//画像ハンドル
int LoadingFile;		//読み込んでいる画像の番号

void DrawLoadingScreen(){	//読み込み画面描画関数
	//現時点で読み込み終わっている分を黄色(横)で描画
	DrawBox( 0, 340, LoadingFile * GAUGEWIDTH / FILENUM, 420, GetColor( 255,255,0 ), TRUE );//横
	DrawGraph(0,0,img_back[1],TRUE );									//ロード画面
}

void load(){
	int t;
	SetCreateSoundDataType( DX_SOUNDDATATYPE_MEMPRESS ) ;
	t=GetNowCount();

	img_back[1] = LoadGraph("../dat/img/back/3/loading.png");			//ロード画面

    struct LoadFileInfo 
    { 
        enum Type { TypeImage, TypeSound }; 
        Type        type; 
        const char *fileName; 
    };

    const int MAX_IMAGE_FILE_LIST = sizeof(ImageFileList) / sizeof(ImageFileList[0]);			←error C2065×2、error C2070

    for( LoadingFile = 0; LoadingFile < MAX_IMAGE_FILE_LIST; LoadingFile ++ ) 
    { 
        const LoadFileInfo *loadInfo = &ImageFileList[LoadingFile]; 				←error C2065
		if(loadInfo->type == LoadFileInfo::TypeImage){
			//static const char * const ImageFileList[/url] =
			  static const LoadFileInfo ImageFileList[/url] = 
			{
				{ LoadFileInfo::TypeImage, "../dat/img/board/10.png" },//1
				{ LoadFileInfo::TypeImage, "../dat/img/board/11.png" },
				{ LoadFileInfo::TypeImage, "../dat/img/board/12.png" },
				{ LoadFileInfo::TypeImage, "../dat/img/board/20.png" },

						略

				{ LoadFileInfo::TypeImage, "../dat/img/back/10/kotei0.png" },
				{ LoadFileInfo::TypeImage, "../dat/img/back/10/scroll0.png" },//60
			};
		}
        else 
		if(loadInfo->type == LoadFileInfo::TypeSound){
			static const LoadFileInfo ImageFileList[/url] = 
			{ 
				{ LoadFileInfo::TypeSound, "../dat/se/enemy_shot.wav" },
				{ LoadFileInfo::TypeSound, "../dat/se/enemy_death.wav" },

						略

				{ LoadFileInfo::TypeSound, "../dat/se/lazer.wav" },
				{ LoadFileInfo::TypeSound, "../dat/se/item_get.wav" },
			};
		}
	}


//	for( LoadingFile = 0; LoadingFile < FILENUM; LoadingFile ++ ){		//読み込む画像の数だけ繰り返し
    for( LoadingFile = 0; LoadingFile < MAX_IMAGE_FILE_LIST; LoadingFile ++ ){
		GrHandle[LoadingFile] = LoadGraph(ImageFileList[LoadingFile]);	//読み込み			←error C2065
		if( LoadingFile % 2 == 0 ){				//2個読み込み終わる毎に読み込み中画面を一回更新する
			ClearDrawScreen();					//画面の初期化
			DrawLoadingScreen();				//読み込み中画面を描画
			ScreenFlip();						//裏画面の内容を表画面に反映
		}
	}


	img_board[10] = LoadGraph("../dat/img/board/10.png");
	img_board[11] = LoadGraph("../dat/img/board/11.png");
	img_board[12] = LoadGraph("../dat/img/board/12.png");
	img_board[20] = LoadGraph("../dat/img/board/20.png");
	img_board[30] = LoadGraph("../dat/img/board/subject0.png");
	img_chetc[0]	= LoadGraph( "../dat/img/char/atari.png" );
	img_eff_bom[0] = LoadGraph( "../dat/img/effect/bom0.png" );

				省略

	DeleteGraph(img_back[1]);//画像解放
}

Justy

Re:ロード画面について

#13

投稿記事 by Justy » 16年前

[color=#d0b0c0" face="monospace]
>原因でどこを直したらロードが出来るようになるでしょうか
[/color]

 テーブルを1つにまとめるために構造体を使ったわけで、
2つに分けるのであればこの構造体は不要なのですが……。

 なんかもうプログラムがひっちゃかめっちゃかになってますよ……。


[color=#d0b0c0" face="monospace]
>error C2065: 'ImageFileList'
[/color]

 ImageFileListの定義がないからです。
 ImageFileListを定義刷る前にImageFileListを使っています。
 sizeofでエラーが出てるのも ImageFileListが見つからないからでしょう。
 
 とりあえず、全面的に書き直してみました。
 デバッガで追いながら、じっくり解析して、その上で自分のコードを
どう直していけばいいのかを検討してみてください。
[color=#d0d0ff" face="monospace]
// 読み込むファイル情報構造体
struct LoadFileInfo
{
enum Type { TypeImage, TypeSound };
Type type;
const char* fileName;
};

// 読み込むファイル情報
static const LoadFileInfo LoadFileList[/url] =
{
{ LoadFileInfo::TypeImage, "../dat/img/board/10.png" },
{ LoadFileInfo::TypeImage, "../dat/img/board/11.png" },
{ LoadFileInfo::TypeImage, "../dat/img/board/12.png" },
{ LoadFileInfo::TypeImage, "../dat/img/board/20.png" },
{ LoadFileInfo::TypeImage, "../dat/img/back/10/kotei0.png" },
{ LoadFileInfo::TypeImage, "../dat/img/back/10/scroll0.png" },
{ LoadFileInfo::TypeSound, "../dat/se/enemy_shot.wav" },
{ LoadFileInfo::TypeSound, "../dat/se/enemy_death.wav" },
{ LoadFileInfo::TypeSound, "../dat/se/lazer.wav" },
{ LoadFileInfo::TypeSound, "../dat/se/item_get.wav" },
};

// ファイル数
static int const LoadFileNum = sizeof(LoadFileInfo) / sizeof(LoadFileList[0]);

static int Handle[LoadFileNum];

// 背景の表示
static void DrawLoadingScreen(int progress, int backImage)
{
const int GAUGEWIDTH = 640;
DrawBox(0, 340, progress * GAUGEWIDTH / LoadFileNum, 420, GetColor(255, 255, 0), TRUE);
DrawGraph(0, 0, backImage, TRUE);
}


void load()
{
int backImage = LoadGraph("../dat/img/back/3/loading.png");
SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS);

// メインループ
int index = 0;
const int maxLoadTimes = 3; // 1度にロードするファイル数
while(ProcessMessage() == 0 && index < LoadFileNum)
{
ClearDrawScreen();

// maxLoadTimes分ファイルをロード
for(int n=0; n<maxLoadTimes && index < LoadFileNum; ++n, ++index)
{
const LoadFileInfo *loadInfo = &LoadFileList[index];
if(loadInfo->type == LoadFileInfo::TypeImage)
Handle[n] = LoadGraph(loadInfo->fileName);
else
if(loadInfo->type == LoadFileInfo::TypeSound)
Handle[n] = LoadSoundMem(loadInfo->fileName);
}

DrawLoadingScreen(index, backImage);
ScreenFlip();
}

DeleteGraph(backImage);
}
[/color]

Justy

Re:ロード画面について

#14

投稿記事 by Justy » 16年前

 ついでなので少し長いですが、テーブルを普通に複数用意するタイプも作ってみました
(あんましテストしてないですが)。

 こちらはハンドルも複数に分かれてます。
 複数のファイルリストをまとめるために1つ別の構造体を使って居ます。
 参考までに。
[color=#d0d0ff" face="monospace]
// イメージ
static const char * const LoadImageFileList[/url] =
{
"../dat/img/board/10.png",
"../dat/img/board/11.png",
"../dat/img/board/12.png",
"../dat/img/board/20.png",
"../dat/img/back/10/kotei0.png",
"../dat/img/back/10/scroll0.png",
};
static int const ImageFileNum = sizeof(LoadImageFileList) / sizeof(LoadImageFileList[0]);
static int GrHandle[ImageFileNum];

// サウンド
static const char * const LoadSoundFileList[/url] =
{
"../dat/se/enemy_shot.wav",
"../dat/se/enemy_death.wav",
"../dat/se/lazer.wav",
"../dat/se/item_get.wav",
};
static int const SoundFileNum = sizeof(LoadSoundFileList) / sizeof(LoadSoundFileList[0]);
static int SdHandle[SoundFileNum];

// 各ファイルリストをまとめる
struct FileListInfo
{
enum Type { TypeImage, TypeSound };
Type type;
const char * const * data;
int dataSize;
};
static const FileListInfo LoadGroupFileList[/url] =
{
{ FileListInfo::TypeImage, LoadImageFileList, ImageFileNum },
{ FileListInfo::TypeSound, LoadSoundFileList, SoundFileNum },
};
const int GroupListSize = sizeof(LoadGroupFileList) / sizeof(LoadGroupFileList[0]);

// 読み込むファイル総数を求める
static int GetTotalLoadFiles()
{
int totalFileNum = 0;
for(int n=0; n<GroupListSize; ++n)
totalFileNum += LoadGroupFileList[n].dataSize;
return totalFileNum;
}

// 背景表示
static void DrawLoadingScreen(int progress, int totalFileNum, int backImage)
{
const int GAUGEWIDTH = 640;
DrawBox(0, 340, progress * GAUGEWIDTH / totalFileNum, 420, GetColor(255, 255, 0), TRUE);
DrawGraph(0, 0, backImage, TRUE);
}

void load()
{
int backImage = LoadGraph("../dat/img/back/3/loading.png");
SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS);

// 読み込むファイル総数を求める
const int totalFileNum = GetTotalLoadFiles();

// メインループ
const int maxLoadTimes = 2; // 1度にロードするファイル数
int groupIndex = 0, index = 0, loadedCount = 0;
while(ProcessMessage() == 0 && groupIndex < GroupListSize)
{
ClearDrawScreen();

// maxLoadTimes数分ファイルをロード
const FileListInfo *listInfo = &LoadGroupFileList[groupIndex];
for(int n=0; n<maxLoadTimes && index < listInfo->dataSize; ++n, ++index)
{
if(listInfo->type == FileListInfo::TypeImage)
GrHandle[index] = LoadGraph(listInfo->data[n]);
else
if(listInfo->type == FileListInfo::TypeSound)
SdHandle[index] = LoadSoundMem(listInfo->data[n]);
++loadedCount;
}

// 1つのファイルリストが尽きたら次のリストへ
if(index >= listInfo->dataSize)
{
++groupIndex;
index = 0;
}

// 背景表示
DrawLoadingScreen(loadedCount, totalFileNum, backImage);
ScreenFlip();
}

DeleteGraph(backImage);
}[/color]

素人

Re:ロード画面について

#15

投稿記事 by 素人 » 16年前

JustyさんのNo:37735をまったく同じように参考にさせていただき、
おかげさまで無事、エラーを取り除くことが出来たのですが、
前みたいに2個読み込み終わる毎に読み込み中画面を一回更新する処理が出来なくなっているのですが
どんな処理をどこに加えたらできるようになるでしょうか?
それと、
static void DrawLoadingScreen(int progress, int backImage)
のprogressがあまり意味ないような感じがするのですが
これは何の役割をしているのでしょうか?
よく分からなかったのでよろしければ教えてください。

ねこ

Re:ロード画面について

#16

投稿記事 by ねこ » 16年前

<2個毎に・・・
とりあえずJustyさんの「No:37737」をよく読んであげてください。

<progress
現在の読み込み数を指定しています。
DrawBox関数の
DrawBox(0, 340, progress * GAUGEWIDTH / LoadFileNum, 420, GetColor(255, 255, 0), TRUE);
第三引数を
( progress / LoadFileNum ) * GAUGEWIDTH
こうすると意味が分かりやすいかも。
要は読み込んだ数と総読み込み数の割合に640(ウィンドウ横幅)をかけてます。

素人

Re:ロード画面について

#17

投稿記事 by 素人 » 16年前

ロードが無事出来ました!
ねこさんアドバイスありがとうございます。ただ
( progress / LoadFileNum ) * GAUGEWIDTHは意味が分かりやすくはなりますが
実際に実装してみると、一気に描画されてしまったので
progress * GAUGEWIDTH / LoadFileNumのほうがいいかもしれません。

そして、まだまだ未熟な自分に最後まで付き合い、アドバイスをくれたJustyさん。
本当に感謝の気持ちでいっぱいです。
ありがとうございました!

sizuma

Re:ロード画面について

#18

投稿記事 by sizuma » 16年前

>( progress / LoadFileNum ) * GAUGEWIDTHは意味が分かりやすくはなりますが
>実際に実装してみると、一気に描画されてしまったので
>progress * GAUGEWIDTH / LoadFileNumのほうがいいかもしれません。

どちらの計算も同じですよね??

ねこ

Re:ロード画面について

#19

投稿記事 by ねこ » 16年前

>実際に実装してみると、一気に描画されてしまったので
もしかしてこうかも
(double)( progress / LoadFileNum ) * (double)GAUGEWIDTH;
GAUGEWIDTHがlong型なので括弧内の結果がlongで一度キャストされ、
それによって0or1の状態になってるかもしれません。

まぁ分かりやすいための書き方だったため、動けばどちらでも良いと思います^^

素人

Re:ロード画面について

#20

投稿記事 by 素人 » 16年前

すみません。間違えてました。No:37737を参考に今度はプログラムを組んでみたので
progress * GAUGEWIDTH / LoadFileNumではなく、
progress * GAUGEWIDTH / totalFileNumでした。
つまり、
progress * GAUGEWIDTH / totalFileNum
ならmaxLoadTimesぶんだけゆっくり描画されますが
( progress / totalFileNum ) * GAUGEWIDTH
は一気に描画されます
ということです。
これも計算は一緒ですが、なぜそうなるのかは
自分はちょっと分からないです・・

閉鎖

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