画像が表示されない

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

画像が表示されない

#1

投稿記事 by ドーナツ » 14年前

こんにちは。
Cを初めて2週間ほどです。
画像が表示されず、原因が分からないので質問させていただきます。

プログラムソースが2つ、main.cppとEnemy.cppと、へッダーのEnemy.hがあります。
main.cppで、メインキャラの画像を表示、
Enemy.cppで、敵キャラの画像を表示しようとしています。

コード:

 
Enemy.h
 void myEnemyL();

Enemy.cpp
 int enemyI = LoadGraph( "enemy.png" ) ;
void EnemyL(){
 DrawGraph( 200, 200, enemyI , TRUE );
}

main.cpp
#include "DxLib.h"
#include "../プログラムヘッダー/Enemy.h"
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode( TRUE ); 
	DxLib_Init(); // DXライブラリ初期化処理
	SetDrawScreen( DX_SCREEN_BACK ); //描画先を裏画面に設定

	int x = LoadGraph( "main.png" ) ;
             DrawGraph( 100, 100, x , TRUE );
             void EnemyL();
		ScreenFlip();		//  裏画面を表画面に反映
	}
	DxLib_End();    // DXライブラリ終了処理
	return 0;
}
 


ところが、main.pngは表示されますが、enemy.pngが表示されません。
なお、enemy.pngとmain.png、main.cppとEnemy.cppは、それぞれ同フォルダにあります。


原因が分からず、以下のことを試してみました。
 1.enemyIの中身を確認したところ、「-1」でした。
 2.main.cppにで int enemyI = LoadGraph( "enemy.png" ) ;を記述して、
 void EnemyL() に渡したところ、enemy.pngが表示されました。
 3.#define MY_PICTURE_FOLDER "C:\\Documents and Settings\kenta\\My Documents\\Visual Studio 2010\\Projects\\Game\\"
 と、絶対パスを定義してみても、enemy.pngは表示されませんでした。
 4. Enemy.cpp の中身を main.cppに移したら、enemy.pngが表示されました。


2時間以上悩んでいます。
ご教授お願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像が表示されない

#2

投稿記事 by softya(ソフト屋) » 14年前

DxLib_Init();が呼び出される前に LoadGraph()は出来ませんが今のプログラムを見るとそれが行われています。[修正]誤解を受けそうな文を修正。
int enemyI = LoadGraph( "enemy.png" ) ;は、グローバル変数の初期化ですからmain関数の実行前にLoadGraph()されます。つまりうまく読み込めません。

enemyI の初期化関数を作成し、DxLib_Init();後に初期化関数を呼び出すようにすれば解決します。

※ プログラミが読みやすくなるのでインデントは整形してください。ほぼ確実にバグの原因となります。

[補足]
今気づいたけどProcessMessage()が無いけどコピーミスでしょうか?
それとProcessMessage()にループ中にL無制限でoadGraph()があるとメモリリークで異常終了しますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ドーナツ

Re: 画像が表示されない

#3

投稿記事 by ドーナツ » 14年前

迅速で的確な返信、及びインデントのアドバイスありがとうございます。
やっと原因が理解できました。本当に助かりました。

また、おっしゃる通りループ内のLoadGraph()を外したところ、処理が早くなりました。
ProcessMessageは、コピーミスです。


原因と、その対策の仕方について、おおよそ理解できました。
しかし、新たな疑問が出たので、ご教授いただけますか。

>enemyI の初期化関数を作成し、DxLib_Init();後に初期化関数を呼び出すようにすれば解決します。

この説明について、以下のように理解しています。
 1.Enemy.cppの中に、グローバル変数enemyIを初期化する関数を作成する。
 2.その中身はint enemyI = LoadGraph( "enemy.png" ) ;
 3.DxLib_Init();の後に、この初期化関数を呼び出す。
 4.この初期化関数を呼び出した後に、EnemyL()を呼び出し、画像を表示する。
 5.しかし、初期化関数の中で、グローバル変数enemyIの値を変えても、EnemyL()の中で、enemyIを使えない。

この考えの為、実行しても画像が表示されません。
どこの考えて間違っているのでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像が表示されない

#4

投稿記事 by softya(ソフト屋) » 14年前

間違いは、
2.その中身はint enemyI = LoadGraph( "enemy.png" ) ;
です。
それではローカル変数int enemyI ;に読み込んでしまいます。

C言語のポイント。
1.スコープが違う場所では同じ変数名使える。
2.同じ変数名でも使うメモリは違う別の変数である。
例えるなら1丁目の山田さんと3丁目の山田さんを一緒だと思っているのと同じ。
3.ローカル変数の寿命は関数を抜けるまで。

「変数の記憶寿命とスコープ」
http://www2.ee.knct.ac.jp/el/E3/E305/lifeandscope.html
これをよく理解して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ドーナツ

Re: 画像が表示されない

#5

投稿記事 by ドーナツ » 14年前

全て理解、解決しました。
後半は、調べればわかるようなことを質問してしまい、申し訳ありませんでした。

とても丁寧でわかりやすい解説でした。
本当にありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像が表示されない

#6

投稿記事 by softya(ソフト屋) » 14年前

ドーナツ さんが書きました:全て理解、解決しました。
後半は、調べればわかるようなことを質問してしまい、申し訳ありませんでした。

とても丁寧でわかりやすい解説でした。
本当にありがとうございました。
いえいえ、変数の寿命とスコープはちゃんと理解している初心者は少ないです。
プロで3年ぐらい仕事しているのに勘違いしている人も結構います。
なので、何度も見なおしたほうが良いですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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