public static void Recycle(Cannonball cannonball) { if (cannonball.recycled) { return; } cannonball.recycled = true; cannonball.gameObject.SetActive(false); recycledCannonballs.Push(cannonball); activeCannonballs.Remove(cannonball); }
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; }
// 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); } }