Exemple #1
0
 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));
     }
 }
Exemple #2
0
    /// <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);
    }