2014-05-21 24 views

回答

3

剛走做到這一點(在Unity)的基本前提是:

  • 投下光線向下從身體的中心,它的「腳」(即線長度等於半高身體/節點)
  • 如果射線與身體相交,請檢查身體是否「可行走」(即某種程度上定義爲地面身體,爲了簡單起見,您可以檢查身體是否非動態,以獲得更好的身體狀態-grained control比較交叉物體的類別和聯繫人位掩)
  • 如果您發現相交的,可行走的物體,請將物體的位置設置爲當光線打到對方身上,再加上身體/節點的高度的一半

在雪碧套件獲得從光線投射交叉點的唯一方法是使用SKPhysicsWorldenumerateBodiesAlongRayStart:end:usingBlock:。如果你的角色只能直走(即他不會旋轉以適應地形,而地形沒有「循環」),則只需檢查交點的Y座標。

說出您的節點的位置是在Y = 340和射線相交於Y = 310和您的節點的高度爲80,則:

(340 - 310) + 80/2 = 70 

然後70是從播放器應該被定位在地板的距離,確切地說,它是光線碰到地板(310)時的Y座標加上這個70,這就使得Y = 380作爲新的高度。當你在飛機上行走時,保持X座標並改變Y座標。

當然,地平面需要是一個物理體,特別是使用邊緣形體。有些工具可以讓你從形狀設計這些點,最突出的是PhysicsEditor。但是,一開始,您可以嘗試使用單個線段,以一定角度傾斜,以測試您的角色是否正確地向上或向下飛行。

請注意,如果您使用的是物理,您應該在確定地面命中後將物理體的速度設置爲0,0,否則速度可能會累積,並且物體最終在地面下降,或者無法跳躍,或者做其他奇怪的東西。

+0

我仍然會設置物理主體'CategoryBitMask'等嗎?或者光線投射是否完成所有工作? @ LearnCocos2D – Mutch95

+1

就我所瞭解的情況而言,光線投射會使你擊中所有的物體,然後你必須測試枚舉的物體是否應該被認爲是碰撞或不碰撞。例如,它可能會返回播放器主體本身作爲第一個結果。 – LearnCocos2D