スコープを覗いた時のような拡大・縮小表示
Posted: 2009年9月13日(日) 15:42
いつもお世話になっております、山崎です。
今回は、拡大・縮小表示についてお伺いに参りました。
現在、ライフルのスコープを覗いたときの様子をどう表現しようかと考えています。
スコープの倍率はできれば10倍くらいまで可能にしたいと考えています(最低でも5倍)。
また、3Dやポリゴンは可能であれば使用を避けたいと思っています。
精密な照準を必要とするゲームにしたいと考えているので、拡大して画像を荒くするのは避けたいと思っています。
スコープの倍率が最大の10倍のとき、用意した元の画像はそのままの大きさで描画され、
スコープを覗いていない時(倍率1倍)のとき、用意した元の画像は10分の1の大きさで描画される、
といった方式にしたいと思っています。
実質、画像を引き伸ばして描画するような拡大は無いことになります。
スコープの倍率は連続的で、倍率によってスコープから見える風景も
滑らかにズームイン・ズームアウトされるような仕様にしたいと考えています。
そこで、次のようなアルゴリズムを考えました。
1.MakeScreen()で元の画面サイズの10倍のサイズのサブ画面を用意する。
2.MakeGraph()で、元の画面サイズの10倍のサイズのグラフィック領域を用意する。
3.サブ画面に必要な風景を描画する。
4.GetDrawScreenGraph()で、スコープの倍率と焦点に応じた領域をサブ画面から切り取り、
用意したグラフィックハンドルに保存しておく。
5.裏画面全体に切り取ったグラフィックを描画する。
6.ScreenFlip()
試しに、画面サイズ10倍ではなく3倍で実行してみたのですが、
3倍程度でもFPS=15前後と非常に重くなってしまいました。
以下が、試してみた際の主なコードです。倍率の変更や焦点の移動は省いています。
倍率1倍のときの見え方を想定したコードです。
//-----------最初に一度だけ実行する部分------------------
int SubScreen=MakeScreen(640*3,480*3);
int GHandle=LoadGraph("Test.PNG");//風景。画像サイズは640*3×480*3
int SubScreenHandle=MakeGraph(640*3,480*3);
//----------------ループする部分-------------------------
SetDrawScreen(SubScreen);
DrawGraph(0,0,GHandle,FALSE);//元の画像そのままの大きさで、サブ画面に風景を描画
GetDrawScreenGraph(0,0,640*3,480*3,SubScreenHandle);//倍率1倍のときを想定。風景全体を切り取る。
SetDrawScreen(DX_SCREEN_BACK);
DrawExtendGraph(0,0,640,480,SubScreenHandle,FALSE);//裏画面に切り取った風景を描画
ScreenFlip();
私の作ってみた上のコードでは、重くてとてもゲームになりません。
画像の拡大を行わず、縮小だけでズームイン・ズームアウトを表現するにはどうしたらよいでしょうか。
今回は、拡大・縮小表示についてお伺いに参りました。
現在、ライフルのスコープを覗いたときの様子をどう表現しようかと考えています。
スコープの倍率はできれば10倍くらいまで可能にしたいと考えています(最低でも5倍)。
また、3Dやポリゴンは可能であれば使用を避けたいと思っています。
精密な照準を必要とするゲームにしたいと考えているので、拡大して画像を荒くするのは避けたいと思っています。
スコープの倍率が最大の10倍のとき、用意した元の画像はそのままの大きさで描画され、
スコープを覗いていない時(倍率1倍)のとき、用意した元の画像は10分の1の大きさで描画される、
といった方式にしたいと思っています。
実質、画像を引き伸ばして描画するような拡大は無いことになります。
スコープの倍率は連続的で、倍率によってスコープから見える風景も
滑らかにズームイン・ズームアウトされるような仕様にしたいと考えています。
そこで、次のようなアルゴリズムを考えました。
1.MakeScreen()で元の画面サイズの10倍のサイズのサブ画面を用意する。
2.MakeGraph()で、元の画面サイズの10倍のサイズのグラフィック領域を用意する。
3.サブ画面に必要な風景を描画する。
4.GetDrawScreenGraph()で、スコープの倍率と焦点に応じた領域をサブ画面から切り取り、
用意したグラフィックハンドルに保存しておく。
5.裏画面全体に切り取ったグラフィックを描画する。
6.ScreenFlip()
試しに、画面サイズ10倍ではなく3倍で実行してみたのですが、
3倍程度でもFPS=15前後と非常に重くなってしまいました。
以下が、試してみた際の主なコードです。倍率の変更や焦点の移動は省いています。
倍率1倍のときの見え方を想定したコードです。
//-----------最初に一度だけ実行する部分------------------
int SubScreen=MakeScreen(640*3,480*3);
int GHandle=LoadGraph("Test.PNG");//風景。画像サイズは640*3×480*3
int SubScreenHandle=MakeGraph(640*3,480*3);
//----------------ループする部分-------------------------
SetDrawScreen(SubScreen);
DrawGraph(0,0,GHandle,FALSE);//元の画像そのままの大きさで、サブ画面に風景を描画
GetDrawScreenGraph(0,0,640*3,480*3,SubScreenHandle);//倍率1倍のときを想定。風景全体を切り取る。
SetDrawScreen(DX_SCREEN_BACK);
DrawExtendGraph(0,0,640,480,SubScreenHandle,FALSE);//裏画面に切り取った風景を描画
ScreenFlip();
私の作ってみた上のコードでは、重くてとてもゲームになりません。
画像の拡大を行わず、縮小だけでズームイン・ズームアウトを表現するにはどうしたらよいでしょうか。