Masaoさんがおっしゃるとおりいくつか方法があります。
せっかくなので透過画像を利用するサンプルを作成してみました。
ポイントは描画順序と SetDrawArea です。
実行には画像ファイルが3種類必要です。
特に"scope.png"はαチャネルではなく透過色の機能を利用しても可能です。
その場合 SetUseTransColor をコメントにして下さい。
//-- 以下サンプル (画像ファイルを3種使用) --//
#include "DxLib.h"
const char *MapFile = "map.png"; // 640x480を想定。内容は何でも可
const char *CharactorFile = "charactor.png"; // 32x32を想定。内容は何でも可
const char *ScopeFile = "scope.png"; // 128x128を想定。中央もしくは全体のαチャンネルが透過している画像を使用
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE );
if ( DxLib_Init( ) == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
SetUseTransColor( TRUE ); // 透過色を無効可
int BlindColor = GetColor( 128, 128, 128 ); // 見えない部分は灰色
int MapHandle = LoadGraph( MapFile );
int CharHandle = LoadGraph( CharactorFile );
int ScopeHandle = LoadGraph( ScopeFile );
int CharWidth, CharHight, ScopeWidth, ScopeHight;
GetGraphSize( CharHandle, &CharWidth, &CharHight );
GetGraphSize( ScopeHandle, &ScopeWidth, &ScopeHight );
int CharX = (640 - CharWidth) / 2, CharY = (480 - CharHight) / 2;
int ScopeOffX = -((ScopeWidth - CharWidth) / 2), ScopeOffY = -((ScopeHight - CharHight) / 2);
while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
if ( CheckHitKey( KEY_INPUT_UP ) && CharY > 0 ) CharY -= 3;
if ( CheckHitKey( KEY_INPUT_DOWN ) && CharY < 480 - CharHight ) CharY += 3;
if ( CheckHitKey( KEY_INPUT_LEFT ) && CharX > 0 ) CharX -= 3;
if ( CheckHitKey( KEY_INPUT_RIGHT ) && CharX < 640 - CharWidth ) CharX += 3;
ClearDrawScreen( );
DrawBox( 0, 0, 640, 480, BlindColor, TRUE );
SetDrawArea( CharX + ScopeOffX, CharY + ScopeOffY, CharX + ScopeOffX + ScopeWidth, CharY + ScopeOffY + ScopeHight );
DrawGraph( 0, 0, MapHandle, FALSE );
DrawGraph( CharX, CharY, CharHandle, TRUE );
DrawGraph( CharX + ScopeOffX, CharY + ScopeOffY, ScopeHandle, TRUE );
SetDrawArea( 0, 0, 640, 480 );
ScreenFlip( );
}
DxLib_End( );
return 0;
}