Chicken中有两个接口,一个是Interface_Dragger一个是Interface_DraggableItem。前者在Controller中实现。后者在pawn中实现,是所有能被拉动的东西,两种鸡和狐狸。
Interface Interface_Dragger; function DropGrabbedActor(optional int DraggedIndex); defaultproperties { }
函数声明是放下捡起的东西。
下面看一看Interface_DraggableItem.看看他们的函数声明:
//被拖拽 function NotifyGrabbed(Controller Grabber); //被释放 function NotifyReleased(Controller Grabber); //被挪 function NotifyCarried(Controller Grabber); //被放进体积 function NotifyPlacedInPen(PenVolume enteredPen); //从体积中剔除 function NotifyRemovedFromPen(PenVolume enteredPen); //在SpawnManager和每个pawn或是Controller得声明被处理的函数 function HandleCapture(ChickenSpawnManager SpawnManager,bool bPlayCaptureSound,bool bPlayCaptureFX,optional int BonusMult=1); //没有被抓住是怎么一种情况呢? function HandleFailedCapture(ChickenSpawnManager SpawnManager); //处理被狐狸带走 function HandleStolen(Controller Grabber); //更新被拖拽 function UpdateDragLocation(vector NewDrageLocation,Actor HitActor,optional bool bSetLocation,optional rotator newRotation); function Interface_DraggableItem AllowDragging(Controller attemptedGrabber); function bool IsChainable(Actor Chainer); function float GetDraggableRadius(); defaultproperties { }
我们看一看在哪些类中都对该接口进行了实现。
ChickenAIController implements(Interface_Dragger); 实现狐狸叼鸡
ChickenPawn implements(Interface_DraggableItem); 能被拖拽
ChickenPlayerController implements(Iterface_Dragger); 在controller中实现Interface_Dragger.
2.先从实现Interface_DraggableItem的类看,因为后面会看到该接口的DropGrabbedActor函数会实现Interface_DraggableItem的函数。
看看ChickenPawn中的接口实现部分。有变量var Interface_Dragger currentHolder;
我们看看在ChickenPawn中Intergace_DraggableItem的实现。有三个大动作将CurrentHolder=InterfaceDragger(Grabber),第二个动作设置动画,第三个动作进入AIController中进入Grabbed状态,该状态只是改变了碰撞和物理设置。我将NotifyGrabbed函数搜索了一下,可能最重要的调用地方在DoDeferredTouch的函数中,该函数用来执行触摸设置。在第四步里面我就进行这个函数的相关函数研究。这也是最有内容的地方。
3.有一种模式我得谈一谈,pawn是反映在世界中的物理事物,而controller可以看做精神事物,物理事物在世界中被反馈,然后让神经中枢controller来处理对应的反应。
所以,接口函数在pawn中实现,然后在controller中通知对应的反应。
前期的工作做完了,让我们看一看触屏的实现方式。