[1] 質問文
こんにちは。素人Aと申します。
3日間も悩んでしまったので投稿(投降ともいう)します。
背景画像のサイズが画面サイズより大きい場合、
全体を表示させたりキャラクターがいる範囲を拡大して表示させたりと、
背景とキャラクターの位置関係を維持したまま、ズームアップしたりズームアウトしたいのですが、
アルゴリズムが閃きません・・・。
ヒントでも構いませんのでお教えください。ぺこ <(_ _)>
[2] 環境
[2.1] OS : Windows Xp sp3
[2.2] コンパイラ名 : VC++ 2008EE
[3] その他
・どの程度C言語を理解しているか: 龍神録プログラミングの館50章まで。
・ライブラリを使っている場合は何を使っているか:DXライブラリ
背景(マップなど)やキャラクターの拡大縮小を行いたい
Re:背景(マップなど)やキャラクターの拡大縮小を行いたい
>背景とキャラクターの位置関係を維持したまま、ズームアップしたりズームアウトしたいのですが
どう拡大するのかで、細かいところは変わってきますが、行列使えば簡単にできます。
例えば画面中央で拡大するなら、(作るのが面倒なので)DXライブラリのを使って書くと
[color=#d0d0ff" face="monospace]
struct vector2
{
float x;
float y;
};
void GetScreenScalingVector(vector2 *out, const vector2 &in, float scale)
{
if(!out) return;
MATRIX m, mOut;
CreateIdentityMatrix(&mOut);
CreateTranslationMatrix(&m, in.x-ScreenSize_Width*0.5f, in.y-ScreenSize_Height*0.5f, 0.f);
CreateMultiplyMatrix(&mOut, &mOut, &m);
CreateScalingMatrix(&m, scale, scale, 1.f);
CreateMultiplyMatrix(&mOut, &mOut, &m);
CreateTranslationMatrix(&m, ScreenSize_Width*0.5f, ScreenSize_Height*0.5f, 0.f);
CreateMultiplyMatrix(&mOut, &mOut, &m);
VECTOR vOut, v = {0, 0, 0};
VectorTransform(&vOut, &v, &mOut);
out->x = vOut.x;
out->y = vOut.y;
}
[/color]
という感じの処理で、引数 inに元の座標を、scaleに拡大率を入れると outに結果の位置が
格納されます。
ちなみに vector2は座標を扱う構造体、ScreenSize_Width / ScreenSize_Heightは画面のサイズです。
DXライブラリのは3D用なので計算コスト的には無駄な部分がありますが、
2D用のを作ればそのあたりは改善できるはずです。