需求:

勾上界面上多选框筛选出符合的道具

思路:

1. 使用组合数字让一个数字包含多这个搜索条件,比如2代表搜索衣服和武器, 数字按照2的n次幂的值递增,通过|,&,^运算符实现一个数字包含多个条件的情况

运算符的介绍: http://www.cnblogs.com/plateFace/p/4192351.html.

 

2. 拼接一长串字符代表搜索条件比如”武器_衣服_裤子", 通过_分割字符串知道这次搜索 武器, 衣服,裤子三样东西.

代码采用的是第一个思路

效果图

搜索代码:

public class AuctionHouseManager
{
//其他省略... //搜索代码
public List<AuctionItem> SearchAuction(ulong condition)
{
List<AuctionItem> newItemList = new List<AuctionItem>(); if (condition == 0)
{
foreach (var item in m_autionItemList)
{
newItemList.Add(item);
}
return newItemList;
} AuctionItem auctionItem = null;
int level = 0;
bool isRowCondition = false;
bool isComparison = false; for (int i = 0; i < m_autionItemList.Count; i++)
{
auctionItem = m_autionItemList[i]; if ((condition & AuctionSearchOption.AttentionAll) > 0)
{
if (!m_autionItemList[i].IsAttention)
continue;
} #region 等级
isRowCondition = false;
isComparison = false;
level = auctionItem.Item.Cfg.requiredLevel;
if ((condition & AuctionSearchOption.LvAll) > 0)
{ if (level != 30
&& level != 60
&& level != 90
&& level != 120
&& level != 150
&& level != 180)
{
continue;
}
}
else
{
if ((condition & AuctionSearchOption.Lv30) > 0 && !isRowCondition)
{
isRowCondition = level == 30;
isComparison = true;
}
if ((condition & AuctionSearchOption.Lv60) > 0 && !isRowCondition)
{
isRowCondition = level == 60;
isComparison = true;
}
if ((condition & AuctionSearchOption.Lv90) > 0 && !isRowCondition)
{
isRowCondition = level == 90;
isComparison = true;
}
if ((condition & AuctionSearchOption.Lv120) > 0 && !isRowCondition)
{
isRowCondition = level == 120;
isComparison = true;
}
if ((condition & AuctionSearchOption.Lv150) > 0 && !isRowCondition)
{
isRowCondition = level == 150;
isComparison = true;
}
if ((condition & AuctionSearchOption.Lv180) > 0 && !isRowCondition)
{
isRowCondition = level == 180;
isComparison = true;
} if (!isRowCondition && isComparison)
continue; } #endregion #region 升星条件
//升星条件判断
isRowCondition = false;
isComparison = false;
if ((condition & AuctionSearchOption.StarLvWhite) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.StarLevel == 0;
isComparison = true;
} if ((condition & AuctionSearchOption.StarLvGreen) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.StarLevel == 1;
isComparison = true;
} if ((condition & AuctionSearchOption.StarLvBlue) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.StarLevel == 2;
isComparison = true;
} if ((condition & AuctionSearchOption.StarLvViolet) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.StarLevel == 3;
isComparison = true;
} if ((condition & AuctionSearchOption.StarLvOrange) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.StarLevel == 4;
isComparison = true;
} if ((condition & AuctionSearchOption.StarLvRed) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.StarLevel == 5;
isComparison = true;
} if (!isRowCondition && isComparison)
continue; #endregion #region 货币
//货币
isRowCondition = false;
isComparison = false;
if ((condition & AuctionSearchOption.MoneyCopper) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.SellType == SellType.Copper;
isComparison = true;
}
if ((condition & AuctionSearchOption.MoneyGold) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.SellType == SellType.Gold;
isComparison = true;
} if (!isRowCondition && isComparison)
continue;
#endregion #region 职业 //职业
isRowCondition = false;
isComparison = false;
if ((condition & AuctionSearchOption.JobWarrior) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.ClassType == RoleClass.Null || auctionItem.Item.ClassType == RoleClass.Warrior;
isComparison = true;
}
if ((condition & AuctionSearchOption.JobMaster) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.ClassType == RoleClass.Null || auctionItem.Item.ClassType == RoleClass.Mage;
isComparison = true;
}
if ((condition & AuctionSearchOption.JobPastor) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.ClassType == RoleClass.Null || auctionItem.Item.ClassType == RoleClass.Priest;
isComparison = true;
} if (!isRowCondition && isComparison)
continue; #endregion #region 技能和技能书
//装备&技能书
/*
道具功能类型:0
武器:0
衣服:1
裤子:2
鞋子:3
头盔:4
项链:5
戒指:6
拳套:7
防御宝物:8
攻击宝物:9
*/ isRowCondition = false; //是否符合条件
isComparison = false; //道具已经比较过 int classType = auctionItem.Item.Cfg.classType;
int equipType = auctionItem.Item.Cfg.v[0]; bool isClassType13 = (classType >= 1 && classType <= 3); //大类型是1-3 if ((condition & AuctionSearchOption.EquipAll) > 0)
{
//没有全部判断条件
isComparison = true;
if (isClassType13 && (equipType >= 0 && equipType <= 9))
isRowCondition = true;
}
else
{
if ((condition & AuctionSearchOption.EquipWeapon) > 0 && !isRowCondition)
{
isRowCondition = isClassType13 && equipType == 0;
isComparison = true;
}
if ((condition & AuctionSearchOption.EquipClothing) > 0 && !isRowCondition)
{
isRowCondition = isClassType13 && equipType == 1;
isComparison = true;
}
if ((condition & AuctionSearchOption.EquipPants) > 0 && !isRowCondition)
{
isRowCondition = isClassType13 && equipType == 2;
isComparison = true;
}
if ((condition & AuctionSearchOption.EquipShoes) > 0 && !isRowCondition)
{
isRowCondition = isClassType13 && equipType == 3;
isComparison = true;
}
if ((condition & AuctionSearchOption.EquipHelmet) > 0 && !isRowCondition)
{
isRowCondition = isClassType13 && equipType == 4;
isComparison = true;
}
if ((condition & AuctionSearchOption.EquipNecklace) > 0 && !isRowCondition)
{
isRowCondition = isClassType13 && equipType == 5;
isComparison = true;
}
if ((condition & AuctionSearchOption.EquipRing) > 0 && !isRowCondition)
{
isRowCondition = isClassType13 && equipType == 6;
isComparison = true;
}
if ((condition & AuctionSearchOption.EquipHandguard) > 0 && !isRowCondition)
{
isRowCondition = isClassType13 && equipType == 7;
isComparison = true;
}
if ((condition & AuctionSearchOption.EquipMagicWeapon) > 0 && !isRowCondition)
{
isRowCondition = isClassType13 && (equipType == 8 || equipType == 9);
isComparison = true;
} //if ((condition & AuctionSearchOption.EquipFashionable) > 0 && !isRowCondition)
//{
// isRowCondition = auctionItem.Item.Cfg.v[0] == 8 || auctionItem.Item.Cfg.v[0] == 9;
//} if ((condition & AuctionSearchOption.EquipSkill) > 0 && !isRowCondition)
{
isRowCondition = classType == 5;
isComparison = true;
}
} if (!isRowCondition && isComparison)
continue; #endregion #region 消耗品,技能和技能书是一起的
/*
装备道具:0
效果道具:1
材料道具:2
任务道具:3
宝石道具:4
技能书卷:5
技能宝物:6
货币道具:7
宝箱道具:8
虚拟货币:999
*/ if ((condition & AuctionSearchOption.ConsumeDrug) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.Cfg.type == 1 && auctionItem.Item.Cfg.v[0] == 0;
isComparison = true;
}
if ((condition & AuctionSearchOption.ConsumeForgeMaterial) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.Cfg.type == 2 && (auctionItem.Item.Cfg.v[0] >= 1 && auctionItem.Item.Cfg.v[0] <= 6);
isComparison = true;
}
if ((condition & AuctionSearchOption.ConsumeWayMasterial) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.Cfg.type == 2 && auctionItem.Item.Cfg.v[0] == 0;
isComparison = true;
}
if ((condition & AuctionSearchOption.ConsumeGem) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.Cfg.type == 4;
isComparison = true;
}
if ((condition & AuctionSearchOption.ConsumeReputation) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.Cfg.type == 7 && auctionItem.Item.Cfg.v[0] == 53;
isComparison = true;
}
if ((condition & AuctionSearchOption.ConsumeSkillCheats) > 0 && !isRowCondition)
{
isRowCondition = auctionItem.Item.Cfg.type == 6;
isComparison = true;
} if (!isRowCondition && isComparison)
continue;
#endregion newItemList.Add(m_autionItemList[i]);
} return newItemList;
} } public struct AuctionSearchOption
{
public const ulong None = 1;
//关注
public const ulong AttentionAll = 2;
//等级
public const ulong LvAll = 4;
public const ulong Lv30 = 8;
public const ulong Lv60 = 16;
public const ulong Lv90 = 32;
public const ulong Lv120 = 64;
public const ulong Lv150 = 128;
public const ulong Lv180 = 256;
//品质
public const ulong StarLvAll = 512;
public const ulong StarLvWhite = 1024;
public const ulong StarLvGreen = 2048;
public const ulong StarLvBlue = 4096;
public const ulong StarLvViolet = 8192;
public const ulong StarLvOrange = 16384;
public const ulong StarLvRed = 32768;
//货币
public const ulong MoneyAll = 65536;
public const ulong MoneyGold = 131072;
public const ulong MoneyCopper = 262144;
//职业
public const ulong JobAll = 524288;
public const ulong JobWarrior = 1048576;
public const ulong JobMaster = 2097152;
public const ulong JobPastor = 4194304;
//装备和技能书
public const ulong EquipAll = 8388608;
public const ulong EquipWeapon = 16777216;
public const ulong EquipClothing = 33554432;
public const ulong EquipPants = 67108864;
public const ulong EquipShoes = 134217728;
public const ulong EquipHelmet = 268435456;
public const ulong EquipNecklace = 536870912;
public const ulong EquipRing = 1073741824;
public const ulong EquipHandguard = 2147483648;
public const ulong EquipMagicWeapon = 4294967296;
public const ulong EquipFashionable = 8589934592;
public const ulong EquipSkill = 17179869184;
//消耗品
public const ulong ConsumeAll = 34359738368;
public const ulong ConsumeDrug = 68719476736;
public const ulong ConsumeForgeMaterial = 137438953472;
public const ulong ConsumeWayMasterial = 274877906944;
public const ulong ConsumeGem = 549755813888;
public const ulong ConsumeReputation = 1099511627776;
public const ulong ConsumeSkillCheats = 2199023255552;
}

 

 

