※補足:640x480でやってます
構成
No.1 画面サイズの画像でのスクロール(DxLib)
No.2 異なる長さの背景を同時に動かして遠近っぽくさせる
No.1 画面サイズの画像でのスクロール(DxLib)
まず、画面サイズの画像というのはゲーム画面が640x480だったら640x480の画像のことにします。
そこで、すごい横長い背景でもいいのですが、用意するのは大変だと思うので一枚の画像だけでスクロールっぽくさせるのが今回のモノ。
DxLibの関数内にある「DrawRectGraph」を使います。
void BackScroll(const int t_areaX, const int tD_graph, const int t_winWidth, const int t_winHeight)
{
DrawRectGraph(0, 0, t_areaX, 0, t_winWidth, t_winHeight, tD_graph, false);
DrawRectGraph(t_winWidth - t_areaX, 0, 0, 0, t_areaX, t_winHeight, tD_graph, false);
}
main関数内のループを含む一部
int graph = LoadGraph("back.bmp");
int areaX = 0;
int speed = 20;
// メインループ
while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE))
{
BackScroll(areaX, graph, 640, 480);
if (CheckHitKey(KEY_INPUT_A))
{
areaX -= speed;
if (areaX < 0)
{
areaX = 640;
}
}
if (CheckHitKey(KEY_INPUT_D))
{
areaX += speed;
if (areaX > 640)
{
areaX = 0;
}
}
}
No.2 異なる長さの背景を同時に動かして遠近っぽくさせる
これは多重スクロールさせるというものです。
システム的にはわりと簡単で、一番長い背景を中心として動かしつつ、他の背景も始点と終点のタイミングを同じようになるよう調整しているものです。
まぁこんな感じです。
void BackScroll(const int t_areaX, const int tD_back1, const int tD_back2, const int tD_back3, const int t_back1size, const int t_back2size, const int t_back3size)
{
float fBack_x1 = -t_areaX;
float fBack_x2 = (float)(t_back2size - 640) / (t_back1size - 640) * fBack_x1;
float fBack_x3 = (float)(t_back3size - 640) / (t_back1size - 640) * fBack_x1;
DrawGraph(fBack_x1, 0, tD_back1, false);
DrawGraph(fBack_x2, 160, tD_back2, false);
DrawGraph(fBack_x3, 320, tD_back3, false);
}
main関数内のループを含む一部
int back1 = LoadGraph("back1.png");
int back1size = 2400;
int back2 = LoadGraph("back2.png");
int back2size = 1280;
int back3 = LoadGraph("back3.png");
int back3size = 960;
float areaX = 0;
float speed = 10.0f;
// メインループ
while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE))
{
BackScroll(areaX, back1, back2, back3, back1size, back2size, back3size);
if (CheckHitKey(KEY_INPUT_A))
{
areaX -= speed;
if (areaX < 0)
{
areaX = 0;
}
}
if (CheckHitKey(KEY_INPUT_D))
{
areaX += speed;
if (areaX > static_cast<float>(back1size - 640))
{
areaX = static_cast<float>(back1size - 640);
}
}
}