实现,长按界面增加经验效果:单击:消耗一个经验丹 长按:消耗很多经验丹 长按但是没有超过一秒的:消耗5个经验丹 拖动:不消耗丹
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class XUIWeaponRecord : XMono
{
public int mWeaponId;
public int mLevel;
public int mExp;
public int mUseExpItemCount;
public UIProgressBar mProgressBar;
public int mNextLeveExp;
public UILabel mLabUseCount;
public UILabel mLabLevel;
public override void Awake()
{
base.Awake();
}
}
public class XUIWeaponAddExp : Xui
{
int mItemId;
int mUnitExp;
UIGrid mWeaponGrid;
XUIGridHelper mGridHelper;
GameObject mWeaponList;
GameObject mScrollView;
bool mIsUp;
bool mIsDrag;
int mDownTime;
System.DateTime mPressTime;
public static int mTmpBoxW_h = 0;
enum AddExpCase
{
eClick = 1, // 单机
eLongTouch, // 长按长于1秒
eLess1Second // 长按小于1秒
}
public override void Awake()
{
base.Awake();
}
public override void OnInit()
{
XGetChild<GameObject>("Top/Close").GetComponent<XUIEventListener>().onClick += OnCloseWindow;
XGetChild<GameObject>("Bk").GetComponent<XUIEventListener>().onClick += OnCloseWindow;
mWeaponGrid = XGetChild<UIGrid>("WeaponList/ScrollView/Grid");
}
public override void OnOpen(params object[] args)
{
mItemId = (int)args[0];
mUnitExp = XItemManager.Inst.GetItem(mItemId).mItemTemplate.GetConsume().mExp;
UpdatePage();
}
public void UpdatePage()
{
if (mGridHelper != null)
mGridHelper.ClearAllPage();
GameObject Template = XGetChild<GameObject>("Template");
Template.AddComponent<XUIWeaponRecord>();
mTmpBoxW_h = (int)Template.GetComponent<BoxCollider>().size.x / 2;
AddItem(Template);
}
void AddItem(GameObject template)
{
List<XWeapon> list = XPlayerData.Inst.GetPlayerWeaponList();
if (list.Count == 0)
return;
list.Sort(
(XWeapon a, XWeapon b) =>
{
//XTools.Log("比较id:a b = {0},{1}", a.WeaponId, b.WeaponId);
if (a.WeaponLevel < b.WeaponLevel)
{
//XTools.Log("kao1");
return 1;
}
else if (a.WeaponLevel == b.WeaponLevel)
{
int type1 = XWeaponSetting.Inst.GetWeaponType(a.WeaponId, true);
int type2 = XWeaponSetting.Inst.GetWeaponType(b.WeaponId, true);
//XTools.Log("比较type:type1 type2 = {0},{1}", type1, type2);
if (type1 < type2)
{
//XTools.Log("kao2");
return 1;
}
else if (type1 == type2)
{
if (a.WeaponId > b.WeaponId)
{
//XTools.Log("kao3");
return 1;
}
else if (a.WeaponId == b.WeaponId)
{
//XTools.Log("kao3.5");
return 1;
}
else { //XTools.Log("kao4");
return -1; }
}
else
{
//XTools.Log("kao5");
return -1;
}
}
else
{
//XTools.Log("kao6");
return -1;
}
}
);
if (mGridHelper == null)
mGridHelper = new XUIGridHelper();
mGridHelper.Init(mWeaponGrid, template, null, null, new Vector2(-(259 - mTmpBoxW_h), 225), list.Count, 1, Vector2.zero);
mGridHelper.AddElement(list.Count);
for (int i = 0; i < list.Count; ++i)
{
GameObject go = mGridHelper.GetElement(i);
go.name = go.name.Substring(0, 4) + list[i].WeaponId;
UILabel labLevel = go.transform.Find("Right/Level/labLevel").GetComponent<UILabel>();
go.transform.Find("Right/Name").GetComponent<UILabel>().text = "我是武器:" + list[i].WeaponId.ToString() +",type:"+XWeaponSetting.Inst.GetWeaponType(list[i].WeaponId);
labLevel.text = list[i].WeaponLevel.ToString();
UILabel labUseCount = go.transform.Find("Right/UseCount").GetComponent<UILabel>();
XUIWeaponRecord uiItem = go.GetComponent<XUIWeaponRecord>();
uiItem.mWeaponId = list[i].WeaponId;
uiItem.mLevel = list[i].WeaponLevel;
uiItem.mExp = list[i].Exp;
uiItem.mUseExpItemCount = 0;
uiItem.mLabLevel = labLevel;
uiItem.mLabUseCount = labUseCount;
uiItem.mProgressBar = go.transform.Find("Right/ProgressBar").GetComponent<UIProgressBar>();
int rule = XWeaponSetting.Inst.GetWeaponInfo(uiItem.mWeaponId).WeaponLevelRule;
int max = XPlayerWeaponSetting.Inst.GetWeaponMaxLevel(rule);
if(max == uiItem.mLevel)
{
uiItem.mNextLeveExp = uiItem.mExp;
// 显示满级提示+蒙灰效果
go.transform.Find("FullExp").gameObject.SetActive(true);
}
else
{
uiItem.mNextLeveExp = XPlayerWeaponSetting.Inst.GetWeaponLevelExp(rule, uiItem.mLevel + 1);
go.GetComponent<XUIEventListener>().onPress += ItemOnPress;
go.GetComponent<XUIEventListener>().onDragStart += OnDragStart;
}
SetProgressBar(uiItem.mExp, uiItem.mNextLeveExp, uiItem.mProgressBar);
}
}
void OnDragStart(GameObject go)
{
mIsDrag = true;
XUIManager.Inst.CloseUI<XUIMessage>();
}
void ItemOnPress(GameObject go, bool flg)
{
XUIWeaponRecord uiItem = go.GetComponent<XUIWeaponRecord>();
if (flg)
{
mIsDrag = false;
mPressTime = System.DateTime.Now;
mIsUp = false;
mDownTime = 0;
if (!XItemManager.Inst.HasItem(mItemId))
{
XUIMessage.QuickMsg("装备材料已加完");
return;
}
XTimerHelper.Inst.RegisterTimer
(
1f,
(object[] param) =>
{
if (!mIsUp && (long)param[0] == mPressTime.Ticks)
{
if (XItemManager.Inst.HasItem(mItemId))
{
++mDownTime;
XTools.Log(" 次数加1 = {0}", mDownTime);
ProcessAddExpCase((int)AddExpCase.eLongTouch, uiItem, go, mDownTime);
}
else
{
XUIMessage.QuickMsg("装备材料已加完");
}
}
},
() => { return mIsUp; },
mPressTime.Ticks
);
}
else
{
//XTools.Log("抬起");
mIsUp = true;
if (mIsDrag)
return;
if (!XItemManager.Inst.HasItem(mItemId))
return;
if (mDownTime > 0)
return;
if ((System.DateTime.Now - mPressTime).Milliseconds > 280) // 280毫秒为分界线: 之前是单击处理,之后是长按处理
ProcessAddExpCase((int)AddExpCase.eLess1Second, uiItem, go);
else
ProcessAddExpCase((int)AddExpCase.eClick, uiItem, go);
}
}
void ProcessAddExpCase(int nCase, XUIWeaponRecord uiItem, GameObject go, int nTimes=0)
{
switch (nCase)
{
case (int)AddExpCase.eClick:
//XTools.Log("OnClick: add weapon {0} exp {1}-{2} once. -- {3}", uiItem.mWeaponId, mItemId, mUnitExp, mDownTime);
//XTools.Log("消耗1个经验道具");
DoAddExpOnlyClient(uiItem, 1, go);
break;
case (int)AddExpCase.eLongTouch:
//XTools.Log("OnPress-LongTouch: add weapon {0} exp {1}-{2} once. -- {3}", uiItem.mWeaponId, mItemId, mUnitExp, mDownTime);
switch (nTimes)
{
case 1:
case 2:
case 3:
//XTools.Log("消耗10个经验道具");
DoAddExpOnlyClient(uiItem, 10, go);
break;
case 4:
case 5:
//XTools.Log("消耗20个经验道具");
DoAddExpOnlyClient(uiItem, 20, go);
break;
default:
//XTools.Log("消耗25个经验道具");
DoAddExpOnlyClient(uiItem, 25, go);
break;
}
break;
case (int)AddExpCase.eLess1Second:
//XTools.Log("OnPress-Less1Second: add weapon {0} exp {1}-{2} once. -- {3}", uiItem.mWeaponId, mItemId, mUnitExp, mDownTime);
//XTools.Log("消耗5个经验道具");
DoAddExpOnlyClient(uiItem, 5, go);
break;
}
}
void DoAddExpOnlyClient(XUIWeaponRecord uiItem, int nCount, GameObject go)
{
XTools.Log("weaponId:{0} - count:{1}", uiItem.mWeaponId, nCount);
// 检测武器等级是否大于玩家等级
XItem item = XItemManager.Inst.GetItem(mItemId);
int nRealUseCount = nCount;
if (nCount > item.GetCount())
{
nRealUseCount = item.GetCount();
}
// 【这个nNewLeve会不会大于玩家 - 这个判断先不做】
int rule = XWeaponSetting.Inst.GetWeaponInfo(uiItem.mWeaponId).WeaponLevelRule;
int nNewExp = uiItem.mExp + nRealUseCount * mUnitExp;
int nNewLeve = XPlayerWeaponSetting.Inst.GetLevelByTotalExp(rule, nNewExp);
int nNextLevelExp = 0;
int max = XPlayerWeaponSetting.Inst.GetWeaponMaxLevel(rule);
if(nNewLeve == max)
{
int maxExp = XPlayerWeaponSetting.Inst.GetWeaponLevelExp(rule, max);
int needItemCount = (maxExp - uiItem.mExp) / mUnitExp + 1;
nRealUseCount = needItemCount;
nNewExp = maxExp;
nNextLevelExp = maxExp;
XTools.Log("NeedItemCount = {0}", needItemCount);
}
else
{
nNextLevelExp = XPlayerWeaponSetting.Inst.GetWeaponLevelExp(rule, nNewLeve+1);
}
// 扣道具数量 -- 吧扣取道具数量记录下来(一个变量)
XItemManager.Inst.RemoveItem(mItemId, nRealUseCount);
// 加经验,加level
XPlayerData.Inst.SetWeaponLevelAndExp(uiItem.mWeaponId, nNewLeve, nNewExp);
uiItem.mUseExpItemCount += nRealUseCount;
uiItem.mNextLeveExp = nNextLevelExp;
uiItem.mExp = nNewExp;
uiItem.mLevel = nNewLeve;
SetProgressBar(uiItem.mExp, uiItem.mNextLeveExp, uiItem.mProgressBar);// 更新ui体现相应效果--经验值(进度条-获取下一级的经验),等级值
uiItem.mLabLevel.text = nNewLeve.ToString();
uiItem.mLabUseCount.gameObject.SetActive(true);
uiItem.mLabUseCount.text = "X" + uiItem.mUseExpItemCount.ToString();// 记录扣除的道具数量 X5 并且 显示出来
// 判断是否满级:则弹出蒙灰框出来,所有操作无响应。
if(nNewLeve == max)
{
go.GetComponent<XUIEventListener>().onPress -= ItemOnPress;
go.GetComponent<XUIEventListener>().onDragStart -= OnDragStart;
// 显示满级提示+蒙灰效果
go.transform.Find("FullExp").gameObject.SetActive(true);
mIsUp = true;
}
}
void OnCloseWindow(GameObject go)
{
this.Close();
}
public void SetProgressBar(int curNum, int totalNum, UIProgressBar ProgressBar)
{
float value = (float)curNum / (float)totalNum;
value = (value > 1) ? 1 : value;
ProgressBar.value = value;
}
}