はじめまして。
DXライブラリを使用してゲームを開発させていただいているいせみやという者です。
このような有用なライブラリを公開してくださっていることに感謝しています。
さて、本題ですが、次のような不具合が発生しました。
「ScreenFlipで画面を奇数回交換した後に、裏画面に対してGetDrawScreenGraphを
使用すると、正常に取得できない」
というものです。
偶数回の描画後の場合は正常に取得できました。
また、SetUse3DFlag( FALSE )かSetScreenMemToVramFlag( FALSE )を
使った場合には正常に動きましたので、環境の問題だとは思います。
ですがこれではかなり遅くなってしまうので、ScreenFlipの
代わりにScreenCopyを使用することでひとまず解決しました。
ただ多少処理負荷があがるということで、もし直す方法にお心当たりがあるようでしたら
うかがいたいと思い書き込んだ次第です。
以下は問題の発生するプログラムです。(ライブラリのバージョンは2.22fです)
まず一回ScreenFlipしてから裏画面に1000個の点を描画し、
それを取り込んでおいて、いったん消去して取り込んだデータから描画しています。
-----------------------------------------------------------------------
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int i ;
int Cr ;
int x , y ;
int GHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先画面を裏にする
ScreenFlip() ; // 裏画面と表画面を交換
Cr = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
for( i = 0 ; i < 1000 ; i ++ ) // 1000個の点を描く
{
DrawPixel( GetRand( 640 ) , GetRand( 480 ) , Cr ) ;
}
GHandle = MakeGraph( 640 , 480 ) ; // 画面のサイズと同じサイズのグラフィックを作成
GetDrawScreenGraph( 0 , 0 , 640 , 480 , GHandle ) ; // 画面データの取りこみ
ScreenFlip() ; // 裏画面の内容を表画面に反映
WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用)
ClearDrawScreen() ; // 裏画面を初期化
DrawGraph( 0, 0, GHandle, FALSE ) ; // 取り込んでおいたグラフィックを描画
printfDx( "GetDrawScreenGraph" ) ;
ScreenFlip() ; // 裏画面の内容を表画面に反映
WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
-----------------------------------------------------------------------
正常なら二回とも同じ画面が表示されるはずですが、これを実行すると二回目の画面
(GetDrawScreenGraphが表示される画面)は真っ黒となってしまいます。
最初のScreenFlipを偶数回(0,2,4,...)とするか、
SetUse3DFlag( FALSE )かSetScreenMemToVramFlag( FALSE )を入れれば正常に表示されます。
なお、私の環境は
OS:Windows XP, CPU:Athlon64 3000+, メモリ:1GB, VGA:RADEON 9250 です。