public SlabManager(Settings settings, SlabFactory slabFactory, Slab initialSlab, Camera mainCamera, SignalBus signalBus) { this.settings = settings; this.slabFactory = slabFactory; this.initialSlab = initialSlab; this.mainCamera = mainCamera; this.signalBus = signalBus; }
public void TrySliceSlab(Slab slab) { var previousSlab = GetPreviousSlab(); if (FastApproximately(slab.Position.z, previousSlab.Position.z, settings.snapThreshold) && FastApproximately(slab.Position.x, previousSlab.Position.x, settings.snapThreshold)) { slab.Position = new Vector3(previousSlab.Position.x, slab.Position.y, previousSlab.Position.z); signalBus.Fire <PerfectStackSignal>(); SpawnNext(); return; } var slip = slab.Position - previousSlab.Position; slip.y = 0; var overhangX = Mathf.Abs(slip.x); var overhangZ = Mathf.Abs(slip.z); if (overhangX >= slab.Scale.x || overhangZ >= slab.Scale.z) { slab.ChangeState(SlabStates.Falling); Stop(); return; } var newScaleX = previousSlab.Scale.x - overhangX; var newScaleZ = previousSlab.Scale.z - overhangZ; var newPositionX = previousSlab.Position.x + slip.x / 2; var newPositionZ = previousSlab.Position.z + slip.z / 2; var fallingSlabScaleX = overhangX == 0 ? slab.Scale.x : overhangX; var fallingSlabScaleZ = overhangZ == 0 ? slab.Scale.z : overhangZ; var fallingSlabPositionX = slab.Position.x + (newScaleX / 2 * slip.normalized.x); var fallingSlabPositionZ = slab.Position.z + (newScaleZ / 2 * slip.normalized.z); slab.Scale = new Vector3(newScaleX, slab.Scale.y, newScaleZ); slab.Position = new Vector3(newPositionX, slab.Position.y, newPositionZ); var fallingSlab = slabFactory.Create(); fallingSlab.Position = new Vector3(fallingSlabPositionX, slab.Position.y, fallingSlabPositionZ); fallingSlab.Scale = new Vector3(fallingSlabScaleX, slab.Scale.y, fallingSlabScaleZ); fallingSlab.Color = slab.Color; fallingSlab.StartingState = SlabStates.Falling; UnityEngine.Object.Destroy(fallingSlab.gameObject, 1f); signalBus.Fire <StackSignal>(); SpawnNext(); }
public SlabState CreateState(SlabStates state, Slab slab) { switch (state) { case SlabStates.Falling: { return(fallingFactory.Create(slab)); } case SlabStates.Stacked: { return(stackedFactory.Create(slab)); } case SlabStates.Moving: { return(movingFactory.Create(slab)); } } throw Assert.CreateException(); }