iterface ITouchable; function OnPick(ETouchType type,float x,float y);
1.定義一個接口。這個接口由MenuObject來實現,也就是所有的按鈕Object。
class AntMenuObject extends MobileMenuObject implements(ITouchable); function OnPick(ETouchType type,float x,float y) { if(bIsActive) { if(CheckBound(x,y)) { bIsHightLighted=true; bIsTouched=true; } else if(Type==Touch_Ended||Type==Touch_Cancelled) { bIsHightLighted=false; bIsTouched=false; } } else { bIsHightLighted=true; bIsTouched=true; } } function bool CheckBound(x,y) { if(x>=left&&x<=Left+width&&YTop&&Y>=Top&&Y<=Top+Height) { return true; } return false }
CheckSwipe是一個功能性非常強的函數,該函數可以檢測屏幕是划過還是點擊。只能在MenuScene中進行檢查,因為只有整個屏幕才能檢測是否划過。
function bool OnSceneTouch(ETouchType EventType, float TouchX, float TouchY,bool bInside) { if(EventType==Touch_Began) { bSwipe=false; StartTouchLocation.x=TouchX; StartTouchLocation.y=TouchY; } else if(EventType==Touch_Moved) { CurrentTouchLocation.x=TouchX; CurrentTouchLocation.y=TouchY; CheckSwipe(); } }
檢測Swipe就是檢測兩者之間的距離
function bool CheckSwipe() { return bSwipe=VSize(StartTouchLocation-CurrentTouchLocation)>SwipeTolerance; }
2.最重要的地方是List的列表處理,秉承着列表優先原則,但是如果處理不了列表就可以讓實現接口的ITouchable,OnPick
if(List.bIsHidden||List==none) { foreach MenuObjects(Touchable) { if(ITouchable(Toucable)!=none) { ITouchable(Touchable).OnPick(EventType,TouchX,TouchY); } } }
否則就處理列表
if(!List.bIsHidden&&List!=none) { ITouchable(List).OnPick(EventType,TouchX,TouchY); }
我們先進入List看看他的OnPick函數是怎么針對Swipe和Touch做處理的。That's very important。
OnPick處理滑動動作,並且感應器范圍檢測是否為bSwipe,如果是就滾動頁面,不是就讓foreach Items(Label) {Label.OnPick(EventType,X,Y);}
3.現在根據這個代理我們被引入到Button中,Lable是在List中對所有添加的AntMobileMenuButton的遍歷引用按鈕。
AntMobileMenuButton中對OnPick做了代理
delegate OnClick(ETouchType EventType,float X,float Y); function OnPick(ETouchType EventType,float x,float y) { //CheckBounds(x,y)Objects內定義的有沒有在邊界內 if(EventType==Touch_End&&CheckBounds(X,Y)) { //在List的AddItem中可以看到,將NewItem.OnClick=OnSelect;了 //於是我們趕快進入OnSelect中一探究竟,這可是對按鈕做對應動作處理的地方 //我很好奇點下按鈕我到底在哪里添加功能 OnClick(self,x,y); } }
注意OnClick的第一個參數接受的是自己,button類別,也就是Sender消息。
4.我們進入List的OnSelect中分析
function OnSelect(AntMobileMenuObject sender,float x,float y) { local AntMobileMenuButton label; local int i; //起先設置i為第一個,以后我需不需要這個還說不定 i=0; //若果有接收信號輸出,我們就遍歷看是哪個按鈕接收的 if(AntMobileMenuButton(Sender)!=none) { foreach Items(label) { //匹配對應的按鈕,然后執行動作 if(label==AntMobileMenuButton(Sender) { //在這里添加對應的執行內容,例如武器的引用 //最后用按鈕來對應具體的動作,例如玩家的武器列表 //通知列表選擇的哪個 SelectedIndex=i; Sender.bIsHighLighted=true; //同時我們發現了一個新代理 OnChange(i,Label.Caption,X,Y); //后邊我們看看這個代理被分配到了哪里 break; } i++; } } ScrollAmount=0; ScrollInertia=0; }
代理的聲明,看看在ComboBox中哪里將會將List.OnChange=?
delegate OnChange(int Idx,string item,float x,float y);
5.進入ComboBox
在初始化的時候將List的OnChange分配給了OnSelect,然后執行選中的動作,也就是關閉List,但是問題來了,即使沒有分配OnChange代理也能成功。