滑動swipe的妙用


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代理也能成功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM