お世話になっております。てらすです。
今作っているゲームが高解像度のイラストと低解像度のドット絵(マップチップ)を混在させる仕様で、
背景イラストの上にドット絵を4倍の大きさで大量に(1000枚くらい?)描画しなければならないのですが、
そのままドット絵を4倍で描画するのではなく、MakeScreenで裏画面の1/4の画像を作ってドット絵を描画し、
作った画像を裏画面に4倍で描画するという方法の方がわかりやすいと思い、そのように実装しようと試みました。
しかし、いざ実行してみると以下の不具合が発生しました。
まず、MakeScreenで作成した透過情報付き画面Sに、透過情報付きの画像Aと
透過情報無しの画像Bを描画すると、画像Bの上に画像Aを重ねると画像Bが画像Aに上書きされたり
2枚の画像ABを重ねて描画した後に画面Sを初期化し、2枚の画像ABが重なって描画されていた場所に
もう一度画像Aを描画するとそこの透過具合がおかしくなったり
画像Bに透過情報をつけると結果が変わったりします。
条件によって色々と結果が変化し、文字では伝えづらいので、テストコードを貼り付けておきます。
よろしければ参考にしてください。
Dxlibは3.10eと6月23日のテストバージョンで試し、テストバージョンでのみ症状を確認しました。
テストバージョンでの不具合なので、デバッグがまだなだけかもしれませんが、一応報告させていただきます。
環境:
Windows 7 Home Premium 64-bit (6.1, Build 7601) Service Pack 1 (7601.win7sp1_gdr.130318-1533)
Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz (8 CPUs), ~3.4GHz
NVIDIA GeForce GTX 660 (Driver Version: 9.18.13.1422)
Visual Studio 2010 Professional (Version: 10.0.40219.1 SP1Rel)
コード:
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE );
if( DxLib_Init() == -1 ){ return -1; }
int x = 0, y = 0;
int screen = MakeScreen( 640, 480, TRUE );
//半透明な画像を作る
//LoadGraphで読み込んだアルファ付きの画像でも発生
int graphA = MakeScreen( 64, 64, TRUE );
FillGraph( graphA, 255, 255, 255, 128 );
//不透明な画像を作る
//LoadGraphで読み込んだ画像でも発生(透過の有無は関係ない?)
int graphB = MakeScreen( 64, 64, FALSE );
FillGraph( graphB, 255, 0, 0 );
while( !ProcessMessage() ){
if( CheckHitKey( KEY_INPUT_ESCAPE ) != 0 ){ break; }
//上下左右でscreen上の画像を動かす
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) ++y;
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) --x;
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) ++x;
if( CheckHitKey( KEY_INPUT_UP ) == 1 ) --y;
//アルファ付きのスクリーンに画像を描画した時のみ発生
//アルファチャンネルなしのスクリーンや裏画面に直接描画した場合は正常
//症状発生時は、初期化方法がFillGraphでもClearDrawScreenでも発生
//FillGraph( screen, 0, 0, 0, 0 );
SetDrawScreen( screen );
ClearDrawScreen();
//graphAとgraphBの描画順を入れ替えると症状が変化(改善はしない)
//2つの画像が完全に重ならない状態でgraphA→graphBの順番に描画すると正常?
DrawGraph( x, y, graphA, TRUE );
DrawGraph( x, y+48, graphB, TRUE );
SetDrawScreen( DX_SCREEN_BACK );
ClearDrawScreen();
//このDrawBoxをscreenに描画するか裏画面に描画するかで症状が変化
DrawBox( 0, 0, 320, 480, GetColor( 192, 192, 192 ), TRUE );
DrawExtendGraph( 0, 0, 640, 480, screen, TRUE );
ScreenFlip();
}
DxLib_End();
return 0;
}