Cocos Creator Spine動畫時間軸(事件時間軸,骨骼時間軸)


cocos版本:2.3.4

spine版本:3.8

 

幀同步和Spine動畫同步的問題

這個主要是做幀同步時,spine動畫上有自定義事件拋出,且動畫骨骼上綁定了傷害判定的盒子。

因為動畫不是邏輯幀來驅動的,所以不同客戶端播放動畫速度不一樣,那么在相同邏輯幀時, 可能A已經播放完成,而B還在播放動畫中,那么判斷就會不一致。

 

例如一個人物揮拳,傷害判定盒子在拳頭上,A在邏輯幀10的時候,動畫播放到第20幀,拳頭伸出,拋出damageEvent事件,計算傷害。

而B在邏輯幀10,動畫可能播放到18幀,拳頭沒有完全伸出,也沒有拋出幀事件damageEvent。

 

而spine動畫沒法用邏輯幀去驅動,那么動畫會卡頓。動畫本身是渲染層的東西,不應該涉及到邏輯層。

 

這里嘗試根據時間軸來判定邏輯,將事件和傷害判定范圍划分到驅動幀上。

例如事件幀damageEvent在揮拳動畫0.13秒拋出。

那么根據邏輯幀50ms一幀, damageEvent就應該是在第3個邏輯幀執行,無論動畫播放到哪。在第三幀去獲取拳頭碰撞盒子的位置,進行邏輯判斷。

這樣所有客戶端,都會在相同的邏輯幀,執行相同的傷害判斷邏輯,有相同的碰撞范圍,產生相同的結果。

 

 

 

Spine動畫事件時間軸的獲取

例如下圖中攻擊動畫attack1_1上有傷害判定的damge事件,我們在cocos中去獲取,並將其划分到驅動幀上。

 

 

打印出節點上骨骼動畫sp.Skeleton

spine的事件幀位置在 _state.data.skeletonData.animations[i].timelines.EventTimeline上。如下圖:   (輸出信息太長了,截成兩張圖了)

第一張圖:

 

第二張圖,接上一張圖的timelines的第65-67項:

 

 

由上圖可以看到攻擊動畫attack1_1上,在攻擊動作進行到0.2333秒時,拋出了damge傷害計算事件,那就是在第1個邏輯幀播放攻擊動畫,然后在第5個邏輯幀進行傷害判定。

 

傷害盒子范圍

我們知道了damage事件在0.2333秒拋出,那么damage的傷害判定盒子的位置和范圍如何獲取???

我找了半天沒找着,莫非位置是實時計算的。。。

如果是實時的,那么只有在游戲中播放一遍,在播放中獲取位置。。。

看來得自己寫個工具導配置了。

 


免責聲明!

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



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