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)); }
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}"); }
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); } }
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)); } }
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}"); } }
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); } }
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)); }
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)); } }
/// <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); }