ページ 11

ファイルを読み込んだり、読み込まなかったりする

Posted: 2013年2月06日(水) 18:45
by dic
タイトルの通り、ファイルをロードしているのですが、ロードするときと、しないときがあって原因がわかりません。

ソース1

コード:

	g_tParam.image_enemy[7] = LoadGraph( _T("image\\敵7.bmp") );
	g_tParam.image_enemy[8] = LoadGraph( _T("image\\敵8.bmp") );
	g_tParam.image_uzu =      LoadGraph( _T("image\\うず1.bmp") );

	g_tParam.image_bullet[ con_player_bullet_kind_1 ] = LoadGraph( _T("image\\弾1.bmp") );
	g_tParam.image_bullet[ con_enemy_bullet_kind_1 ] = LoadGraph( _T("image\\敵の弾1.bmp") );
このソースコードだと、 g_tParam.image_uzu にロードしません

ファイルパスがあっていないのか、別の方法で確かめてみて
ソース2

コード:

	g_tParam.image_enemy[7] = LoadGraph( _T("image\\敵7.bmp") );
	g_tParam.image_enemy[8] = LoadGraph( _T("image\\敵8.bmp") );
	g_tParam.image_uzu =      LoadGraph( _T("image\\うず1.bmp") );

	FILE	*file;
	fopen_s( &file, "image\\うず1.bmp", "rb" );
	if( file )
	{
		fclose( file );
	}
	g_tParam.image_bullet[ con_player_bullet_kind_1 ] = LoadGraph( _T("image\\弾1.bmp") );
	g_tParam.image_bullet[ con_enemy_bullet_kind_1 ] = LoadGraph( _T("image\\敵の弾1.bmp") );
とすると、 g_tParam.image_uzu にはロードされています。

昨日は、ロードされていてて、今日編集していてて気づいたのです。
なので、ファイルの構成は変更しておらず、昨日は表示されていました。
何が原因かわかりません、どうやったら、ソース1でロードできるのでしょうか?

環境:Visual C++ 2010 Express
Windows 7 64bit
DxLibを使用

=== 追加 ===
ソース2で g_tParam.image_uzu に値が入っていますが、ゲーム画面になると何も表示されません

Re: ファイルを読み込んだり、読み込まなかったりする

Posted: 2013年2月06日(水) 18:57
by h2so5
最適化が有効になっているRelease構成ではデバッガが当てにならないのでDebug構成でデバッグしたほうが良いです。

Re: ファイルを読み込んだり、読み込まなかったりする

Posted: 2013年2月06日(水) 19:02
by softya(ソフト屋)
こういうのは、だいたい配列の添字オーバーな気がします。
配列の定義部分がないので断言はできませんけど。

Re: ファイルを読み込んだり、読み込まなかったりする

Posted: 2013年2月06日(水) 19:14
by dic
Relase でデバッカ見てますね
こんなミス気づきませんでした


これに関係して、もうひとつ質問なのですが
いわゆるグローバル変数の使い方です

