こんばんわ
私が行っている方法ですが、一応どのような環境でも
アスペクト比(画面の縦横比)が乱れないように表示する方法を紹介します
簡単に説明しますと、実行解像度(以下参照)の大きさの描画可能なグラフィック領域を作成しておき、
ゲームで表示したい描画をそこへ全て書き込み、
表示解像度(以下参照)の大きさでフルスクリーンにした表画面へDrawExtendGraph()を使って描画します
まず解像度を3つに考えます
実際にゲームを作る上での座標などを考える解像度
EffectResolution(以下実行解像度と表記)
ゲームを起動する前の普段のデスクトップの解像度
NativeResolution(以下標準解像度と表記)
ゲームをフルスクリーン起動したときに表示したい解像度
ExtendResolution(以下表示解像度と表記)
標準解像度はDxLib_Init()を呼ぶ前に
GetSystemMetrics(SM_CXSCREEN); //横幅取得
GetSystemMetrics(SM_CYSCREEN); //縦幅取得
で取得できます
実行解像度と表示解像度は内部定数や設定ファイルなどを用いて設定してください
実際の表示に関しては
黒帯(レターボックスといいます)の片側の横幅
ExLetterBoxSizeX;
同じく縦幅
ExLetterBoxSizeY;
ゲームの表示サイズの縦幅
ExScreenSizeX;
同じく横幅
ExScreenSizeY;
として、表示部では
SetDrawScreen( DX_SCREEN_FRONT );
DrawExtendGraph(ExLetterBoxSizeX,ExLetterBoxSizeY, ExScreenSizeX+ExLetterBoxSizeX,ExScreenSizeY+ExLetterBoxSizeY,TripleBuffAreaHandle, false );
SetDrawScreen( TripleBuffAreaHandle );
ClearDrawScreen();
このようにしておきます
必要であればトリプルバッファ領域も塗りつぶしして下さい
描画可能なグラフィック領域はMakeScreenで作れます
TripleBuffAreaHandle = MakeScreen( EffectResolutionX , EffectResolutionY) ;
そして解像度の計算部分ですが、基本的に縮小拡大した場合にXとY座標のどちらが画面端いっぱいになるかで
もう片方の倍率も決まるので、そんな感じで計算していきます
//アスペクト比維持用のレターボックスサイズを計算
//アスペクト比補正倍率
double ResolutionBuffX = static_cast<double>(ExtendResolutionX) / EffectResolutionX;
double ResolutionBuffY = static_cast<double>(ExtendResolutionY) / EffectResolutionY;
//補正倍率が同じなので、そのまま表示すれば問題ない
if(ResolutionBuffX == ResolutionBuffY){
ExLetterBoxSizeX = 0;
ExLetterBoxSizeY = 0;
ExScreenSizeX = ExtendResolutionX;
ExScreenSizeY = ExtendResolutionY;
}
//表示解像度より実行解像度のほうが高いので、縮めなければならない
else if(ExtendResolutionX < EffectResolutionX || ExtendResolutionY < EffectResolutionY ){
//Xのほうが大きい=等倍縮小したときにX座標のほうが長いので、画面内に収まるように
if(ResolutionBuffX > ResolutionBuffY){
ExScreenSizeX = ExtendResolutionX;
ExScreenSizeY = static_cast<int>(ResolutionBuffX * EffectResolutionY);
ExLetterBoxSizeX = 0;
ExLetterBoxSizeY = (ExtendResolutionY - ExScreenSizeY)/2;
}
//Yのほうが大きい=等倍縮小したときにY座標のほうが長いので、画面内に収まるように
else if(ResolutionBuffX < ResolutionBuffY){
ExScreenSizeX = static_cast<int>(ResolutionBuffY * EffectResolutionX);
ExScreenSizeY = ExtendResolutionY;
ExLetterBoxSizeX = (ExtendResolutionX - ExScreenSizeX)/2;
ExLetterBoxSizeY = 0;
}
}
//実行解像度より表示解像度のほうが高いので、拡大しなければならない
else if(ExtendResolutionX > EffectResolutionX || ExtendResolutionY > EffectResolutionY ){
//Xのほうが小さい=等倍拡大したときにX座標のほうがさきに画面端につく
if(ResolutionBuffX<ResolutionBuffY){
ExScreenSizeX = ExtendResolutionX;
ExScreenSizeY = static_cast<int>(ResolutionBuffX * EffectResolutionY);
ExLetterBoxSizeX = 0;
ExLetterBoxSizeY = (ExtendResolutionY - ExScreenSizeY)/2;
}
//Yのほうが小さい=等倍拡大したときにY座標のほうがさきに画面端につく
else if(ResolutionBuffX>ResolutionBuffY){
ExScreenSizeX = static_cast<int>(ResolutionBuffY * EffectResolutionX);
ExScreenSizeY = ExtendResolutionY;
ExLetterBoxSizeX = (ExtendResolutionX - ExScreenSizeX)/2;
ExLetterBoxSizeY = 0;
}
}
SetGraphMode(ExtendResolutionX,ExtendResolutionY,ExtendResolutionBit);
ちなみによくある表示モードとして、画面の中央に表示と、画面いっぱいまで拡大する例です
//センター表示
ExLetterBoxSizeX = (ExtendResolutionX - EffectResolutionX) / 2;
ExLetterBoxSizeY = (ExtendResolutionY - EffectResolutionY) / 2;
ExScreenSizeX = EffectResolutionX;
ExScreenSizeY = EffectResolutionY;
//画面いっぱいまで拡大
ExLetterBoxSizeX = 0;
ExLetterBoxSizeY = 0; ExScreenSizeX = ExtendResolutionX;
ExScreenSizeY = ExtendResolutionY;
これで、ゲーム作成で使用する解像度は固定でも、全ての環境で同じように表示されます
実際に数値を入れてみて電卓か何かで計算してみるとちゃんとそれっぽい数値が出てきます
長くなりましたが、他にもいいやり方があるかもしれないので、私のはこんな感じという紹介でしたっ!
あ、ちなみにウィンドウモード表示のときはそのままEffectResolutionを割り当てればおkです