コード例 #1
0
 public static void Recycle(Cannonball cannonball)
 {
     if (cannonball.recycled)
     {
         return;
     }
     cannonball.recycled = true;
     cannonball.gameObject.SetActive(false);
     recycledCannonballs.Push(cannonball);
     activeCannonballs.Remove(cannonball);
 }
コード例 #2
0
        public void StartGame()
        {
            Cannonball.RecycleAllCannonballs();
            TerrainArea.instance.CreateBoxes(terrainWidth, terrainLength);
            Vector2Int plrPos = TerrainArea.instance.CreateTanks(numTanks);

            Player.instance.Spawn(plrPos.x, plrPos.y);

            CameraControl.instance.Follow();

            time = 0;
        }
コード例 #3
0
ファイル: Tank.cs プロジェクト: mambotuna/DOTS-training
        // Update is called once per frame
        void Update()
        {
            UpdateTranslation();
            RotateTowardsPlayer();

            time += Time.deltaTime;
            if (time >= Game.instance.tankLaunchPeriod)
            {
                // launching cannonball
                time -= Game.instance.tankLaunchPeriod;

                // start and end positions
                Vector3    start     = transform.localPosition;
                Vector2Int playerBox = TerrainArea.instance.BoxFromLocalPosition(Player.instance.transform.localPosition);
                Vector3    end       = TerrainArea.instance.LocalPositionFromBox(playerBox.x, playerBox.y, TerrainArea.instance.GetBox(playerBox.x, playerBox.y).top + Cannonball.RADIUS);
                float      distance  = (new Vector2(end.z - start.z, end.x - start.x)).magnitude;
                float      duration  = distance / Cannonball.SPEED;
                if (duration < .0001f)
                {
                    duration = 1;
                }

                // binary searching to determine height of cannonball arc
                float low = Mathf.Max(start.y, end.y);
                float high = low * 2;
                float paraA, paraB, paraC;

                // look for height of arc that won't hit boxes
                while (true)
                {
                    Parabola.Create(start.y, high, end.y, out paraA, out paraB, out paraC);
                    if (!Cannonball.CheckBoxCollision(start, end, paraA, paraB, paraC))
                    {
                        // high enough
                        break;
                    }
                    // not high enough.  Double value
                    low   = high;
                    high *= 2;
                    // failsafe
                    if (high > 9999)
                    {
                        return;                         // skip launch
                    }
                }

                // do binary searches to narrow down
                while (high - low > Game.instance.playerParabolaPrecision)
                {
                    float mid = (low + high) / 2;
                    Parabola.Create(start.y, mid, end.y, out paraA, out paraB, out paraC);
                    if (Cannonball.CheckBoxCollision(start, end, paraA, paraB, paraC))
                    {
                        // not high enough
                        low = mid;
                    }
                    else
                    {
                        // too high
                        high = mid;
                    }
                }

                // launch with calculated height
                float      height     = (low + high) / 2;
                Cannonball cannonball = Cannonball.Create(transform.parent, start);
                cannonball.Launch(end, height, duration);

                // set cannon rotation
                SetCannonRotation(Mathf.Atan2(Parabola.Solve(paraA, paraB, paraC, .1f) - Parabola.Solve(paraA, paraB, paraC, 0), .1f) * Mathf.Rad2Deg);
            }
        }