界面代码:

using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
using UnityEngine.UI;
using AHM = AuctionHouseManager;
using ASO = AuctionSearchOption; public class AdvancedSearch1 : UI_Base
{ public event Action CloseUIEvent;
private List<AuctionItem> m_searchItemList; [SerializeField]
private UIButton m_BtnCancel; [SerializeField]
private UIToggle m_AttentionTo;
[SerializeField]
private UIToggle[] m_LvToggleList;
[SerializeField]
private UIToggle[] m_StarToggleList;
[SerializeField]
private UIToggle[] m_MoneyToggleList;
[SerializeField]
private UIToggle[] m_JobToggleList;
[SerializeField]
private UIToggle[] m_EquipToggleList;
[SerializeField]
private UIToggle[] m_ConsumeToggleList; private bool isInit = false; public List<AuctionItem> SearchItemList
{
get { return m_searchItemList; }
set { m_searchItemList = value; }
} public void Awake()
{
//m_ToggleList = GetComponentsInChildren<Toggle>();
m_BtnCancel.onClick.Add(new EventDelegate(Cancel)); m_AttentionTo.onChange.Clear();
m_AttentionTo.onChange.Add(new EventDelegate(delegate { AdvancedSearch_ChangeValueEvent(m_AttentionTo); })); ulong value = 0;
m_AttentionTo.Set((AHM.I.Condition & ASO.AttentionAll) > 0, false); for (int i = 0; i < m_LvToggleList.Length; i++)
{
UIToggle t = m_LvToggleList[i];
m_LvToggleList[i].onChange.Clear();
m_LvToggleList[i].onChange.Add(new EventDelegate(delegate { AdvancedSearch_ChangeValueEvent(t); })); value = Convert.ToUInt64(m_LvToggleList[i].name);
m_LvToggleList[i].Set((AHM.I.Condition & value) > 0 || ((AHM.I.Condition & ASO.LvAll) > 0 && value != ASO.LvAll), false);
} for (int i = 0; i < m_StarToggleList.Length; i++)
{
UIToggle t = m_StarToggleList[i];
m_StarToggleList[i].onChange.Clear();
m_StarToggleList[i].onChange.Add(new EventDelegate(delegate { AdvancedSearch_ChangeValueEvent(t); })); value = Convert.ToUInt64(m_StarToggleList[i].name);
m_StarToggleList[i].Set((AHM.I.Condition & value) > 0 || ((AHM.I.Condition & ASO.StarLvAll) > 0 && value != ASO.StarLvAll), false);
} for (int i = 0; i < m_MoneyToggleList.Length; i++)
{
UIToggle t = m_MoneyToggleList[i];
m_MoneyToggleList[i].onChange.Clear();
m_MoneyToggleList[i].onChange.Add(new EventDelegate(delegate { AdvancedSearch_ChangeValueEvent(t); })); value = Convert.ToUInt64(m_MoneyToggleList[i].name);
m_MoneyToggleList[i].Set((AHM.I.Condition & value) > 0 || ((AHM.I.Condition & ASO.MoneyAll) > 0 && value != ASO.MoneyAll), false);
} for (int i = 0; i < m_JobToggleList.Length; i++)
{
UIToggle t = m_JobToggleList[i];
m_JobToggleList[i].onChange.Clear();
m_JobToggleList[i].onChange.Add(new EventDelegate(delegate { AdvancedSearch_ChangeValueEvent(t); })); value = Convert.ToUInt64(m_JobToggleList[i].name);
m_JobToggleList[i].Set((AHM.I.Condition & value) > 0 || ((AHM.I.Condition & ASO.JobAll) > 0 && value != ASO.JobAll), false);
} for (int i = 0; i < m_EquipToggleList.Length; i++)
{
UIToggle t = m_EquipToggleList[i];
m_EquipToggleList[i].onChange.Clear();
m_EquipToggleList[i].onChange.Add(new EventDelegate(delegate { AdvancedSearch_ChangeValueEvent(t); })); value = Convert.ToUInt64(m_EquipToggleList[i].name);
m_EquipToggleList[i].Set((AHM.I.Condition & value) > 0 || ((AHM.I.Condition & ASO.EquipAll) > 0 && value != ASO.EquipAll), false);
} for (int i = 0; i < m_ConsumeToggleList.Length; i++)
{
UIToggle t = m_ConsumeToggleList[i];
m_ConsumeToggleList[i].onChange.Clear();
m_ConsumeToggleList[i].onChange.Add(new EventDelegate(delegate { AdvancedSearch_ChangeValueEvent(t); })); value = Convert.ToUInt64(m_ConsumeToggleList[i].name);
m_ConsumeToggleList[i].Set((AHM.I.Condition & value) > 0 || ((AHM.I.Condition & ASO.ConsumeAll) > 0 && value != ASO.ConsumeAll), false);
}
} public void LateUpdate()
{
if (!isInit)
{
//AHM.I.Condition = 0;
isInit = true;
}
} public void AdvancedSearch_ChangeValueEvent(UIToggle obj)
{
if (!isInit)
return; //Debug.Log(obj.name + " - " + obj.value);
//Debug.Log(isOn + " - " + row.TitleName + " - " + cell.Name + " - " + cell.Value);
ulong value = Convert.ToUInt64(obj.name); if (obj.value)
{
AHM.I.Condition |= value; //如果勾选的是全部,全部勾选剩下的小选项
switch (value)
{
case ASO.LvAll:
for (int i = 1; i < m_LvToggleList.Length; i++)
{
m_LvToggleList[i].value = true;
AHM.I.Condition |= Convert.ToUInt64(m_LvToggleList[i].name);
}
break;
case ASO.StarLvAll:
for (int i = 1; i < m_StarToggleList.Length; i++)
{
m_StarToggleList[i].value = true;
AHM.I.Condition |= Convert.ToUInt64(m_StarToggleList[i].name);
}
break;
case ASO.MoneyAll:
for (int i = 1; i < m_MoneyToggleList.Length; i++)
{
m_MoneyToggleList[i].value = true;
AHM.I.Condition |= Convert.ToUInt64(m_MoneyToggleList[i].name);
}
break;
case ASO.JobAll:
for (int i = 1; i < m_JobToggleList.Length; i++)
{
m_JobToggleList[i].value = true;
AHM.I.Condition |= Convert.ToUInt64(m_JobToggleList[i].name);
}
break;
case ASO.EquipAll:
for (int i = 1; i < m_EquipToggleList.Length; i++)
{
m_EquipToggleList[i].value = true;
AHM.I.Condition |= Convert.ToUInt64(m_EquipToggleList[i].name);
}
break;
case ASO.ConsumeAll:
for (int i = 1; i < m_ConsumeToggleList.Length; i++)
{
m_ConsumeToggleList[i].value = true;
AHM.I.Condition |= Convert.ToUInt64(m_ConsumeToggleList[i].name);
}
break;
}
}
else
{
AHM.I.Condition ^= value; //Debugger.Log("等级值:" + (ASO.LvAll & value));
if (value >= ASO.Lv30 && value <= ASO.Lv180)
{
m_LvToggleList[0].value = false;
if ((AHM.I.Condition & ASO.LvAll) > 0)
AHM.I.Condition ^= ASO.LvAll;
}
else if (value >= ASO.StarLvWhite && value <= ASO.StarLvRed)
{
m_StarToggleList[0].value = false;
if ((AHM.I.Condition & ASO.StarLvAll) > 0)
AHM.I.Condition ^= ASO.StarLvAll;
}
else if (value >= ASO.MoneyGold && value <= ASO.MoneyCopper)
{
m_MoneyToggleList[0].value = false;
if ((AHM.I.Condition & ASO.MoneyAll) > 0)
AHM.I.Condition ^= ASO.MoneyAll;
}
else if (value >= ASO.JobWarrior && value <= ASO.JobPastor)
{
m_JobToggleList[0].value = false;
if ((AHM.I.Condition & ASO.JobAll) > 0)
AHM.I.Condition ^= ASO.JobAll;
}
else if (value >= ASO.EquipWeapon && value <= ASO.EquipSkill)
{
m_EquipToggleList[0].value = false;
if ((AHM.I.Condition & ASO.EquipAll) > 0)
AHM.I.Condition ^= ASO.EquipAll;
}
else if (value >= ASO.ConsumeDrug && value <= ASO.ConsumeSkillCheats)
{
m_ConsumeToggleList[0].value = false;
if ((AHM.I.Condition & ASO.ConsumeAll) > 0)
AHM.I.Condition ^= ASO.ConsumeAll;
} switch (value)
{
case ASO.LvAll:
for (int i = 1; i < m_LvToggleList.Length; i++)
{
m_LvToggleList[i].value = false;
AHM.I.Condition ^= Convert.ToUInt64(m_LvToggleList[i].name);
}
break;
case ASO.StarLvAll:
for (int i = 1; i < m_StarToggleList.Length; i++)
{
m_StarToggleList[i].value = false;
AHM.I.Condition ^= Convert.ToUInt64(m_StarToggleList[i].name);
}
break;
case ASO.MoneyAll:
for (int i = 1; i < m_MoneyToggleList.Length; i++)
{
m_MoneyToggleList[i].value = false;
AHM.I.Condition ^= Convert.ToUInt64(m_MoneyToggleList[i].name);
}
break;
case ASO.JobAll:
for (int i = 1; i < m_JobToggleList.Length; i++)
{
m_JobToggleList[i].value = false;
AHM.I.Condition ^= Convert.ToUInt64(m_JobToggleList[i].name);
}
break;
case ASO.EquipAll:
for (int i = 1; i < m_EquipToggleList.Length; i++)
{
m_EquipToggleList[i].value = false;
AHM.I.Condition ^= Convert.ToUInt64(m_EquipToggleList[i].name);
}
break;
case ASO.ConsumeAll:
for (int i = 1; i < m_ConsumeToggleList.Length; i++)
{
m_ConsumeToggleList[i].value = false;
AHM.I.Condition ^= Convert.ToUInt64(m_ConsumeToggleList[i].name);
}
break;
}
}
} public void Cancel()
{
UIManager.Instance.CloseUI(eUI.AuctionSearch);
} public override void OnClose()
{
SearchItemList = AHM.I.SearchAuction(AHM.I.Condition); if (CloseUIEvent != null)
CloseUIEvent();
}
}

