void shiftGroupScale(MaskPuzzleFragmentGroup group, float amount)
 {
     foreach (var fragment in grabbedFragmentGroup.fragments)
     {
         fragment.transform.localScale += Vector3.one * amount;
     }
 }
    //Connect this group to another fragment group
    public void connectTo(MaskPuzzleFragmentGroup group)
    {
        if (group == this)
        {
            return;
        }

        group.assignedCamera.enabled = false;
        assignedCamera.cullingMask  |= group.assignedCamera.cullingMask;

        fragments.AddRange(group.fragments);
        foreach (var fragment in group.fragments)
        {
            fragment.fragmentGroup = this;
        }
    }
Exemple #3
0
 // Check if two fragments can be connected directly
 public bool areConnectable(MaskPuzzleFragmentGroup group1, MaskPuzzleFragmentGroup group2)
 {
     if (overrideEdgeCheck)
     {
         return(true);
     }
     foreach (Edge edge in connectableEdges)
     {
         if ((group1 == edge.fragment1.fragmentGroup && group2 == edge.fragment2.fragmentGroup) ||
             (group1 == edge.fragment2.fragmentGroup && group2 == edge.fragment1.fragmentGroup))
         {
             return(true);
         }
     }
     return(false);
 }
Exemple #4
0
 void Start()
 {
     fragmentGroup = new MaskPuzzleFragmentGroup(this);
 }
    // Handle dragging and dropping the fragments
    void HandleDragging()
    {
        // Grabbing a fragment
        if (grabbedFragmentGroup == null && Input.GetMouseButtonDown(0))
        {
            // Get an array of all the fragments under the cursor
            Ray          mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit[] hits     = Physics.RaycastAll(mouseRay, float.PositiveInfinity, 31 << 14);

            RaycastHit             topHit = new RaycastHit();
            MaskPuzzleMaskFragment fragmentHit, topHitFragment = null;
            float topHitDepth    = -1f;
            float topHitDistance = 0f;

            // There might be multiple fragments under the cursor
            // We need to determine which one is on top - that one will be grabbed
            // We pick the one whose assigned camera has the highest depth
            // In case of equal depth we pick the fragment closest to the camera
            foreach (RaycastHit hit in hits)
            {
                fragmentHit = hit.collider.GetComponent <MaskPuzzleMaskFragment>();
                if (fragmentHit.fragmentGroup.assignedCamera.depth <= topHitDepth)
                {
                    continue;
                }
                if (fragmentHit.fragmentGroup.assignedCamera.depth == topHitDepth &&
                    hit.distance >= topHitDistance)
                {
                    continue;
                }
                topHit         = hit;
                topHitFragment = fragmentHit;
                topHitDepth    = fragmentHit.fragmentGroup.assignedCamera.depth;
                topHitDistance = hit.distance;
            }

            if (topHitFragment)
            {
                grabbedFragmentGroup = topHitFragment.fragmentGroup;
                shiftGroupScale(grabbedFragmentGroup, grabScaleIncrease);
                // Grabbed fragment group should be on top
                grabbedFragmentGroup.assignedCamera.depth = (topDepth += .005f);
                // Save the grabbed point's coordinates needed for calculating position when dragging
                grabZ      = topHit.point.z;
                grabOffset = topHitFragment.transform.position
                             - CameraHelper.getCursorPosition(grabZ);
                print("Top hit=" + topHitFragment + "; depth=" + topHitDepth + "; dist=" + topHitDistance
                      + "; z=" + topHit.point.z);
                MicrogameController.instance.playSFX(
                    grabSound,
                    volume: 1f,
                    panStereo: AudioHelper.getAudioPan(topHitFragment.transform.position.x)
                    );
            }
        }

        // Dropping a fragment
        else if (grabbedFragmentGroup != null && !Input.GetMouseButton(0))
        {
            shiftGroupScale(grabbedFragmentGroup, -grabScaleIncrease);
            MicrogameController.instance.playSFX(
                dropSound,
                volume: 1f,
                pitchMult: dropPitchMult,
                panStereo: AudioHelper.getAudioPan(grabbedFragmentGroup.fragments[0].transform.position.x)
                );
            if (grabbedFragmentGroup.SnapToOtherFragments())
            {
                MicrogameController.instance.playSFX(
                    placeSound,
                    volume: 1f,
                    panStereo: AudioHelper.getAudioPan(grabbedFragmentGroup.fragments[0].transform.position.x)
                    );
                if (CheckVictory())
                {
                    MicrogameController.instance.playSFX(
                        victorySound,
                        volume: 1f,
                        panStereo: 0f
                        );
                }
            }
            grabbedFragmentGroup = null;
        }

        // Dragging fragments
        else if (grabbedFragmentGroup != null)
        {
            Vector3 position = CameraHelper.getCursorPosition(grabZ);
            position += grabOffset;
            foreach (MaskPuzzleMaskFragment fragment in grabbedFragmentGroup.fragments)
            {
                fragment.transform.position = position;
            }
        }
    }