public void GcMathMax() { for (var i = 0; i < 100; i++) { var a = UnityEngine.Random.value; var b = UnityEngine.Random.value; Assert.AreEqual(GcMath.Max(a, b), UnityEngine.Mathf.Max(a, b)); } }
/// <summary> /// プレイ画面 /// </summary> private void Play() { // 画面に指が触れているなら if (gc.TryGetPointerEvent(0, out var e)) { // パドルより左側をタッチしているなら if (e.Point.x < m_Puddle.Center.x) { // パドルをさらに左に移動する。ただし左端まで m_Puddle.Center.x = GcMath.Max(m_Puddle.Center.x - 5, 90); } // パドルより右側をタッチしているなら if (e.Point.x > m_Puddle.Center.x) { // パドルをさらに右に移動する。ただし右端まで m_Puddle.Center.x = GcMath.Min(m_Puddle.Center.x + 5, 630); } } // ボールの速度と移動距離を計算 var ballSpeed = 5 + (m_BrokenCount) / 10; // ブロックを崩すたびに速度が増していく var ballDelta = m_BallDir * ballSpeed; // パドルと接触したら if (gc.SweepTest(m_Puddle, m_Ball.Position, ballDelta, out var result)) { // 跳ね返る m_Ball.Position = result.PositionOnHit; result.CalcReflect(out m_BallDir, out var reflectPos); ballDelta = reflectPos - m_Ball.Position; } for (var i = 0; i < 12; i++) { for (var j = 0; j < 8; j++) { // 無効なブロックはスキップ if (!m_Blocks[i + 12 * j]) { continue; } // 有効なブロックを描画する var block = GcAABB.XYWH(30 + 55 * i, 30 + 25 * j, 50, 20); gc.SetColor(gc.ColorGray); gc.FillRect(block); // ブロックと接触したら if (gc.SweepTest(block, m_Ball.Position, ballDelta, out result)) { // ブロックを消す m_Blocks[i + 12 * j] = false; // 破壊カウントを加算 m_BrokenCount++; // すべてのブロックを破壊したら if (m_BrokenCount == m_Blocks.Length) { // ゲームクリア m_Update = new System.Action(Result); } // 跳ね返る m_Ball.Position = result.PositionOnHit; result.CalcReflect(out m_BallDir, out var reflectPos); ballDelta = reflectPos - m_Ball.Position; } } } // ボールが左端に到達したら if (gc.SweepTest(m_WallL, m_Ball.Position, ballDelta, out result)) { // 跳ね返る m_Ball.Position = result.PositionOnHit; result.CalcReflect(out m_BallDir, out var reflectPos); ballDelta = reflectPos - m_Ball.Position; } // ボールが上端に到達したら if (gc.SweepTest(m_WallT, m_Ball.Position, ballDelta, out result)) { // 跳ね返る m_Ball.Position = result.PositionOnHit; result.CalcReflect(out m_BallDir, out var reflectPos); ballDelta = reflectPos - m_Ball.Position; } // ボールが右端に到達したら if (gc.SweepTest(m_WallR, m_Ball.Position, ballDelta, out result)) { // 跳ね返る m_Ball.Position = result.PositionOnHit; result.CalcReflect(out m_BallDir, out var reflectPos); ballDelta = reflectPos - m_Ball.Position; } // ボールが下端に到達したら if (gc.SweepTest(m_WallB, m_Ball.Position, ballDelta, out result)) { // ゲームオーバー m_Update = new System.Action(Result); } // ボールの移動 m_Ball.Position += ballDelta; // ボールを描画する gc.SetColor(gc.ColorRed); gc.FillCircle(m_Ball); // パドルを描画する gc.SetColor(gc.ColorBlack); gc.FillRect(m_Puddle); // 破壊した数を描画する gc.SetFontSize(64); gc.SetStringAnchor(GcAnchor.UpperRight); gc.DrawString($"{m_Blocks.Length - m_BrokenCount:00}", 680, 1200); }