Пример #1
0
        public void GcMathAlmostSame()
        {
            for (var i = 0; i < 100; i++)
            {
                var v1 = UnityEngine.Random.Range(float.MinValue, float.MaxValue - 1);
                var v2 = v1 + math.EPSILON;
                var v3 = v1 - math.EPSILON;
                Assert.IsTrue(GcMath.AlmostSame(v1, v2));
                Assert.IsTrue(GcMath.AlmostSame(v1, v3));
            }
            for (var i = 0; i < 100; i++)
            {
                var v1 = new float2(UnityEngine.Random.Range(float.MinValue, float.MaxValue - 1), UnityEngine.Random.Range(float.MinValue, float.MaxValue - 1));
                var v2 = v1 + new float2(math.EPSILON, math.EPSILON);
                var v3 = v1 + new float2(math.EPSILON, -math.EPSILON);
                var v4 = v1 + new float2(-math.EPSILON, -math.EPSILON);
                Assert.IsTrue(GcMath.AlmostSame(v1, v2));
                Assert.IsTrue(GcMath.AlmostSame(v1, v3));
                Assert.IsTrue(GcMath.AlmostSame(v1, v4));
            }

            Assert.IsTrue(GcMath.AlmostSame(float.PositiveInfinity, float.PositiveInfinity));
            Assert.IsTrue(GcMath.AlmostSame(float.NegativeInfinity, float.NegativeInfinity));
            Assert.IsFalse(GcMath.AlmostSame(0, float.PositiveInfinity));
            Assert.IsFalse(GcMath.AlmostSame(0, float.NegativeInfinity));
            Assert.IsFalse(GcMath.AlmostSame(float.PositiveInfinity, float.NegativeInfinity));
            Assert.IsFalse(GcMath.AlmostSame(float.NaN, float.NaN));
        }
Пример #2
0
 public void GcMathCos()
 {
     Assert.IsTrue(GcMath.AlmostSame(GcMath.Cos(0f), 1f), $"{GcMath.Cos(0f):e}");
     //Assert.IsTrue(GcMath.AlmostSame(GcMath.Cos(90f), 0f), $"{GcMath.Cos(90f):e}");
     Assert.IsTrue(GcMath.AlmostSame(GcMath.Cos(180f), -1f), $"{GcMath.Cos(180f):e}");
     //Assert.IsTrue(GcMath.AlmostSame(GcMath.Cos(270f), 0f), $"{GcMath.Cos(270f):e}");
 }
Пример #3
0
        public void GcMathRandomMinMax()
        {
            var seed = (uint)(1 + UnityEngine.Random.value * (uint.MaxValue - 1));

            GcMath.SetRandomSeed(seed);

            for (var i = 0; i < 100; i++)
            {
                var a   = UnityEngine.Random.Range(int.MinValue, int.MaxValue);
                var b   = UnityEngine.Random.Range(int.MinValue, int.MaxValue);
                var min = UnityEngine.Mathf.Min(a, b);
                var max = UnityEngine.Mathf.Max(a, b);

                var v = GcMath.Random(min, max);
                Assert.IsTrue(v >= min && v < max);
            }
            for (var i = 0; i < 100; i++)
            {
                var a   = UnityEngine.Random.Range(float.MinValue, float.MaxValue);
                var b   = UnityEngine.Random.Range(float.MinValue, float.MaxValue);
                var min = UnityEngine.Mathf.Min(a, b);
                var max = UnityEngine.Mathf.Max(a, b);

                var v = GcMath.Random(min, max);
                Assert.IsTrue(v >= min && v < max);
            }
        }
Пример #4
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));
     }
 }
Пример #5
0
        public void GcMathAtan2()
        {
            for (var i = 0; i < 100; i++)
            {
                var x = UnityEngine.Random.value;
                var y = UnityEngine.Random.value;

                var a1 = GcMath.Atan2(new float2(x, y));
                var a2 = math.degrees(math.atan2(y, x));
                Assert.IsTrue(GcMath.AlmostSame(a1, a2), $"{a1:e} != {a2:e}");
            }
        }
Пример #6
0
        public void GcMathRandom()
        {
            var seed = (uint)(1 + UnityEngine.Random.value * (uint.MaxValue - 1));

            GcMath.SetRandomSeed(seed);

            for (var i = 0; i < 100; i++)
            {
                var v = GcMath.Random();
                Assert.IsTrue(v > 0f && v < 1f);
            }
        }
Пример #7
0
        public void GcMathAbs()
        {
            for (var i = 0; i < 100; i++)
            {
                var v = UnityEngine.Random.Range(int.MinValue, int.MaxValue);
                Assert.AreEqual(GcMath.Abs(v), UnityEngine.Mathf.Abs(v));
            }
            for (var i = 0; i < 100; i++)
            {
                var v = UnityEngine.Random.Range(float.MinValue, float.MaxValue);
                Assert.AreEqual(GcMath.Abs(v), UnityEngine.Mathf.Abs(v));
            }

            Assert.AreEqual(GcMath.Abs(float.NaN), UnityEngine.Mathf.Abs(float.NaN));
            Assert.AreEqual(GcMath.Abs(float.PositiveInfinity), UnityEngine.Mathf.Abs(float.PositiveInfinity));
            Assert.AreEqual(GcMath.Abs(float.NegativeInfinity), UnityEngine.Mathf.Abs(float.NegativeInfinity));
        }
Пример #8
0
 public void GcMathAlmostZero()
 {
     for (var i = 0; i < 100; i++)
     {
         var v = UnityEngine.Random.value * math.EPSILON;
         Assert.IsTrue(GcMath.AlmostZero(v));
     }
     for (var i = 0; i < 100; i++)
     {
         var v = UnityEngine.Random.Range(1f, float.MaxValue);
         Assert.IsFalse(GcMath.AlmostZero(v));
     }
     for (var i = 0; i < 100; i++)
     {
         var v = UnityEngine.Random.Range(float.MinValue, -1f);
         Assert.IsFalse(GcMath.AlmostZero(v));
     }
 }
Пример #9
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);
    }