ページ 11

龍神録の4章を応用したプログラムで画像が表示されない

Posted: 2011年9月12日(月) 16:34
by dast
こんにちは。プログラミングの勉強をしながら龍神録プログラミングの館を見ている初心者です。
龍神録の4章を応用してプログラムを書いたのですが(応用とはいっても持ち合わせの画像に合わせただけでやっていることはほとんど同じですが)表示されるはずの画像が表示されません。一体どこがダメなのでしょうか?

プログラムの中身

struct.h

コード:

typedef struct{
	int num;       //残機数
	int score;     //スコア
	int mutekicnt; //無敵状態とカウント
	int img;       //画像
	double x,y;    //座標
}ch_t;
load.cpp

コード:

#include "../ヘッダー/GV.h"
extern int img[12];
void load(){
	LoadDivGraph("../画像/キャラグラ/自機.png",12,3,4,38,41,img);
}
graph.cpp

コード:

#include "../ヘッダー/GV.h"
extern ch_t ch;
extern int img[12];

void graph_ch(){
	DrawGraph(ch.x,424,img[0],TRUE);
}//graph_ch()の中にimgの0番(自機の上向き画像)の作画作業を入れる

void graph_main(){
	graph_ch();
}//graph_main()の中にgraph_ch()を入れる
main.cpp

コード:

#define GLOBAL_INSTANCE
#include "../ヘッダー/GV.h"

//現在のキー入力処理を行う
extern int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
extern int CheckStateKey(unsigned char Handle);

//load.cppを実行する
extern void load();

//graph.cppの中のgraph_main()を実行する
extern void graph_main();

int img[12];    //キャラクタ画像

ch_t ch;        //キャラクタデータ

//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
    return 0;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	load();//load.cppを実行する

    while(ProcessLoop()==0){//ProcessLoopの内容を行う

		graph_main();//graph.cppの中のgraph_main()を実行する

		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク



        //ココ!!



        ScreenFlip();
    }

    DxLib_End();
    return 0;
}
GV.h

コード:

#include "DxLib.h"
#include "define.h"
define.h

コード:

#include"struct.h"
key.cpp

コード:

#include "../ヘッダー/GV.h"

unsigned int stateKey[256];

int GetHitKeyStateAll_2(){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) stateKey[i]++;
        else                            stateKey[i]=0;
    }
    return 0;
}
int CheckStateKey(unsigned char Handle){
        return stateKey[Handle];
}

Re: 龍神録の4章を応用したプログラムで画像が表示されない

Posted: 2011年9月12日(月) 16:44
by softya(ソフト屋)
LoadDivGraphの戻り値とLog.txtを確認して画像が読み込まれているかを調べてください。

Re: 龍神録の4章を応用したプログラムで画像が表示されない

Posted: 2011年9月12日(月) 19:38
by dast
確認してみました。どうやら画像の読み込みに失敗していたようです。この場合どうしたらちゃんと読み込んでくれるようになるのでしょうか?

とりあえずLog.txtの読み込み失敗の前後の文を貼っておきます。
22815:フォントの初期化を行います
22830:フォントの初期化は正常に終了しました
22835:文字コードバッファの初期化を行います... 完了しました
22885:右記のグラフィックファイルのロードに失敗しました:../画像/キャラグラ/自機.png
29213:フォントの初期化を行います
29229:フォントの初期化は正常に終了しました
29249:Direct3DDevice9 の解放 3
29497:Direct3D9 DLL の解放 4
29525:DirectInput 関連の終了処理... 完了
29620:DirectSound の終了処理は正常に終了しました
29640:ウインドウを閉じようとしています
29732:ウインドウが破棄されようとしています
29737:ソフトを終了する準備が整いました

Re: 龍神録の4章を応用したプログラムで画像が表示されない

Posted: 2011年9月12日(月) 20:28
by Dixq (管理人)
フォルダ名は「キャラグラ」であってるんでしょうか?
キャラのグラフィックという意味なのかキャラクタなのか・・。

あっているのならば、その階層にファイルが存在するか、スペルミスは無いか確認して下さい。

Re: 龍神録の4章を応用したプログラムで画像が表示されない

Posted: 2011年9月12日(月) 21:48
by dast
画像の存在する階層を見直してみたらできました。成功したプログラムは次の通りです。

load.cpp

コード:

#include "../ヘッダー/GV.h"
extern int img[12];
void load(){
	LoadDivGraph("画像/キャラグラ/自機.png",12,3,4,38,41,img);
}
ほかのファイルはいじっていません。
どうやら画像がある場所をload.cppを基準にして指定したのがまずかったようです。
VC++Projectファイルを基準にして指定したらできました。

でも#include "../ヘッダー/GV.h"の部分はload.cppの場所を基準にしてGV.hの場所を指定したのにちゃんとできているのは何故なのでしょうか?

Re: 龍神録の4章を応用したプログラムで画像が表示されない

Posted: 2011年9月12日(月) 22:16
by softya(ソフト屋)
それはコンパイル時と実行時で基準となるフォルダが違うからですね。
#includeはソースからの相対位置です。
ファイルロードはVC++下での起動ならvcprojのあるフォルダが基準になります。
exeを直接起動した場合は、exeのあるフォルダが基準になります。

Re: 龍神録の4章を応用したプログラムで画像が表示されない

Posted: 2011年9月12日(月) 22:41
by dast
なるほど、それで画像だけ読み込めなかったんですね。
ご丁寧にどうもありがとうございました。大変参考になります。