List和Combo这样可没算完!

Posted on 2013-03-03 21:07  neocsl  阅读(721)  评论(0编辑  收藏  举报

  List和Combo让人头疼,目前我在List中只能根据按钮的编号"i"来修改武器的列表,而不能使用名称。这对以后武器的专向跟踪和描述是十分困难的。

  ComboBox相当于一个按钮,用来显示我目前使用了哪种武器。我不仅仅是要在装备栏中显示当前玩家拥有的武器,同时还需要构造一个商店。Jesus Christ真的头疼。

  在外部有一个按钮打开商店,有一个按钮打开装备栏:

  1.目前找到了一种替换图片的简单形式,获取Example中的"Object 1"名称根据名称在List的RenderObject中指定if(Items[i].Caption=="Object 1") 然后绘制Items[i].Images[0]=Texture'....'

  上述方法非常不直接,不能动态的添加制定的武器。我得重新深度挖掘。

  2.我要实现《无尽之剑》的武器装备列表

  添加Cancel以外的按钮,例如Medicine列表和Golden列表。

  3.实现list的列表的逻辑信息处理,让其读取PlayerController中的Golden引用。

  可以从正向或是逆向入手研究他们的逻辑过程,Example,List和Combo.  

if(Sender.Tag == "Combo1")
   {
      UDNMobileMenuLabel(FindMenuObject("Title")).Caption = UDNMobileMenuComboBox(FindMenuObject("Combo1")).GetValue();
   }

  FindMenuObject函数就是找Sender.Tag的内容,在Defaultproperties中定义好的,这里定义Title这个UDNMobileMenuLabel类型按钮的值为从Combo1中获取。

  我们倒序来反推这些类的逻辑过程。进入ComboBox中,看他的GetValue函数是怎么读取List中被点选的值,另外Init中起始也给了个值。

  因为Combo外部也会根据选中的List内容来渲染Title的内容,Lable.Caption=Title;或是Label.Caption=GetValue();

  他的GetValue就是

function string GetValue()
{
    return list.GetValue();
}

  现在我们查看GetValue到底在哪里被调用。

  在实现OnPick代理的时候查看list是否bIsOpen,如果打开就传给List.OnPick()让他自己去做处理。否则就让Label做处理(就是外边的Combo打开按钮)。

  返回List.OnPick()是一件很麻烦的事,因为在List中处理了很多超麻烦内容。我们先看看Combo和list有哪些接口。

  InitMenuObject中:

List.OnChange = OnSelect;
   List.OnCancel = OnCancel;

  List中有一个自带的OnCancel按钮,这里通过Combo的OnCancel来做处理,其实就是ToggleList。

  List中有一个OnChange函数,这里通过OnSelect来做处理。

  我想已经把所有能列出的问题全部摆上了桌面,但是还无法搞清OnSelect到底是什么鬼东西,它里面引用了一个OnChange函数,好像所有问题的中心就在这个OnChange函数处理。

 delegate OnChange();

  OnTouch()

  {

    OnChange();
  }

  咱们进入List中再瞧瞧:

  List中的GetValue返回Items[SelectedIndex].Caption;  现在的任务落到了怎么读取SelectedIndex。对于List他的每一项都是Button,如果是读取Touch任务那么就让每一个Button的OnPick来执行。

  看看Combo中InitMenuObject的List.OnSelect,在List的实现过程,

  遍历所有的Items,Button数组,如果Label是Sender,那么SelectedIndex=i;然后将其高亮显示,OnChange(i,Label.Caption,X,Y);这里发现OnChange是重点。

  在AddItem的地方,NewItem.OnClick=OnSelect;

  我发现OnChange下面的OwnerScene.OnTouch很有意思,进入AntMobileMenuScene中瞧瞧是怎么回事。Scene中有一个List实例

if(List!=none&&!List.bIsHidden)

  {

    ITouchable(List).OnPIck(EventType,TouchX,TouchY);
  }

  就是把列表信息传递给List。

  最终我始终都没有搞清楚,OnSelect中的OnChange到底是怎么回事?在ComboBox中也有一个OnChange,list中也有一个,ComboBox中的OnSelect是List的OnChange实现,但是内部还调用了OnChange。这个OnChange是谁的呢?他们都不是一种实现。

  做了一个实验,当List中的OnSelect下作废OnChange,选单将不会被关闭。

  而ComboBox中的OnSelect下OnChange作废并不会产生任何影响,包括功能都是正确的。