ページ 11

DxLib::GetDrawScreenGraph関数について

Posted: 2014年8月28日(木) 17:29
by spaaaark・∀・
結構久しぶりの投稿です。
画像ファイルにテクスチャを群として保存しておき、その1部分をモデルのテクスチャとして使いたいのですが、
DxLib::GetDrawScreenGraph関数の要件である画像サイズをそろえているにもかかわらず、この関数でエラーが出てしまいます。
以下に実行しているコードを記述します。

コード:

const int DefGraphID = pGraphData.GetDataHandle(l_pNowDivGraphData->GraphicHandle);
const int CutPos[] = {
	l_pNowDivGraphData->BeginPos.first,
	l_pNowDivGraphData->BeginPos.second,
	l_pNowDivGraphData->DivSize.first ,
	l_pNowDivGraphData->DivSize.second
};
/* 分割描画処理 */{
	SetTextureGraphID = DxLib::MakeGraph(CutPos[2],CutPos[3]);
	// 描画対象を画像データセットに変更
	DxLib::SetDrawScreen(DefGraphID);
	// 描画対象スクリーンから指定範囲のグラフィックを読み込む
	int a=DxLib::GetDrawScreenGraph(CutPos[0],CutPos[1],CutPos[0]+CutPos[2],CutPos[1]+CutPos[3],SetTextureGraphID);
	m_LastUseGraphHandle.push_back(SetTextureGraphID); // 別系統の処理で使用(今回の件では関係なし)
	// 描画対象を元に戻す
	DxLib::SetDrawScreen(DX_SCREEN_BACK);
}
変数についてなんですが、
DefGraphID:元の大きな画像データ(デバッグにより読み込みに成功していることを確認済み)
CutPos[]:切り出しデータ[左上x/左上y/大きさx/大きさy]
SetTextureGraphID:テクスチャとして使用する画像のハンドル
という感じです。ちなみにaは出力確認用で-1(エラー)が返ってきています。

若干お手上げになりつつあるのでもし対策が思いつく方がいましたら意見をください。よろしくお願いします。

Re: DxLib::GetDrawScreenGraph関数について

Posted: 2014年8月28日(木) 18:18
by Rittai_3D
CutPos にどんな値が入っている。や、全体のコードを書いた方が回答しやすいと思います。

さて、検索してみましたところ、
http://hpcgi2.nifty.com/natupaji/bbs/pa ... st&no=2153
という記事を見つけました。

また、画像を抜き出して表示だけならhttp://homepage2.nifty.com/natupaji/DxL ... html#R3N20DrawRectGraph()でよいのでしょうか。

Re: DxLib::GetDrawScreenGraph関数について

Posted: 2014年8月29日(金) 08:02
by spaaaark・∀・
進捗状況です。
動作が重いので初期化タイミングを変更し、DrawRectGraph関数を使うこととしました。
以下にそのコードを示します。

コード:

const int DefGraphID = pGraphData.GetDataHandle(l_pNowDivGraphData->GraphicHandle);
const int CutPos[] = {
	l_pNowDivGraphData->BeginPos.first,
	l_pNowDivGraphData->BeginPos.second,
	l_pNowDivGraphData->DivSize.first ,
	l_pNowDivGraphData->DivSize.second
};
/* 分割描画処理 */{
	const int TextureID = DxLib::MakeScreen(CutPos[2],CutPos[3]);
	// 描画対象を画像データセットに変更
	int a = DxLib::SetDrawScreen(TextureID);
	// 描画対象スクリーンから指定範囲のグラフィックを読み込む
	DxLib::DrawRectGraph(0,0,CutPos[0],CutPos[1],CutPos[2],CutPos[3],DefGraphID,TRUE,FALSE);
	// 描画対象を元に戻す
	DxLib::SetDrawScreen(DX_SCREEN_BACK);
	m_UseGraphHandle.push_back(TextureID);
}
変数については、
TextureID:テクスチャとして使用するハンドル(控え)
その他の変数は前回のコードと同じ意味です。
なお、今回戻り値aの場所は0となっています。

これでうまくいくと思ったのですが、DrawRectGraphが正常に動作していないようで、この関数で描画した
結果が裏画面にそのまま描画されてしまい、テクスチャ作成に失敗してしまいます。戻り値も0で成功
しているはずなのに妙な挙動をしています。

どなたか原因が分かる方はおられますでしょうか? おられましたら意見をくださるとうれしいです。

Re: DxLib::GetDrawScreenGraph関数について

Posted: 2014年8月29日(金) 11:11
by spaaaark・∀・
以下のコードを追加して実行してみたら-1が返ってきました…。

コード:

int b = DxLib::DrawGraph(0,0,TextureID,TRUE);

Re: DxLib::GetDrawScreenGraph関数について

Posted: 2014年8月29日(金) 16:26
by spaaaark・∀・
いろいろ調べた結果、DxLib自体のバグの可能性が出てきた(関数にMakeScreenのサンプルを
入れたら同じ現象が起こった)ので、DXライブラリ質問掲示板とマルチポストという形を
取らせていただきます。よろしくお願いします。

http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=3370

Re: DxLib::GetDrawScreenGraph関数について

Posted: 2014年8月31日(日) 13:43
by spaaaark・∀・
リンク先の掲示板で調査していただいたところ、別の処理系で非同期読み込みが切れておらず、
それによりデータが作成される前のハンドルが渡っていたことが原因だと判明しました。
よって間違っているのはこの部分ではなく、ファイルを読み込むクラスにあり、これを修正したところ、
正常に表示されることが確認できました。お騒がせしました。