// ゲーム.cpp
#include "stdfx.h"
g_info.image = LoadGraph( ...

// stdfx.h
struct {
int x, y;
int image;
} INFO_T
static INFO_T g_Info;


// ゲーム2.cpp
#include "stdfx.h"
DrawGraph( x, y, g_Info.image ...


としたら ゲーム2.cpp で使われている g_Info の値は無効でしょうか?
というか、ヘッダーファイル stdfx.h の static INFO_T g_Info; は使い方がまずいでしょうか?

Re: ファイルを読み込んだり、読み込まなかったりする

Posted: 2013年2月06日(水) 19:16
by dic
>>softyaさん

定義部分と、前後です

コード:


//	=========================================================================
struct	Param_t
{
	Param_t()
	{
		camera.x = camera.y = 0;
		player.x = player.y = 0;
		image = 0;
		image2 = 0;
	}
	POINT	camera;		//	カメラ
	POINT	player;		//	プレイヤー
	int		image;		//	背景画像
	int		image2;					//	プレイヤー画像
	int		image_enemy[16];		//	敵の画像
	int		image_bullet[8];		//	弾の画像
	int		image_uzu;				//	うずの画像
	vector<CBlock>	vBlock;			//	ブロックコンテナ
	vector<CEnemy>	vEnemy;			//	敵コンテナ
	vector<CButton>	vButton;		//	ボタンコンテナ
	vector<CBullet>	vEnemyBullet;	//	敵の弾コンテナ
	vector<CBullet>	vPlayerBullet;	//	プレイアヤーの弾のコンテナ
	vector<CBakuhatu>	vBakuhatu;	//	爆発コンテナ
	vector<CUzu>		vUzu;		//	うずのコンテナ
};

void	初期化()
{
	g_tParam.image = LoadGraph( _T("image\\yandere.jpg") );
	g_tParam.image2 = LoadGraph( _T("image\\プレイヤー1.bmp") );
	g_tParam.image_enemy[1] = LoadGraph( _T("image\\敵1.bmp") );
	g_tParam.image_enemy[2] = LoadGraph( _T("image\\敵2.bmp") );
	g_tParam.image_enemy[3] = LoadGraph( _T("image\\敵3.bmp") );
	g_tParam.image_enemy[4] = LoadGraph( _T("image\\敵4.bmp") );
	g_tParam.image_enemy[5] = LoadGraph( _T("image\\敵5.bmp") );
	g_tParam.image_enemy[6] = LoadGraph( _T("image\\敵6.bmp") );
	g_tParam.image_enemy[7] = LoadGraph( _T("image\\敵7.bmp") );
	g_tParam.image_enemy[8] = LoadGraph( _T("image\\敵8.bmp") );
	g_tParam.image_uzu = LoadGraph( _T("image\\うず1.bmp") );

	g_tParam.image_bullet[ con_player_bullet_kind_1 ] = LoadGraph( _T("image\\弾1.bmp") );
	g_tParam.image_bullet[ con_enemy_bullet_kind_1 ] = LoadGraph( _T("image\\敵の弾1.bmp") );

	CButton	button;
	button.Set( 100, 100, _T("ボタン1") );
	g_tParam.vButton.push_back( button );

	//	うずの配置
...
.......

Re: ファイルを読み込んだり、読み込まなかったりする

Posted: 2013年2月06日(水) 19:22
by softya(ソフト屋)
dic さんが書きました:としたら ゲーム2.cpp で使われている g_Info の値は無効でしょうか?
というか、ヘッダーファイル stdfx.h の static INFO_T g_Info; は使い方がまずいでしょうか?
ヘッダに書かれたstatic変数はソースファイル毎に独立します。
ヘッダって言うのは、単にソースファイルに読み込みだけですから。
ソースにstaticで宣言した変数と同じ意味です。
 → 俗にいうファイルスコープってやつです。
dic さんが書きました: g_tParam.image_bullet[ con_player_bullet_kind_1 ] = LoadGraph( _T("image\\弾1.bmp") );
g_tParam.image_bullet[ con_enemy_bullet_kind_1 ] = LoadGraph( _T("image\\敵の弾1.bmp") );
これだけだとcon_player_bullet_kind_1が何処を指しているか分かんないです。
一番怪しいのですが。

Re: ファイルを読み込んだり、読み込まなかったりする

Posted: 2013年2月06日(水) 19:25
by dic

コード:

const int con_player_bullet_kind_1 = 1;
const int con_enemy_bullet_kind_1 = 2;
const int con_player_pos_x = 320;
const int con_player_pos_y = (int)(480 * ( 7.0 / 8.9 ));
ほとんど、おおきい数字は扱ってないのです

>>static
ファイルスコープになるんですね、どうりでおかしかったわけです

Re: ファイルを読み込んだり、読み込まなかったりする

Posted: 2013年2月06日(水) 19:31
by dic
グローバル変数の定義を変更してみたところ、うまくロードされるようになりました。

static から、extern に変更しました
多分、このグローバル変数がらみで、コンパイル済みファイルが残ってたりしてたかもです。
ハッキリはしませんが、解決としておきます。

Re: ファイルを読み込んだり、読み込まなかったりする

Posted: 2013年2月06日(水) 19:42
by h2so5
stdafx.h の使い方が間違っています。
これはプリコンパイル済みヘッダ用のファイルで、ライブラリのヘッダなどのビルド結果をキャッシュするためのものです。

そのため、構造体の定義などをここに直接書いてはいけません。別のヘッダを用意してそこに書いてください。

Re: ファイルを読み込んだり、読み込まなかったりする

Posted: 2013年2月06日(水) 20:40
by softya(ソフト屋)
あら。よく見たらstdafx.hなんですね。
ここには、基本的に恒久的な物しか書かないようにして下さい。
自分で書いた定義を書くのはプリコンパイルヘッダの意義を殺しておるようなものです。

もし、stdafx.hに似た名前のstdfx.hだとしたら、そんな名前は止めたほうが良いと思います。

Re: ファイルを読み込んだり、読み込まなかったりする

Posted: 2013年2月07日(木) 13:01
by dic
なるほど、勉強になりました。