Ejemplo n.º 1
0
 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;
 }
Ejemplo n.º 2
0
        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();
        }