ページ 11

DXライブラリを組み込んだ自作ライブラリでの画像読込失敗

Posted: 2013年10月13日(日) 23:28
by NKiYo
ここでの書込みはお初となります。
自分なりに様々な方法で調べてみましたが解決できなかったので是非お力をお借りしたいと思い投稿致しました。

ゲームを作るにあたり、汎用的なライブラリが欲しいと感じDXライブラリを使用して自作の静的ライブラリを制作しています。
ライブラリの作成自体は成功していて、テストプログラム、既に制作済のジョークプログラムでの動作は確認して正常に動作しています。
これはデバッグ、リリース共に確認済みです。

しかし、目的であるゲームのプログラムに組み込むと動作しません。
動作しない部分は、画像を分割読込させる関数です。
画像を分割後、表示をさせるのですがエラーは出ず表示されません。
以下に一部不要な部分を削った自作ライブラリ内の関数を記述します。

GraphicItem.h

コード:

#ifndef GRAPHICITEM
#define GRAPHICITEM

#include "DxLib.h"

//画像設置の基礎クラス
class GraphicItem{

protected:
	//基本的必要データ
	int  mx,			//x座標
		 my,			//y座標
		 *mHandle,		//ハンドル値(動的配列)
		 mNumber;		//ハンドル値要素数
            (一部省略)

	//補助的データ
	int	   msizex,		//xサイズ
		   msizey;		//yサイズ
             (一部省略)

public:
	GraphicItem();
	virtual ~GraphicItem();

	//読込関数は読込成功でture,失敗でfalseを返す
	bool GraphicLoad(char *Fname);				//ファイル読込
	bool GraphicLoad(char *Fname,int knum,int kxd,int kyd);	//ファイル分割読込 (ファイル名,読込枚数,横方向枚数,縦方向枚数)
	bool GraphicLoad(int kHandle);				//ハンドル読込

      (一部省略)

};

#endif GRAPHICITEM

GraphicItem.cpp

コード:

bool GraphicItem::GraphicLoad(char *Fname,int knum,int kxd,int kyd){

	//データ初期化&代入
	int sHandle,sx,sy;
		
	//画像サイズ取得
	sHandle = LoadGraph(Fname);

      ///////////////Test///////////////
             int aaa = DrawGraph(0,0,sHandle,TRUE);
             //////////////////////////////////
	
	//読込成功判定
	if(sHandle != -1){
		if(msizex == 0 && msizey == 0){
			int i = GetGraphSize(sHandle,&sx,&sy);
			msizex = sx;
			msizey = sy;
		}
		DeleteGraph(sHandle);
		sx /= kxd;
		sy /= kyd;
			
		//データ保管
		if(mNumber == 0){
			mHandle = new int[knum];
			LoadDivGraph(Fname,knum,kxd,kyd,sx,sy,mHandle);
			mNumber = knum;
                  
                 (一部省略)

		}
		else{
               (省略)
		}
	}
	return (sHandle != -1) ? false : true;
}
自分なりに原因を調べてみると、LoadGraph関数が(表現が不適切ですが)謎の挙動をしてることが分かりました。
LoadGraph関数をGraphicLoad関数内で使用しているとハンドル値は取得していることは確認できたのですが、//Test//で囲んだDrawGraph関数を実行すると-1を返していることが分かりました。
その為か、その後にあるGetGraphSize関数はうまく動作せずに画像サイズはx、y共に0が代入されました。
また、試しにファイルパスを-1を返すように変えてみましたが何故かハンドル値を取得していました。
ゲームの方のみこの現象が発生し、テスト、ジョークソフト側ではハンドル値は正常に取得し、DrawGraphは0を返し画像サイズも正常に取得していました。ファイルパスを-1に返す試みも成功しています。

さらに(これも表現が不適切ですが)不思議な事に、GraphicLoad(char *Fname)の方を使用した時はゲーム側では同様の現象が発生していますが、派生クラスの方でGraphicLoad(char *Fname)で取得したハンドル値を使って画像を表示させると正常に表示され、返り値も0が返っています。
以下がGraphicLoad(char *Fname)の内容です。

コード:

bool GraphicItem::GraphicLoad(char *Fname){
	if(mNumber == 0){
		mHandle		 = new int [++mNumber];
            (一部省略)
	}
	else{
		(省略)
	}

	mHandle[mNumber - 1]	  = LoadGraph(Fname);
      (一部省略)

	if(msizex == 0 && msizey == 0)
		GetGraphSize(mHandle[mNumber - 1],&msizex,&msizey);

	//////////////////////test///////////////
	int aaa = DrawGraph(0,0,mHandle[0],TRUE);
      ////////////////////////////////////////

	return (mHandle[mNumber - 1] != -1) ? false : true;
}
テストもジョークソフトも成功しているのだからゲームプログラムが悪いとは思っているのですが、ライブラリ内での挙動なのでどちらが悪いのか判断できない状態です。
LoadGraph関数が何故こうなっているのかが分かりません・・・

長文となりすいませんが、よろしくお願いします。

Re: DXライブラリを組み込んだ自作ライブラリでの画像読込失敗

Posted: 2013年10月14日(月) 00:11
by softya(ソフト屋)
特定のパターンで動いたからといってバグがないとは断言できません。
気になるのは遅延ロードはされていませんよね?

Re: DXライブラリを組み込んだ自作ライブラリでの画像読込失敗

Posted: 2013年10月14日(月) 00:22
by NKiYo
遅延ロードの意味が分からなくてすいません・・・
非同期読込のことかと思ってその辺りを弄ってみました。
ローディング画面を表示させる為、ゲームプログラミングのみ非同期読込を行っていました。
SetUseASyncLoadFlag関数の方をFALSEにして、同期に関するところを直してみると動作しました。

これから同期関係を修正していきます。本当にありがとうございました!!