トップページ > 過去ログ > 記事閲覧
画像ファイルが読み込めません
名前:sololi 日時: 2009/04/14 21:59

はじめまして。 現在DXライブラリを使ってシューティングゲームを作っているのですが、 開発環境の問題で先に進めなくなってしまいました。 問題の内容を以下に示します。 Windows Vista上で、Visual C++ 2008 Express Editionを使い開発を行っているのですが、 デバッグの際、LoadGraph関数、LoadDivGraph関数で画像をロードするところでエラーが出ます。 エラーの内容は、LoadGraph関数のところでは、 グラフィックファイル media\test1.png がありません と、 LoadDivGraph関数のところでは、 右記のグラフィックファイルのロードに失敗しました:media\test2.png と出ます。 もちろん、コード中で指定ディレクトリを間違えているわけではありません。 作成されたexeファイルを直接実行すると、画像は問題なく読み込まれます。 ただ、LoadDivGraph関数で読み込み、アニメーションさせている画像が常にちらつき、とても使えた物ではありません。 裏画面描写はもちろん行っています。 exeファイルを別のパソコン(OSはXP)で実行したところ、何の問題も無いので、 恐らくVistaが何か悪さをしているのではないかと思います。 試してみたことは、グラフィックボードのドライバの更新、XP互換モードで起動などですが、 特に症状は変わりませんでした。 長々とすみません。 提示する情報は多いほうがいいと思いましたので。 どなたか解決方法をご教示お願いします。 PCのスペック CPU:Core2Duo E6750 @定格 メモリ:2GB バルク GPU:WinFast PX8600GT TDH OS:Windows Vista Home Premium SP1

Page: 1 |

Re: 画像ファイルが読み込めません ( No.1 )
名前:Sura 日時:2009/04/14 23:43

おそらくフォルダ(ディレクトリ)の違いによるものと思われます。 統合開発環境(IDE)からの起動では "*.sin" があるディレクトリで、 "*.exe" を直接起動すると、 その実行ファイルが存在するフォルダから読み取ります。 多分、その違いを解消するには SetCurrentDirectory() 関数を使用すればよいと思います。 ttp://msdn.microsoft.com/ja-jp/library/cc429764.aspx >ただ、LoadDivGraph関数で読み込み、アニメーションさせている画像が常にちらつき、とても使えた物ではありません。 裏画面描写はもちろん行っています。 については、 その環境でのみ起こることですか? すみません。いまいちよく判りません。
Re: 画像ファイルが読み込めません ( No.2 )
名前:sololi 日時:2009/04/15 18:33

回答ありがとうございます。 デバッグ時に使われるディレクトリを、exeファイルのあるDebugフォルダであると勘違いしておりました。 ためしにソリューションファイル(*.sln)があるフォルダにmediaフォルダを置いたところ、 デバッグ時にも問題なく画像がロードされるようになりました。 しかし、やはりアニメーションさせている画像はちらついています。 この現象はこのパソコンでのみ現れます。 どうやら画像がロードできない問題とは無関係のようで。 何か別の要因があるのでしょうか。
Re: 画像ファイルが読み込めません ( No.3 )
名前:Sura 日時:2009/04/15 19:02

その画像のちらつきは ティアリングによるものでしょうか? もしそうでしたら、確か別のスレッドで グラフィックボードの種類によっては 初期設定がVsync待ちをしないようになっているものがあるそうです。 画面のプロパティを開いて、設定のタブを選択し、 詳細設定を選択すると グラフィックボードの種類に応じた 設定項目が現れると思うのですが もしその中でVsync待ちの項目があれば "待ち"に設定すればよいと思うのですが? 何分あなたと同じ環境ではないので うそを言っている可能性はあります。
Re: 画像ファイルが読み込めません ( No.4 )
名前:sololi 日時:2009/04/15 19:34

ティアリングについて調べましたが、どうやらこの現象ではないようです。 それでも試しにNVIDIAコントロールパネルで垂直同期を強制ONに設定しましたが、解決しませんでした。 私の言うちらつきは、画像が不規則についたり消えたり、ということです。 背景やその他の画像は何の問題も無く表示されます。 また、特定のコマが抜けているというわけでもありません。
Re: 画像ファイルが読み込めません ( No.5 )
名前:Sura 日時:2009/04/15 20:59

