> もう一つの理由は、もしDirectXで直接解決出来れば、
> DXライブラリのバッファスクリーンを使う場合に比べて
> 処理が軽いだろう、と言うことです。
いえ、MakeScreen で作成できるバッファスクリーンを使う場合と処理の重さは同じです
処理の重さが同じだからこそ、ライブラリ側に自動で対応をする処理を実装することを躊躇しています
( モニター解像度のアスペクト比自動判定も上手く判定できない場合も間違いなくあるでしょうし・・・ )
PCの性能も大分上がってきたので、そろそろ実装しても良いかもとは思っていますが、
今のところまだ実装の予定はありません
> 追記:SetWindowSizeExtendRateで描画画面を拡大する
> 場合も、グラフィックがぼやけます。これも
> ネアレストネイバー法が用いられるように設定できたら
> 嬉しいです!
ウインドウ拡大時のフィルタリングはグラフィックスデバイスドライバ任せで、プログラム側から指定することができません
なので、ドライバによってはネアレストネイバー法の場合もあれば、バイリニア法の場合もあります
必ずネアレストネイバー法で拡大したい場合は、SetGraphMode で画面のサイズをデスクトップと同じにした上で
ゲーム画面サイズのオフスクリーンバッファを MakeScreen で作成してゲーム画面自体は
そのオフスクリーンバッファに描画し、ScreenFlip の前に SetDrawMode( DX_DRAWMODE_NEAREST ) ; の設定にした後
裏画面に対してウインドウのサイズと同じ大きさにオフスクリーンバッファを DrawExtendGraph で拡大描画するという方法があります
サンプルを作成してみましたので、よろしければご覧ください
#include "DxLib.h"
#define SCREEN_W (640)
#define SCREEN_H (480)
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int handle, x, add ;
int Screen ;
int DesktopW, DesktopH ;
int OldWindowW, OldWindowH ;
int WindowW, WindowH ;
// ウインドウモードで起動
ChangeWindowMode( TRUE );
// 画面サイズをデスクトップのサイズと同じにする
GetDefaultState( &DesktopW, &DesktopH, NULL ) ;
SetGraphMode( DesktopW, DesktopH, 32 ) ;
// サイズ変更を可能にする
SetWindowSizeChangeEnableFlag( TRUE, FALSE ) ;
// ウインドウサイズはゲーム画面と一致させる
SetWindowSize( SCREEN_W, SCREEN_H ) ;
// ウインドウの位置は画面中心付近にする
SetWindowPosition( ( DesktopW - SCREEN_W ) / 2, ( DesktopH - SCREEN_H ) / 2 ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// オフスクリーンバッファを作成
Screen = MakeScreen( SCREEN_W, SCREEN_H, FALSE ) ;
// 画像の読み込み
handle = LoadGraph( "Test1.bmp" ) ;
// ウインドウサイズ情報の初期化
GetWindowSize( &WindowW, &WindowH ) ;
OldWindowW = WindowW ;
OldWindowH = WindowH ;
// メインループ(何かキーが押されたらループを抜ける)
x = 0 ;
add = 8 ;
while( ProcessMessage() == 0 )
{
// 移動
x += add ;
if( x < 0 || x > 640 ) add = -add ;
// ウインドウのクライアント領域を取得する
OldWindowW = WindowW ;
OldWindowH = WindowH ;
GetWindowSize( &WindowW, &WindowH ) ;
// ウインドウサイズが変化していたら調整する
if( OldWindowW != WindowW || OldWindowH != WindowH )
{
if( OldWindowW != WindowW )
{
WindowH = WindowW * SCREEN_H / SCREEN_W ;
}
if( OldWindowH != WindowH )
{
WindowW = WindowH * SCREEN_W / SCREEN_H ;
}
SetWindowSize( WindowW, WindowH ) ;
}
// 描画先をオフスクリーンバッファにする
SetDrawScreen( Screen ) ;
// 画面のクリア
ClearDrawScreen() ;
// 画像の描画
DrawGraph( x, 0, handle, TRUE ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 裏画面に拡大描画する
SetDrawMode( DX_DRAWMODE_NEAREST ) ;
DrawExtendGraph( 0, 0, WindowW, WindowH, Screen, FALSE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}