Пример #1
0
 public void AddSmartTouchTarget(FSmartTouchableInterface touchable)
 {
     if (!_capturedTouchables.Contains(touchable))
     {
         _capturedTouchables.Add(touchable);
         _needsPrioritySort = true;
     }
 }
Пример #2
0
 public FNodeEnablerForSmartTouch(FNode node)
 {
     smartTouchable = node as FSmartTouchableInterface;
     if (smartTouchable == null)
     {
         throw new FutileException("Trying to enable single touch on a node that doesn't implement FSmartTouchableInterface");
     }
 }
Пример #3
0
 public void RemoveSmartTouchTarget(FSmartTouchableInterface touchable)
 {
     _capturedTouchables.Remove(touchable);
 }
Пример #4
0
    public void Update()
    {
        if (!isEnabled)
        {
            return;
        }

        if (_needsPrioritySort)
        {
            UpdatePrioritySorting();
        }

        //create non-changeable temporary copies of the lists
        //this is so that there won't be problems if touchables are removed/added while being iterated through
        FMultiTouchableInterface[]    tempMultiTouchables    = _multiTouchables.ToArray();
        FCapturedTouchableInterface[] tempCapturedTouchables = _capturedTouchables.ToArray();

        float touchScale = 1.0f / Futile.displayScale;

        //the offsets account for the camera's 0,0 point (eg, center, bottom left, etc.)
        float offsetX = -Futile.screen.originX * Futile.screen.pixelWidth;
        float offsetY = -Futile.screen.originY * Futile.screen.pixelHeight;

        //Debug.Log ("Touch offset " + offsetX + " , " + offsetY);

        bool   wasMouseTouch = false;
        FTouch mouseTouch    = new FTouch();

        if (shouldMouseEmulateTouch)
        {
            mouseTouch.position = new Vector2((Input.mousePosition.x + offsetX) * touchScale, (Input.mousePosition.y + offsetY) * touchScale);

            mouseTouch.fingerId  = 0;
            mouseTouch.tapCount  = 1;
            mouseTouch.deltaTime = Time.deltaTime;

            if (Input.GetMouseButtonDown(0))
            {
                mouseTouch.deltaPosition = new Vector2(0, 0);
                _previousMousePosition   = mouseTouch.position;

                mouseTouch.phase = TouchPhase.Began;
                wasMouseTouch    = true;
            }
            else if (Input.GetMouseButtonUp(0))
            {
                mouseTouch.deltaPosition = new Vector2(mouseTouch.position.x - _previousMousePosition.x, mouseTouch.position.y - _previousMousePosition.y);
                _previousMousePosition   = mouseTouch.position;
                mouseTouch.phase         = TouchPhase.Ended;
                wasMouseTouch            = true;
            }
            else if (Input.GetMouseButton(0))
            {
                mouseTouch.deltaPosition = new Vector2(mouseTouch.position.x - _previousMousePosition.x, mouseTouch.position.y - _previousMousePosition.y);
                _previousMousePosition   = mouseTouch.position;

                mouseTouch.phase = TouchPhase.Moved;
                wasMouseTouch    = true;
            }
        }

        int touchCount = Input.touchCount;
        int offset     = 0;

        if (wasMouseTouch)
        {
            touchCount++;
        }

        FTouch[] touches = new FTouch[touchCount];

        if (wasMouseTouch)
        {
            touches[0] = mouseTouch;
            offset     = 1;
        }

        for (int i = 0; i < Input.touchCount; ++i)
        {
            Touch  sourceTouch = Input.GetTouch(i);
            FTouch resultTouch = new FTouch();

            resultTouch.deltaPosition = new Vector2(sourceTouch.deltaPosition.x * touchScale, sourceTouch.deltaPosition.y * touchScale);
            resultTouch.deltaTime     = sourceTouch.deltaTime;
            resultTouch.fingerId      = sourceTouch.fingerId + offset;
            resultTouch.phase         = sourceTouch.phase;
            resultTouch.position      = new Vector2((sourceTouch.position.x + offsetX) * touchScale, (sourceTouch.position.y + offsetY) * touchScale);
            resultTouch.tapCount      = sourceTouch.tapCount;

            touches[i + offset] = resultTouch;
        }

        int capturedTouchableCount = tempCapturedTouchables.Length;

        //reset the touch slotIndexes so that each slot can pick the touch it needs
        for (int t = 0; t < touchCount; t++)
        {
            FTouch touch = touches[t];
            touch.slot = null;
        }

        //match up slots that are currently active with the touches
        for (int s = 0; s < SLOT_COUNT; s++)
        {
            FTouchSlot slot = _touchSlots[s];

            if (slot.doesHaveTouch)
            {
                bool didFindMatchingTouch = false;

                for (int t = 0; t < touchCount; t++)
                {
                    FTouch touch = touches[t];
                    if (slot.touch.fingerId == touch.fingerId)
                    {
                        didFindMatchingTouch = true;
                        slot.touch           = touch;
                        touch.slot           = slot;
                        break;
                    }
                }

                if (!didFindMatchingTouch)
                {
                    slot.doesHaveTouch = false;
                    slot.touchable     = null;
                }
            }
        }

        //fill any blank slots with the unclaimed touches
        for (int s = 0; s < SLOT_COUNT; s++)
        {
            FTouchSlot slot = _touchSlots[s];

            if (!slot.doesHaveTouch)
            {
                for (int t = 0; t < touchCount; t++)
                {
                    FTouch touch = touches[t];
                    if (touch.slot == null)
                    {
                        slot.touch         = touch;
                        slot.doesHaveTouch = true;
                        touch.slot         = slot;
                        break;
                    }
                }
            }

            if (slot.doesHaveTouch)            //send the touch out to the slots that need it
            {
                if (slot.touch.phase == TouchPhase.Began)
                {
                    for (int c = 0; c < capturedTouchableCount; c++)
                    {
                        FCapturedTouchableInterface capturedTouchable = tempCapturedTouchables[c];

                        FSingleTouchableInterface singleTouchable = capturedTouchable as FSingleTouchableInterface;

                        //the first touchable to return true becomes the active one
                        if (slot.index == 0 && singleTouchable != null && singleTouchable.HandleSingleTouchBegan(slot.touch))
                        {
                            slot.isSingleTouchable = true;
                            slot.touchable         = capturedTouchable;
                            break;
                        }
                        else
                        {
                            FSmartTouchableInterface smartTouchable = capturedTouchable as FSmartTouchableInterface;
                            if (smartTouchable != null && smartTouchable.HandleSmartTouchBegan(slot.index, slot.touch))
                            {
                                slot.isSingleTouchable = false;
                                slot.touchable         = capturedTouchable;
                                break;
                            }
                        }
                    }
                }
                else if (slot.touch.phase == TouchPhase.Moved)
                {
                    if (slot.touchable != null)
                    {
                        if (slot.isSingleTouchable)
                        {
                            (slot.touchable as FSingleTouchableInterface).HandleSingleTouchMoved(slot.touch);
                        }
                        else
                        {
                            (slot.touchable as FSmartTouchableInterface).HandleSmartTouchMoved(slot.index, slot.touch);
                        }
                    }
                }
                else if (slot.touch.phase == TouchPhase.Ended)
                {
                    if (slot.touchable != null)
                    {
                        if (slot.isSingleTouchable)
                        {
                            (slot.touchable as FSingleTouchableInterface).HandleSingleTouchEnded(slot.touch);
                        }
                        else
                        {
                            (slot.touchable as FSmartTouchableInterface).HandleSmartTouchEnded(slot.index, slot.touch);
                        }
                    }

                    slot.touchable     = null;
                    slot.doesHaveTouch = false;
                }
                else if (slot.touch.phase == TouchPhase.Canceled)
                {
                    if (slot.touchable != null)
                    {
                        if (slot.isSingleTouchable)
                        {
                            (slot.touchable as FSingleTouchableInterface).HandleSingleTouchCanceled(slot.touch);
                        }
                        else
                        {
                            (slot.touchable as FSmartTouchableInterface).HandleSmartTouchCanceled(slot.index, slot.touch);
                        }
                    }

                    slot.touchable     = null;
                    slot.doesHaveTouch = false;
                }
            }
            else             //clear the slot here
            {
                slot.touchable     = null;
                slot.doesHaveTouch = false;
            }
        }

        if (touchCount > 0)
        {
            int multiTouchableCount = tempMultiTouchables.Length;
            for (int m = 0; m < multiTouchableCount; m++)
            {
                tempMultiTouchables[m].HandleMultiTouch(touches);
            }
        }
    }
Пример #5
0
	public FNodeEnablerForSmartTouch(FNode node)
	{
		smartTouchable = node as FSmartTouchableInterface;
		if(smartTouchable == null)
		{
			throw new FutileException("Trying to enable single touch on a node that doesn't implement FSmartTouchableInterface");	
		}
	}
Пример #6
0
	public void RemoveSmartTouchTarget(FSmartTouchableInterface touchable)
	{
		_capturedTouchables.Remove(touchable);
	}
Пример #7
0
	public void AddSmartTouchTarget(FSmartTouchableInterface touchable)
	{
		if(!_capturedTouchables.Contains(touchable))
		{
			_capturedTouchables.Add(touchable);
			_needsPrioritySort = true;
		}
	}