You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			178 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			178 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C#
		
	
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| using FairyGUI.Utils;
 | |
| 
 | |
| namespace FairyGUI
 | |
| {
 | |
|     class GearXYValue
 | |
|     {
 | |
|         public float x;
 | |
|         public float y;
 | |
|         public float px;
 | |
|         public float py;
 | |
| 
 | |
|         public GearXYValue(float x = 0, float y = 0, float px = 0, float py = 0)
 | |
|         {
 | |
|             this.x = x;
 | |
|             this.y = y;
 | |
|             this.px = px;
 | |
|             this.py = py;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Gear is a connection between object and controller.
 | |
|     /// </summary>
 | |
|     public class GearXY : GearBase, ITweenListener
 | |
|     {
 | |
|         public bool positionsInPercent;
 | |
| 
 | |
|         Dictionary<string, GearXYValue> _storage;
 | |
|         GearXYValue _default;
 | |
| 
 | |
|         public GearXY(GObject owner)
 | |
|             : base(owner)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         protected override void Init()
 | |
|         {
 | |
|             _default = new GearXYValue(_owner.x, _owner.y, _owner.x / _owner.parent.width, _owner.y / _owner.parent.height);
 | |
|             _storage = new Dictionary<string, GearXYValue>();
 | |
|         }
 | |
| 
 | |
|         override protected void AddStatus(string pageId, ByteBuffer buffer)
 | |
|         {
 | |
|             GearXYValue gv;
 | |
|             if (pageId == null)
 | |
|                 gv = _default;
 | |
|             else
 | |
|             {
 | |
|                 gv = new GearXYValue();
 | |
|                 _storage[pageId] = gv;
 | |
|             }
 | |
| 
 | |
|             gv.x = buffer.ReadInt();
 | |
|             gv.y = buffer.ReadInt();
 | |
|         }
 | |
| 
 | |
|         public void AddExtStatus(string pageId, ByteBuffer buffer)
 | |
|         {
 | |
|             GearXYValue gv;
 | |
|             if (pageId == null)
 | |
|                 gv = _default;
 | |
|             else
 | |
|                 gv = _storage[pageId];
 | |
|             gv.px = buffer.ReadFloat();
 | |
|             gv.py = buffer.ReadFloat();
 | |
|         }
 | |
| 
 | |
|         override public void Apply()
 | |
|         {
 | |
|             GearXYValue gv;
 | |
|             if (!_storage.TryGetValue(_controller.selectedPageId, out gv))
 | |
|                 gv = _default;
 | |
| 
 | |
|             Vector2 endPos = new Vector2();
 | |
| 
 | |
|             if (positionsInPercent && _owner.parent != null)
 | |
|             {
 | |
|                 endPos.x = gv.px * _owner.parent.width;
 | |
|                 endPos.y = gv.py * _owner.parent.height;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 endPos.x = gv.x;
 | |
|                 endPos.y = gv.y;
 | |
|             }
 | |
| 
 | |
|             if (_tweenConfig != null && _tweenConfig.tween && UIPackage._constructing == 0 && !disableAllTweenEffect)
 | |
|             {
 | |
|                 if (_tweenConfig._tweener != null)
 | |
|                 {
 | |
|                     if (_tweenConfig._tweener.endValue.x != endPos.x || _tweenConfig._tweener.endValue.y != endPos.y)
 | |
|                     {
 | |
|                         _tweenConfig._tweener.Kill(true);
 | |
|                         _tweenConfig._tweener = null;
 | |
|                     }
 | |
|                     else
 | |
|                         return;
 | |
|                 }
 | |
|                 Vector2 origin = _owner.xy;
 | |
| 
 | |
|                 if (endPos != origin)
 | |
|                 {
 | |
|                     if (_owner.CheckGearController(0, _controller))
 | |
|                         _tweenConfig._displayLockToken = _owner.AddDisplayLock();
 | |
| 
 | |
|                     _tweenConfig._tweener = GTween.To(origin, endPos, _tweenConfig.duration)
 | |
|                         .SetDelay(_tweenConfig.delay)
 | |
|                         .SetEase(_tweenConfig.easeType)
 | |
|                         .SetTarget(this)
 | |
|                         .SetListener(this);
 | |
|                 }
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 _owner._gearLocked = true;
 | |
|                 _owner.SetXY(endPos.x, endPos.y);
 | |
|                 _owner._gearLocked = false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void OnTweenStart(GTweener tweener)
 | |
|         {//nothing
 | |
|         }
 | |
| 
 | |
|         public void OnTweenUpdate(GTweener tweener)
 | |
|         {
 | |
|             _owner._gearLocked = true;
 | |
|             _owner.SetXY(tweener.value.x, tweener.value.y);
 | |
|             _owner._gearLocked = false;
 | |
| 
 | |
|             _owner.InvalidateBatchingState();
 | |
|         }
 | |
| 
 | |
|         public void OnTweenComplete(GTweener tweener)
 | |
|         {
 | |
|             _tweenConfig._tweener = null;
 | |
|             if (_tweenConfig._displayLockToken != 0)
 | |
|             {
 | |
|                 _owner.ReleaseDisplayLock(_tweenConfig._displayLockToken);
 | |
|                 _tweenConfig._displayLockToken = 0;
 | |
|             }
 | |
|             _owner.DispatchEvent("onGearStop", this);
 | |
|         }
 | |
| 
 | |
|         override public void UpdateState()
 | |
|         {
 | |
|             GearXYValue gv;
 | |
|             if (!_storage.TryGetValue(_controller.selectedPageId, out gv))
 | |
|                 _storage[_controller.selectedPageId] = gv = new GearXYValue();
 | |
| 
 | |
|             gv.x = _owner.x;
 | |
|             gv.y = _owner.y;
 | |
| 
 | |
|             gv.px = _owner.x / _owner.parent.width;
 | |
|             gv.py = _owner.y / _owner.parent.height;
 | |
| 
 | |
|         }
 | |
| 
 | |
|         override public void UpdateFromRelations(float dx, float dy)
 | |
|         {
 | |
|             if (_controller != null && _storage != null && !positionsInPercent)
 | |
|             {
 | |
|                 foreach (GearXYValue gv in _storage.Values)
 | |
|                 {
 | |
|                     gv.x += dx;
 | |
|                     gv.y += dy;
 | |
|                 }
 | |
|                 _default.x += dx;
 | |
|                 _default.y += dy;
 | |
| 
 | |
|                 UpdateState();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |