Пример #1
0
 // Start is called before the first frame update
 void Start()
 {
     m_EventSystem = EventSystem.current;
     heldSticks    = new List <GameObject>();
     stickSlot     = GetComponent <BoxCollider2D>();
     shapeSlot     = this.transform.parent.GetComponent <ShapeSlot>();
 }
Пример #2
0
    private void FindAllShapeSlots()
    {
        int i = 0;

        foreach (Transform child in transform)
        {
            ShapeSlot slot = child.GetComponent <ShapeSlot>();
            m_Slots[i] = slot;
            i++;
        }
    }
Пример #3
0
    // Update is called once per frame
    void Update()
    {
        // Press R to restart a level
        if (Input.GetKeyDown(KeyCode.R))
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
        }
        /*---- CLICK TO DRAG ----*/
        // First frame when user clicks left mouse
        if (Input.GetMouseButtonDown(0))
        {
            // If a ray hit a collider (2D)
            var hit2d = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

            if (hit2d && (hit2d.collider.gameObject.tag == "Stick"))
            {
                currentStick = hit2d.collider.gameObject;

                // Early exit from dragging if a stick is part of a completed shape.
                StickSlot stickParentSlot = currentStick.GetComponent <Stick>().GetParentSlot();
                if (stickParentSlot != null)
                {
                    if (stickParentSlot.GetShapeSlot().shapeComplete)
                    {
                        return;
                    }
                }

                stickCenter        = currentStick.transform.position;
                touchPosition      = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                offset             = touchPosition - stickCenter;
                currentStickSprite = currentStick.GetComponent <SpriteRenderer>();
                draggingMode       = true;
                m_EventSystem.SetSelectedGameObject(currentStick);
            }
        }

        // Every frame when user holds on left mouse
        if (Input.GetMouseButton(0))
        {
            if (draggingMode)
            {
                // if stick is in a slot:  remove it from that slot now
                foreach (GameObject slot in slotGameObjects)
                {
                    if (slot.GetComponent <StickSlot>().heldSticks.Contains(currentStick))
                    {
                        slot.GetComponent <StickSlot>().heldSticks.Remove(currentStick);
                        currentStick.GetComponent <Stick>().SetParentSlot(null);
                        Color originalColor = currentStick.GetComponent <Stick>().originalColor;
                        // If the stick being removed has a modified color (i.e. there is another stick under):
                        if (currentStickSprite.color != originalColor)
                        {
                            ShapeSlot stickShape = slot.transform.parent.GetComponent <ShapeSlot>();
                            stickShape.RemoveFromSidesFilled(false);
                            currentStickSprite.color        = originalColor;
                            currentStickSprite.sortingOrder = 2;
                            StickSlot currentStickSlot = slot.GetComponent <StickSlot>();
                            currentStickSlot.topStickColor = currentStickSlot.heldSticks[0].GetComponent <SpriteRenderer>().color;
                            stickShape.CheckShapeCompleteness();
                        }
                        else
                        {
                            slot.transform.parent.GetComponent <ShapeSlot>().RemoveFromSidesFilled(true);
                            slot.GetComponent <StickSlot>().topStickColor = Color.white;
                        }
                        // avoid unnecessary computations by exiting loop, since only 1 side can be removed at a time
                        // TODO change into a while loop?
                        break;
                    }
                }
                touchPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                newCenter     = touchPosition - offset;
                currentStick.transform.position = new Vector3(newCenter.x, newCenter.y, newCenter.z);
            }
        }

        if (currentStick && draggingMode && (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A)))
        {
            if (currentStick == m_EventSystem.currentSelectedGameObject)
            {
                currentStick.transform.Rotate(Vector3.forward * velocity * Time.deltaTime);
            }
        }

        if (currentStick && draggingMode && (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D)))
        {
            if (currentStick == m_EventSystem.currentSelectedGameObject)
            {
                currentStick.transform.Rotate(Vector3.back * velocity * Time.deltaTime);
            }
        }

        // When mouse is released
        if (Input.GetMouseButtonUp(0))
        {
            draggingMode = false;
            currentStick = null;
        }
    }