プログラマーの卵の日記

備忘録になってます!小難しそうなことから超簡単なことまでやってます!!

【DxLib】少し変わったスクロールをさせたい【2D】

【DxLib】少し変わったスクロールをさせたい

構成


No.1 キャラクターの動きからずれた動きをするカメラ
No.2 背景をゆらゆら







        No.1 キャラクターの動きからずれた動きをするカメラ


 良い言葉が思いつかなかったので「キャラクターの動きからずれた動きをするカメラ」とかいう少し長めの名前になりました。
ゲームにおいて自由に動けるキャラクターがいたとして、そのキャラクターをカメラが常に追従するのが普通だと思います。
ですが、それよりは少しずらして動かしたほうが動いている感が高いと思うのでそれを作ってみます。

さすがにややこしくなったのでコメントアウト入れた。


/// --------------------------------------------------------------------------------------------------
void Move(const int& t_graphXsize, const int& t_charaXsize, const float& t_charaSpeed, const float& t_charaScroll, float& t_cameraAreaX, float& t_backAreaX,
	float& t_charaDrawAreaX, float& t_charaAreaX, float& t_cameraSpeed, bool& t_isRightMove)
{
	bool isCharaMove = false;		// キャラクターがスクロール位置まで移動したかどうか


	// 左移動
	if (CheckHitKey(KEY_INPUT_LEFT))
	{
		t_charaAreaX -= t_charaSpeed;
		if (t_charaAreaX < 0.0f)
		{
			t_charaAreaX = 0.0f;
		}
	}
	// 右移動
	if (CheckHitKey(KEY_INPUT_RIGHT))
	{
		t_charaAreaX += t_charaSpeed;
		if (t_charaAreaX > static_cast<float>(t_graphXsize))
		{
			t_charaAreaX = static_cast<float>(t_graphXsize);
		}
	}


	// 左のスクロール位置以上に着いた
	if (t_cameraAreaX < t_charaAreaX - t_charaScroll)
	{
		isCharaMove = true;
		t_isRightMove = false;
	}
	// 右のスクロール位置以上に着いた
	if (t_cameraAreaX > t_charaAreaX + t_charaScroll)
	{
		isCharaMove = true;
		t_isRightMove = true;
	}


	if (isCharaMove)
	{
		// カメラをゆっくり動かす
		t_cameraSpeed += t_charaSpeed / 10.0f;
		if (t_cameraSpeed > t_charaSpeed)
		{
			t_cameraSpeed = t_charaSpeed;
		}
		if (t_isRightMove)
		{
			t_cameraAreaX -= t_cameraSpeed;
		}
		else
		{
			t_cameraAreaX += t_cameraSpeed;
		}
	}
	else
	{
		// カメラをゆっくり止める
		t_cameraSpeed -= t_charaSpeed / 10.0f;
		if (t_cameraSpeed < 0.0f)
		{
			t_cameraSpeed = 0.0f;
		}
		if (t_isRightMove)
		{
			t_cameraAreaX -= t_cameraSpeed;
		}
		else
		{
			t_cameraAreaX += t_cameraSpeed;
		}
	}

	
	// カメラが左端にたどり着いたら止める
	if (t_cameraAreaX < winWidth / 2.0f)
	{
		t_cameraAreaX = winWidth / 2.0f;
	}
	// カメラが右端にたどり着いたら止める
	if (t_cameraAreaX > t_graphXsize - winWidth / 2.0f)
	{
		t_cameraAreaX = t_graphXsize - winWidth / 2.0f;
	}


	t_charaDrawAreaX = (t_charaAreaX - t_cameraAreaX)/*ビュー座標中心からのキャラクターの位置*/ + (winWidth / 2.0f)/*画面の中心*/ - (t_charaXsize / 2.0f)/*キャラクターの半分*/;
	t_backAreaX = winWidth / 2.0f - t_cameraAreaX;
}


main関数の一部とループ部分


	int back = LoadGraph("tes2.png");			// 背景画像
	const int backSize = 1920;					// 背景画像の横サイズ
	float backAreaX = 0.0f;						// 背景画像のX位置

	const int charaSize = 128;					// キャラクターの横サイズ
	const float charaSpeed = 10.0f;				// キャラクターの移動スピード
	float charaDrawAreaX = 640 / 2.0f;			// キャラクターの描画のX座標
	float charaAreaX = 640 / 2.0f;				// カメラに追従されるキャラクターのX座標

	const float charaScrollStart = 150.0f;		// 画面中心から左右のスクロールを開始させる位置

	float cameraAreaX = 640 / 2.0f;				// キャラクターを追従するカメラのX座標
	float cameraSpeed = 0.0f;					// カメラの移動スピード

	bool isRightMove = false;					// 現在または最後に向かっていた方向がどちらか

	// メインループ
	while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE))
	{
		Move(backSize, charaSize, charaSpeed, charaScrollStart, cameraAreaX, backAreaX, charaDrawAreaX, charaAreaX, cameraSpeed, isRightMove);

		DrawGraph(backAreaX, 0, back, false);
		DrawBox(charaDrawAreaX, 480 - charaSize, charaDrawAreaX + charaSize, 480, GetColor(255, 0, 0), true);
	}

 

f:id:yutateno:20191124193220g:plain







        No.2 背景をゆらゆら


 背景をゆらゆらさせてみた。内容もそんなに難しくなくても画像の一ラインずつをサイン波で位置をずらしながら描画しているだけです。


/// --------------------------------------------------------------------------------------------------
void Move(const int t_graph, int& t_shakeValue, int& t_areaX, const float t_time)
{
	if (CheckHitKey(KEY_INPUT_DOWN))
	{
		t_shakeValue--;
		if (t_shakeValue < 0)
		{
			t_shakeValue = 0;
		}
	}
	if (CheckHitKey(KEY_INPUT_UP))
	{
		t_shakeValue++;
		if (t_shakeValue > 30)
		{
			t_shakeValue = 30;
		}
	}
	if (CheckHitKey(KEY_INPUT_RIGHT))
	{
		t_areaX++;
		if (t_areaX > 640)
		{
			t_areaX = 0;
		}
	}
	if (CheckHitKey(KEY_INPUT_LEFT))
	{
		t_areaX--;
		if (t_areaX < 0)
		{
			t_areaX = 640;
		}
	}

	for (int i = 0; i < 480; i++)
	{
		int area = static_cast<int>(t_shakeValue * sinf(2.0f * M_PI * (t_time / 60.0f - i / 200.0f)));

		DrawRectGraph(area, i, t_areaX, i, 640, 1, t_graph, false);
		DrawRectGraph(640 - t_areaX + area, i, 0, i, t_areaX, 1, t_graph, false);
	}
}


main関数の一部とループ部分


	int back = LoadGraph("background.png");			// 背景画像
	int backX = 0;

	int shakeValue = 0;

	float time = 0.0f;

	// メインループ
	while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE))
	{
		Move(back, shakeValue, backX, time++);
	}

 

f:id:yutateno:20191124193301g:plain