Skip to content

ブロックくずし(解説付き)

azaika edited this page Jul 16, 2017 · 8 revisions
ブロックくずし

ブロックや壁の大きさ、ボールのスピード、サウンドなどを変えてみましょう。

# include <Siv3D.hpp>

void Main()
{
	// 衝突時の効果音
	// Wave のコンストラクタで 0.1 秒の音声波形を作成、Sound として読み込み
	const Sound sound(Wave(0.1s, [](double t) { return Fraction(t * 440)*0.5 - 0.25; }));

	// ブロックの大きさ
	const Size blockSize(40, 20);

	// ボールが毎フレーム進む速さ
	const double speed = 8.0;

	// バーを表す長方形
	Rect bar(60, 10);

	// ボールを表す円
	Circle ball(320, 400, 8);

	// ボールの速度
	Vec2 ballSpeed(0, -speed);

	// ブロックの配列
	Array<Rect> blocks;

	// 横: (ウィンドウの幅 / ブロックの幅) 個 × 縦: 5 個
	for (auto p : step({ Window::Width() / blockSize.x , 5 }))
	{
		blocks.emplace_back((p*blockSize).moveBy(0, 60), blockSize);
	}

	while (System::Update())
	{
		// ボールを移動
		ball.moveBy(ballSpeed);

		// バーを移動
		bar.setCenter(Mouse::Pos().x, 420);

		for (auto it = blocks.begin(); it != blocks.end(); ++it)
		{
			// バーとボールが交差していたら
			if (it->intersects(ball))
			{
				// 上下に衝突していたら y 方向, それ以外は x 方向の速度を反転
				(it->bottom.intersects(ball) || it->top.intersects(ball)
					? ballSpeed.y : ballSpeed.x) *= -1;

				// 衝突したブロックを削除
				blocks.erase(it);

				// 効果音の再生
				// 連続して衝突したときに多重再生されるので play() ではなく playMuliti()
				sound.playMulti();

				// 衝突したらこれ以上は判定しない
				break;
			}
		}

		// ブロックを描画
		for (auto const& block : blocks)
		{
			block.stretched(-1).draw(HSV(block.y - 40));
		}

		// 天井にあたると反射
		if (ball.y < 0 && ballSpeed.y <  0)
		{
			ballSpeed.y *= -1;
		}

		// 左右の壁に当たると反射
		if ((ball.x < 0 && ballSpeed.x < 0) || (Window::Width() < ball.x && ballSpeed.x > 0))
		{
			ballSpeed.x *= -1;
		}

		// バーに当たると反射
		if (ballSpeed.y > 0 && bar.intersects(ball))
		{
			// バーの中心に近いほど上向きに飛ばす
			ballSpeed = Vec2((ball.x - bar.center.x) / 8, -ballSpeed.y).setLength(speed);
		}

		// ボールを描画
		ball.draw();

		// バーを描画
		bar.draw();
	}
}

Siv3D について

  1. Siv3D の基本
  2. 図形を描く
  3. テクスチャを描く
  4. テキストを描く
  5. 文字列と数値の変換
  6. キーボード入力
  7. マウス入力
  8. サウンドの再生
  9. MIDI の再生
  10. ウィンドウと背景
  11. 図形のあたり判定
  12. 乱数
  13. ダイアログ
  14. ドラッグ & ドロップ
  15. アプリの状態
  16. テキストファイル
  17. INI, CSV, JSON
  18. バイナリファイル
  19. GUI
  20. アセット管理
  21. 画像編集
  22. Web カメラ
  23. マイク入力
  24. 経過時間の測定
  25. HSV カラー
  26. ファイルダウンロード
  27. 3D 描画
  28. 2D のレンダーステート
  29. 3D のレンダーステート
  30. パーティクル
  31. スクリーンショット
  32. アプリケーションの公開
  33. さらに学ぶには

表現テクニック集

入出力デバイス

開発のヒント

Clone this wiki locally