すみません、グラフィックスデバイスがシェーダーモデル2.0以降に対応している環境で
アルファチャンネルがある画像を DrawBlendGraph で使用すると正常な描画結果が得られないバグがありました
修正版をアップしましたので、よろしければこちらをお使いください m(_ _;m
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用
http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
あと、MakeScreen でアルファチャンネル付きの画面を作成して使用されていますが、
アルファチャンネル付きの画面に対して描画を行う場合は『乗算済みアルファ』というものを
使用しないと正常な描画結果が得られません
『乗算済みアルファ』についてはこちらに解説がありますので、よろしければご覧ください
http://homepage2.nifty.com/natupaji/DxLib/lecture/PremulAlpha/PremulAlpha.html
載せて頂いたプログラムを『乗算済みアルファ』を使用するように一部処理を追加+変更してみましたので、
よろしければ参考にしてください
#include "DxLib.h"
// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// ウィンドウモードで起動
SetGraphMode(1024, 768, 16);
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// BlendGraphの濃さを変えるために使用
int frame = 0;
// 画面に表示する帯のスクリーン(半透明の帯を表示するためアルファ有り)
int sub_screen = MakeScreen(1024, 200, TRUE);
// ブレンド画像
int blend_graph = LoadBlendGraph("blend_graph.png");
// 薄い黄色(sub_screenに表示する帯の色)
int sub_screen_color = GetColor(255, 233, 199);
// 茶色(sub_screenに表示する文字の色)
int string_color = GetColor(53, 24, 4);
// <<追加>>乗算済みαのフォントハンドルを作成
SetFontCacheUsePremulAlphaFlag( TRUE );
int fonthandle = CreateFontToHandle( NULL, 16, 10, DX_FONTTYPE_NORMAL ) ;
while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
// 画面をクリア
ClearDrawScreen();
// サブ画面に黄色の帯と茶色の文字を表示
SetDrawScreen(sub_screen);
// 画面をクリア
ClearDrawScreen();
// <<変更>>黄色の帯は半透明で表示
SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA, 166); // 65%の濃さ
DrawBox(0, 0, 1024, 200, sub_screen_color, TRUE);
// <<変更>>サブ画面に文字を表示(文字は半透明にしない)
SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA, 255);
DrawStringToHandle(10, 10, "あいうえお", string_color, fonthandle);
// 描画対象を裏画面へ
SetDrawScreen(DX_SCREEN_BACK);
// 半透明の黄色の帯を、ブレンド画像を用いてフェードしながら表示する
if (frame < 255){
//フェード中
DrawBlendGraph(
0,
300,
sub_screen,
TRUE, // 描画対象の帯は半透明なのでTRUE
blend_graph,
255 - frame, // 少しずつ濃く表示していく
64);
frame++;
}
else{
// フェードが完了したら、ブレンド画像なしで普通に表示する
DrawGraph(0, 300, sub_screen, TRUE);
}
ScreenFlip();
}
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}