何でしょうね? 後とりあえず考えられることは LoadDivGraph()で読み込んだら 如何なる画像ファイルでも起こることなのかどうか (LoadDivGraphの問題) それとも特定の画像ファイルで不具合が起こるなら LoadGraph()でも起こるのか? (画像ファイルが問題) 以上を検証して診たらいかがでしょうか? また、本来ミスコードであっても今まで顕在化しなかったか(厄介ですが) デバッグを検討する。 すみません。このくらいしか言えません。
Re: 画像ファイルが読み込めません ( No.6 )
名前:sololi 日時:2009/04/15 22:40

色々実験してみました。 どうやら画像は正常のようです。 LoadDivGraph関数が正常であることも確認しました。 他に確認した現象は、 ・アニメーションをさせていない画像も点滅することがある。 ・アニメーションさせていても点滅しないこともある。 ・DrawFormatString関数を使って描写した文字列が点滅することもある。 などです ただし、これは開発を行っているパソコン上での現象で、 他のパソコンでは全く正常に表示されます。 やはり開発環境の問題でしょうか。
Re: 画像ファイルが読み込めません ( No.7 )
名前:Sura 日時:2009/04/16 00:58

ごめんなさい 少し整理させてください。 --確認項目の列挙-- [A]:DXLibの設定 ウインドウモードで起こるのか [B]:開発環境 1:その環境というのは一般的なものか (スレットを立てられた条件であればどのマシーンでも同じである) 2:またはあなたが使っているマシーンに対してのみか (つまり本来の機能が発揮されないことによるもの。 接触不良によるものなど) [C]:他のアプリケーション フルスクリーンで起動する(ほとんどはゲーム)アプリで起こるかどうか --確認事項の解説-- [A]に関して、おそらくはDXLibによる実行ファイルの 起動のみに現れると考えられ、 デフォルトではフルスクリーンですので、 ウインドウモードではどうなのでしょうか? [B]については複数のマシーンを同環境にしなければならないので余り現実的ではないと思いますが… [C]は[A]に付随しますが、DXLibが問題なのかそうでないかの確認出来そう。 --対処法-- どれも該当しないもしくは[A]にのみ該当すれば DXLibの不具合の可能性があり、 最新版であるかのチェック。 それでも不具合が解消されなければ 管理人さんの更新を待つ。 [A]と[C]が当てはまればフルスクリーン時に 問題が起こると考えられます(厳密にはそれに加えてリフレッシュレートの値の依存など)。 ドライバーの更新をやり直す。 [B]に関してはそもそもマシーンのセットアップ(ハード的)に問題があり、グラフィックスボードなどの 接触不良に改善。 --まとめ-- 時々起こるということなので、 [B]に当てはまる可能性があると思います。 以上、現状私がわかる限界です。
Re: 画像ファイルが読み込めません ( No.8 )
名前:Will 日時:2009/04/16 09:33

念のため指摘しますがDXライブラリは最新のバージョンを使用されていますよね? 少し古いバージョンのDXライブラリはVistaでは正常に動作しない問題がありましたので。
Re: 画像ファイルが読み込めません ( No.9 )
名前:sololi 日時:2009/04/16 21:42

