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的傷害判定盒子的位置和范圍如何獲取???
我找了半天沒找着,莫非位置是實時計算的。。。
如果是實時的,那么只有在游戲中播放一遍,在播放中獲取位置。。。
看來得自己寫個工具導配置了。