最新文章

  1. Outlook2016 新装进阶操作指南
  2. Spark机器学习读书笔记-CH04
  3. jboss [how to access the admin console]
  4. Linux Ubuntu12.04下安装OpenCv2.4.10
  5. java、el表达式中保留小数的方法
  6. centos下安装cdh5
  7. uC/OS 的任务调度解析 (转)
  8. CCCardinalSplineBy概念
  9. node.js(七) 子进程 child_process模块
  10. java获取数据库的列名、类型等信息
  11. 1-6 hibernate映射集合属性
  12. A*寻路算法入门(一)
  13. rabbitmq - (消息队列) 的基本原理介绍
  14. 第三篇 Html-label标签
  15. jQuery动画方法
  16. BUG总是存在的
  17. Cordova安装、设置代理和引入插件
  18. Laravel - 1
  19. DownloadProvider 源码详细分析
  20. Linux内存管理6---伙伴算法与slab

热门文章

  1. [BZOJ3027][Ceoi2004]Sweet 容斥+组合数
  2. 最近项目中用到的js
  3. 开源的图像滤镜库----for Android
  4. AMQ学习笔记 - 04. 消息选择器
  5. Linux命令之groupadd
  6. luogu P2134 百日旅行
  7. 数据结构之B-树,你每天都在用的,源码发布!
  8. SecureCRT实现跳板机自动登录
  9. 通过Roslyn动态生成程序集
  10. [bug] VS2013 Brower Link和Aspnetpager引发的问题分析