今回はDXライブラリを使って作成中のゲームで、スクリーンショットを撮り、それをパズルのようにバラバラにしようと思ったのですが、どうしてもうまくいかなくて質問しました。
プログラミングは趣味でやってる程度なので、DXライブラリやC++にはあまり詳しくないです。
一応OSはwindows7、コンパイラはVC++の2008です。
一部改変しましたが、ここまで作りました。プログラム全部だと膨大なので、一部だけ載せます。
考え方としては、まずスクリーンショットを撮り、空のスクリーンを作ってマスクし、そこにスクリーンショットを描画してピースを取り出し、それを切り取って12個のハンドルに分けて12ピース作るというものです。
あと少しのところまでいったのですが、画像を切り出すときにDerivationGraph関数を使ってもGetDrawScreenGraph関数を使っても、puzzlegraph[0]を描画したさいに本来透過されるべき部分が黒くなってしまいます。(透過フラグをFALSEにした場合。TRUEではそもそも描画すらされません)
空のグラフィックから作ったはずなのになぜ黒くなってしまうのでしょう。
コメント部が大量にあるのは、作ったけどうまくいかないから1つだけで試すために他を無効にしたからです。
{
int mask[4];
int puzzlegraph[12];
int screenshot = MakeGraph( 640 , 480 ) ; //空のグラフィック
int sagyouba = MakeScreen( 640 , 480 ) ; //空のグラフィック
// 画面データの取りこみ
GetDrawScreenGraph( 0 , 0 , 640 , 480 , screenshot ) ;
//作業場に描画指定
SetDrawScreen(sagyouba);
// マスク画面を作成します
CreateMaskScreen() ;
// マスクデータをロードします
mask[0] = LoadMask( ".\\puzzlemask1.png" ) ;
mask[1] = LoadMask( ".\\puzzlemask2.png" ) ;
mask[2] = LoadMask( ".\\puzzlemask3.png" ) ;
mask[3] = LoadMask( ".\\puzzlemask4.png" ) ;
// ロードしたマスクデータを画面の左上に描画
DrawMask( 0 , 0 , mask[0] , DX_MASKTRANS_BLACK ) ;
//スクリーンショットを描画
DrawGraph( 0 , 0 , screenshot , TRUE ) ;
//マスクを黒く塗りつぶす
FillMaskScreen(0) ;
//画像を切り出す
puzzlegraph[0] = DerivationGraph( 0, 0, 200, 200, sagyouba ) ;
// puzzlegraph[0] = MakeGraph( 200 , 200 ) ;
// GetDrawScreenGraph( 0, 0, 200, 200, puzzlegraph[0] ) ;
puzzlegraph[2] = DerivationGraph( 290, 0, 460, 200, sagyouba ) ;
puzzlegraph[8] = DerivationGraph( 0, 280, 180, 480, sagyouba ) ;
puzzlegraph[10] = DerivationGraph( 290, 310, 580, 480, sagyouba ) ;
/*
// ロードしたマスクデータを画面の左上に描画
DrawMask( 0 , 0 , mask[1] , DX_MASKTRANS_BLACK ) ;
//スクリーンショットを描画
DrawGraph( 0 , 0 , screenshot , TRUE ) ;
//画像を切り出す
puzzlegraph[1] = DerivationGraph( 120, 0, 340, 160, sagyouba ) ;
puzzlegraph[3] = DerivationGraph( 400, 0, 640, 150, sagyouba ) ;
puzzlegraph[9] = DerivationGraph( 110, 290, 350, 480, sagyouba ) ;
puzzlegraph[11] = DerivationGraph( 470, 280, 640, 480, sagyouba ) ;
//マスクを黒く塗りつぶす
FillMaskScreen(0) ;
// ロードしたマスクデータを画面の左上に描画
DrawMask( 0 , 0 , mask[2] , DX_MASKTRANS_BLACK ) ;
//スクリーンショットを描画
DrawGraph( 0 , 0 , screenshot , TRUE ) ;
//画像を切り出す
puzzlegraph[4] = DerivationGraph( 0, 150, 190, 340, sagyouba ) ;
puzzlegraph[6] = DerivationGraph( 290, 120, 520, 390, sagyouba ) ;
//マスクを黒く塗りつぶす
FillMaskScreen(0) ;
// ロードしたマスクデータを画面の左上に描画
DrawMask( 0 , 0 , mask[3] , DX_MASKTRANS_BLACK ) ;
//スクリーンショットを描画
DrawGraph( 0 , 0 , screenshot , FALSE ) ;
//画像を切り出す
puzzlegraph[5] = DerivationGraph( 120, 90, 340, 380, sagyouba ) ;
puzzlegraph[7] = DerivationGraph( 450, 80, 640, 350, sagyouba ) ;
*/
// 描画先画面を裏にする
SetDrawScreen( DX_SCREEN_BACK ) ;
//マスク終了
InitMask() ;
DeleteMaskScreen();
// DeleteGraph(screenshot);
// DeleteGraph(sagyouba);
}
それではよろしくお願いします。