>>Suraさん [A]についてですが、 ウィンドウモードとフルスクリーンの切り替えは、アプリケーション起動時に選択するようにしており、 どちらを選択してもちらつきは起こります。 [B]についてですが、 一般的な環境であるかどうかは正直答えかねます。 どうしても主観が入ってしまうので。 どんな用途でもそこそこ使える約2年前のミドルスペックのPCです。 通常の使用で感じる問題は特にありません。 [C]については、 不具合の出るコード、出ないコードを作りました。 「test」という文字を十字キーで操作できるプログラムです。 自分の環境では、この文字が不規則に点滅する不具合が常に発生します。 別のPCではこの不具合は出ません。 //以下自分の環境で不具合の出るコード #include "DxLib.h" //グローバル変数 int x = 0; //座標 int y = 0; int key = 0; //キー所得 //関数プロトタイプ宣言 void AskWindowMode(); // プログラムは WinMain から開始 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { AskWindowMode(); //フルスクリーン? SetGraphMode(640,480,16,60); //画面サイズ、カラービット数、リフレッシュレートを設定 SetDrawScreen(DX_SCREEN_BACK); //描写する画面を裏に SetWindowSizeChangeEnableFlag(FALSE); //ウィンドウサイズの変更の不許可 SetMainWindowText("test"); //ウィンドウのタイトルを変更 if( DxLib_Init() == -1 ){return -1 ;} // DXライブラリ起動、初期化処理。エラーが起こ れば終了 while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) //メインループ。 Escキーで抜け出す { ClearDrawScreen(); //画面のクリア DrawBox(0,0,640,480,GetColor(0,255,0),TRUE); //背景 key = GetJoypadInputState(DX_INPUT_KEY_PAD1); //キー所得。ここの行をコメ ントアウトすると不具合が起こらなくなる if(key & PAD_INPUT_UP){y = y - 4;} //移動 if(key & PAD_INPUT_DOWN){y = y + 4;} if(key & PAD_INPUT_LEFT){x = x - 4;} if(key & PAD_INPUT_RIGHT){x = x + 4;} if(x < 0){x = 0;} //画面外に出たときの処理 if(x > 600){x = 600;} if(y < 0){y = 0;} if(y > 460){y = 460;} DrawFormatString(x,y,GetColor(0,0,0),"test"); //描写 ScreenFlip(); //画面を裏返す } DxLib_End() ; // DXライブラリの終了処理 return 0; //正常終了 } void AskWindowMode() //フルスクリーンで起動?それともウィンドウ? { int flag; flag=MessageBox(NULL,TEXT("フルスクリーンモードで起動しますか?"),TEXT("スクリーン設 定"),MB_YESNO | MB_ICONQUESTION ); if(flag == IDNO){ChangeWindowMode(TRUE);} } //以上、不具合の出るコード このコードの「key = GetJoypadInputState(DX_INPUT_KEY_PAD1);」という部分をコメントアウトすると、 文字の移動が出来なくなりますが、文字が点滅する不具合は消えます。 >>Willさん 回答ありがとうございます。 念のためDXライブラリを再ダウンロードし、DxLib_VCフォルダを上書き、リビルドを行いましたが、症状は 治りませんでした。
Re: 画像ファイルが読み込めません ( No.10 )
名前:Sura 日時:2009/04/16 22:07

ごめんなさい [C]:の意味はDXLibで開発したものではなく フルスクリーンで起動するような既製のアプリのことです。説明が下手でした。 ですので、[C]を検証することで DXLib自体の問題か、 あなたのマシーンのセットアップの問題 (グラフィックスボードの接触不良, ドライバの更新ミス, ドライバのバグ etc.) があるのか原因が絞れると思うのですが… また、ソースコードですが特に問題はないと思います。 後そのプログラムの実行したときに出力されるLogに 異常ありますか?
Re: 画像ファイルが読み込めません ( No.11 )
名前:お父さん 日時:2009/04/16 22:10

sololiさん、はじめまして。 SetDrawScreen(DX_SCREEN_BACK); が、if( DxLib_Init() == -1 ){return -1 ;}より前にあるから ではないでしょうか? 私の環境では、SetDrawScreen命令をDxLib_Init()の後ろに移動させたら正常に動作しました。
Re: 画像ファイルが読み込めません ( No.12 )
名前:sololi 日時:2009/04/16 23:54

>>お父さん さん 回答ありがとうございます。 指示通り、SetDrawScreen関数をDxLib_Init関数の後に呼ぶようコードを改変したところ、見事に解決しました。 >>Suraさん [C]についてですが、 普通のSTG(東方紅魔卿体験版)や普通のFPS(Call of Duty 4)などは いたって普通に動作します。 出力されたLogも特に問題はありませんでした。 Suraさん、Willさん、お父さん さん、 お忙しい中ありがとうございました。 おかげさまで、次に進めるようになりました。 もしかすると、完成までにまた自分では解決できない問題に躓くことがあるかもしれません。 そのときにはまた、よろしくお願いします。

Page: 1 |