You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.0 KiB

using UnityEngine;
using FairyGUI;
public class EmitComponent : GComponent
{
GLoader _symbolLoader;
GTextField _numberText;
Transform _owner;
const float OFFSET_ADDITION = 2f;
static Vector2 JITTER_FACTOR = new Vector2(40, 80);
public EmitComponent()
{
this.touchable = false;
_symbolLoader = new GLoader();
_symbolLoader.autoSize = true;
AddChild(_symbolLoader);
_numberText = new GTextField();
_numberText.autoSize = AutoSizeType.Both;
AddChild(_numberText);
}
public void SetHurt(Transform owner, int type, long hurt, bool critical)
{
_owner = owner;
TextFormat tf = _numberText.textFormat;
if (type == 0)
tf.font = EmitManager.inst.hurtFont1;
else
tf.font = EmitManager.inst.hurtFont2;
_numberText.textFormat = tf;
_numberText.text = hurt.ToString();
if (critical)
_symbolLoader.url = EmitManager.inst.criticalSign;
else
_symbolLoader.url = "";
UpdateLayout();
this.alpha = 1;
UpdatePosition(Vector2.zero);
Vector2 rnd = Vector2.Scale(UnityEngine.Random.insideUnitCircle, JITTER_FACTOR);
int toX = 0;
int toY = -80;
EmitManager.inst.view.AddChild(this);
GTween.To(Vector2.zero, new Vector2(toX, toY), 1f).SetTarget(this)
.OnUpdate((GTweener tweener) => { this.UpdatePosition(tweener.value.vec2); }).OnComplete(this.OnCompleted);
this.TweenFade(0, 0.5f).SetDelay(0.5f);
}
void UpdateLayout()
{
float symbolWidth = this._symbolLoader.width;
if (string.IsNullOrEmpty(this._symbolLoader.url))
{
symbolWidth = 0;
}
this.SetSize(symbolWidth + _numberText.width, Mathf.Max(_symbolLoader.height, _numberText.height));
_numberText.SetXY(symbolWidth > 0 ? (symbolWidth + 2) : 0,
(this.height - _numberText.height) / 2);
_symbolLoader.y = (this.height - _symbolLoader.height) / 2;
}
void UpdatePosition(Vector2 pos)
{
if (this._owner == null)
{
return;
}
Vector3 ownerPos = _owner.position;
ownerPos.y += OFFSET_ADDITION;
Vector3 screenPos = Camera.main.WorldToScreenPoint(ownerPos);
screenPos.y = Screen.height - screenPos.y; //convert to Stage coordinates system
Vector3 pt = GRoot.inst.GlobalToLocal(screenPos);
this.SetXY(Mathf.RoundToInt(pt.x + pos.x - this.actualWidth / 2), Mathf.RoundToInt(pt.y + pos.y - this.height));
}
void OnCompleted()
{
_owner = null;
EmitManager.inst.view.RemoveChild(this);
EmitManager.inst.ReturnComponent(this);
}
public void Cancel()
{
_owner = null;
if (this.parent != null)
{
GTween.Kill(this);
EmitManager.inst.view.RemoveChild(this);
}
EmitManager.inst.ReturnComponent(this);
}
}