ドット絵のドット感を目立たせたいがために、グラフィックの1ドットを画面上では2×2ドット(とかそれ以上)の大きさで描画したい。
最初から2倍に拡大した画像を作るというのも一つの手ですが、あとから3倍に拡大表示したくなったりしそうです。例えばStudio PixelさんのGuxt(ガスト)というゲームでは1~5倍まで好きな拡大率を選ぶことができます。
ということで今回は、現在使用中のゲーム用ライブラリSeleneにて、320×240の解像度で描画したものを2倍に拡大して640×480で画面に出力する方法を書いてみようと思います。今回描画するものは2Dスプライトのみですが、ほかのもの(線とか)も同じやり方でなんとかなると思います。
※現在Seleneのサイトがいろいろとリンク切れしているみたいですが、ファイル自体は存在するみたいです。
Seleneライブラリは http://www.moon.sakuraweb.com/download/SeleneSDK-01.24l.exe からダウンロードできます。
使用する変数はこんな感じで…
using namespace Selene; Engine::ICore* pCore; Engine::Graphics::Simple::ISpriteRenderer* pSprite; Engine::Graphics::Resource::ITexture* tex;
コアとグラフィックマネージャを初期化したら、裏で描画する用のターゲットテクスチャを一つ作ります。
// コア pCore = CreateCore(); // ウィンドウのサイズを640x480に。他は適当 pCore->Initialize(L"title", Point2DI(640, 480), true, true); // グラフィックマネージャ pCore->CreateGraphicsManager(NULL, false); //引数は適当 // スプライト pSprite = pCore->GetGraphicsManager()->CreateSpriteRenderer(); // ターゲットテクスチャ生成(320×240) tex = pCore->GetGraphicsManager()->CreateTargetTexture( Point2DI(320, 240), Engine::Graphics::TF_TARGET_UCHARx4_ALPHA);
そしてスプライトの描画リクエスト(DrawRequestとか)を行うなどした後、画面に出力する部分は
1. 描画先を320×240のターゲットテクスチャに設定し、スプライトを描画
2. 描画先を元に戻して、1.のテクスチャの内容を拡大描画
という感じにします。
pCore->FrameBegin(); // 320x240のターゲットテクスチャに切替 pCore->GetGraphicsManager()->SetRenderTarget(tex, NULL, NULL, NULL, NULL, false); pCore->GetGraphicsManager()->Clear(true, false, ColorF(0.0f, 0.0f, 0.0f, 1.0f)); pSprite->CacheReset(); /* ここでDrawRequest等をする */ // スプライトを描画 pSprite->CacheDraw(); // 描画先を元に戻す pCore->GetGraphicsManager()->SetRenderTarget(NULL, NULL, NULL, NULL, NULL, false); // 320x240から640x480へ拡大描画 pSprite->CacheReset(); pSprite->SquareRequest( RectF(0, 0, 640, 480), 16, ColorF(), RectF(0, 0, 320, 240), tex, false, false, Engine::Graphics::State::AB_OPACITY); pSprite->CacheDraw(); pCore->FrameEnd();
この方法ではグラフィックマネージャ初期化時に拡大率が決まってしまうため、プログラム実行中に拡大率を変更することはできなそうです。が、例えばプログラム起動時の引数に拡大率を指定したり、拡大率を問い合わせるダイアログを最初に出すなどして決められる程度の自由度でいいかな、と現状思っているのでこの方法を使っています。