CocosCreator-引擎案例-TS:spine

工程1:LoadSpine:簡單加載spine資源

建立工程,在層級上建立一個空對象,改名spine

在spine上添加spine組件:? 添加組件>渲染組件>spine

在spine上掛上腳本loadspine

onLoad () {cc.resources.load('loadSpine/alien-ess',sp.SkeletonData,this.newSpine.bind(this))let canvas = cc.find('Canvas');}newSpine(err,res){if(err){cc.log("err")}let spine = this.getComponent(sp.Skeleton);spine.skeletonData = res;this.spineAnimate = spine.setAnimation(0,'run',true);}

工程2:SpineAttach:骨架上的掛點

在項目中建立一個空對象改名raptor,并掛spine組件

在項目中建立5個按鈕

@property(sp.Skeleton)skeleton: sp.Skeleton = null;@property(cc.Prefab)targetPrefab: cc.Prefab = null;@property(cc.Label)modeLabel:cc.Label = null;@property(cc.String)redBoneName="";@property(cc.String)blueBoneName="";@property(cc.String)greenBoneName="";// LIFE-CYCLE CALLBACKS:// onLoad () {}destoryAllNode(){let attachUtil = this.skeleton.attachUtil;attachUtil.destroyAllAttachedNodes();//銷毀所有掛點}changeMode(){let isCached = this.skeleton.isAnimationCached();//當前是否處于緩存模式若想切換渲染模式,最好在設置'dragonAsset'之前,先設置好渲染模式,否則有運行時開銷if(isCached){this.skeleton.setAnimationCacheMode(sp.Skeleton.AnimationCacheMode.REALTIME);}else{this.skeleton.setAnimationCacheMode(sp.Skeleton.AnimationCacheMode.SHARED_CACHE);}}destorySomeNode(){let attachUtil = this.skeleton.attachUtil;attachUtil.destroyAttachedNodes(this.greenBoneName);//銷毀對應的掛點}genetateSomeNodes(){let attachUtil = this.skeleton.attachUtil;let boneNodes = attachUtil.generateAttachedNodes(this.greenBoneName);let boneNode = boneNodes[0];if (boneNode) {let targetNode = cc.instantiate(this.targetPrefab);targetNode.color = cc.color(0, 255, 0);boneNode.addChild(targetNode);}}//btn_Add_Red_And_BluegenerateAllNodes(){let attachUtil = this.skeleton.attachUtil;//掛點工具類 ,TS版本不全,自己去creator.d.ts 修改attachUtil.generateAllAttachedNodes();遍歷所有插槽,生成包含所有給定插槽名稱的最小節點樹,注意,調用該接口前請確保骨骼動畫已經初始化好。let boneNodes = attachUtil.getAttachedNodes(this.redBoneName);//獲得對應的掛點let boneNode = boneNodes[0];if(boneNode){let targetNode = cc.instantiate(this.targetPrefab);targetNode.color = cc.color(255,0,0);boneNode.addChild(targetNode);}let boneNodes1 = attachUtil.getAttachedNodes(this.blueBoneName);//獲得對應的掛點let boneNode1 = boneNodes1[0];if(boneNode1){let targetNode = cc.instantiate(this.targetPrefab);// targetNode.color = cc.color(0,0,255); //藍色 黑乎乎一片,這里先屏蔽了boneNode1.addChild(targetNode);}}

注意:TS版本中有一些API不全,自己在?creator.d.ts 中改一下

creator.d.ts 的 API 順序不穩定,小版本升級難比對 - Creator 2.x - Cocos中文社區

工程3:SpineBoy:角色 切換動作,時間縮放,調試插槽關節

一個spine對象 放在場景里

用按鈕來控制

????????角色的各種動作

? ? ? ? 插槽的顯隱

? ? ? ? 關節的顯隱

????????時間的縮放:動畫播放速度?

// Learn TypeScript:
//  - https://docs.cocos.com/creator/2.4/manual/en/scripting/typescript.html
// Learn Attribute:
//  - https://docs.cocos.com/creator/2.4/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
//  - https://docs.cocos.com/creator/2.4/manual/en/scripting/life-cycle-callbacks.htmlconst {ccclass, property} = cc._decorator;@ccclass
export default class SpineCtrl extends cc.Component {@property(cc.Label)label: cc.Label = null;@property(Number)mixTime: number = 0;// LIFE-CYCLE CALLBACKS:spineboySkeleton:sp.Skeleton;_hasStop:boolean;onLoad () {this.spineboySkeleton = this.node.getComponent(sp.Skeleton);this._setMix('walk','run');this._setMix('run','jump');this._setMix('walk','jump');this._hasStop = false;//用來設置開始播放動畫的事件監聽。this.spineboySkeleton.setStartListener(trackEntry=>{let animationName = trackEntry.animation ? trackEntry.animation.name : "";cc.log("[track %s][animation %s] start.", trackEntry.trackIndex, animationName);})//用來設置動畫被打斷的事件監聽。this.spineboySkeleton.setInterruptListener(trackEntry=>{let animationName = trackEntry.animation ? trackEntry.animation.name : "";cc.log("[track %s][animation %s] interrupt.", trackEntry.trackIndex, animationName);})//用來設置動畫播放完后的事件監聽。this.spineboySkeleton.setEndListener(trackEntry=>{let animationName = trackEntry.animation ? trackEntry.animation.name : "";cc.log("[track %s][animation %s] end.", trackEntry.trackIndex, animationName);})//用來設置動畫將被銷毀的事件監聽。this.spineboySkeleton.setDisposeListener(trackEntry=>{let animationName = trackEntry.animation ? trackEntry.animation.name : "";cc.log("[track %s][animation %s] will be disposed.", trackEntry.trackIndex, animationName);})//用來設置動畫播放一次循環結束后的事件監聽。this.spineboySkeleton.setCompleteListener(trackEntry=>{let animationName = trackEntry.animation ? trackEntry.animation.name : "";if (animationName === 'shoot') {this.spineboySkeleton.clearTrack(1);}var loopCount = Math.floor(trackEntry.trackTime / trackEntry.animationEnd); cc.log("[track %s][animation %s] complete: %s", trackEntry.trackIndex, animationName, loopCount);})// 用來設置動畫播放過程中幀事件的監聽this.spineboySkeleton.setEventListener((trackEntry,event)=>{let animationName = trackEntry.animation ? trackEntry.animation.name : "";cc.log("[track %s][animation %s] event: %s, %s, %s, %s", trackEntry.trackIndex, animationName, event.data.name, event.intValue, event.floatValue, event.stringValue);})}toogleDebugSlots(){this.spineboySkeleton.debugSlots = !this.spineboySkeleton.debugSlots;}toggleDebugBones(){this.spineboySkeleton.debugBones = !this.spineboySkeleton.debugBones;}toggleTimeScale(){if(this.spineboySkeleton.timeScale === 1.0){this.spineboySkeleton.timeScale = 0.3;}else{this.spineboySkeleton.timeScale = 1.0;}}stop(){this.spineboySkeleton.clearTrack(0);this._hasStop = true;}walk(){this.spineboySkeleton.setAnimation(0,'walk',true);this._hasStop = false;}run(){this.spineboySkeleton.setAnimation(0,'run',true);this._hasStop =false;}jump(){let oldAnim = this.spineboySkeleton.animation;this.spineboySkeleton.setAnimation(0,'jump',false);if(oldAnim && !this._hasStop){this.spineboySkeleton.addAnimation(0,oldAnim === 'run'?'run':'walk',true,0);}}shoot(){this.spineboySkeleton.setAnimation(1,'shoot',false);}start () {}_setMix(anim1,anim2){this.spineboySkeleton.setMix(anim1,anim2,this.mixTime);this.spineboySkeleton.setMix(anim2,anim1,this.mixTime);}// update (dt) {}
}

小問題:

? ? ? ? 嘗試腳本生成spine對象,注意要實例化骨骼,否則setMix 會報錯,

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64153.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64153.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用FreeNAS軟件部署ISCSI的SAN架構存儲(IP-SAN)練習題

一,實驗用到工具分別為: VMware虛擬機,安裝教程:VMware Workstation Pro 17 安裝圖文教程 FreeNAS系統,安裝教程:FreeNAS-11.2-U4.1安裝教程2024(圖文教程) 二,新建虛…

【ANGULAR網站開發】初始環境搭建

1. 初始化angular項目 1.1 創建angular項目 需要安裝npm和nodejs,這邊不在重新安裝 直接安裝最新版本的angular npm install -g angular/cli安裝指定大版本的angular npm install -g angular/cli181.2 啟動angular 使用idea啟動 控制臺啟動 ng serve啟動成功…

lua debug相關方法詳解

lua debug相關方法詳解 1. debug.debug()2. debug.getinfo(func | level [, what])3. debug.getlocal(func-or-level, localindex)4. debug.setlocal(level, local_number, value)5. debug.getupvalue(func, upvalue_index)6. debug.setupvalue(func, upvalue_index, value)7. …

《計算機網絡(第7版)-謝希仁》期末考試復習題和答案(總結整理)

目錄 前言: 一、選擇題。 二、填空題。 三、名詞解釋。 四、簡答題。 前言: 這個自動標題自己帶了序號,一開始想全部選項和題號都改過來的,結果一看一百多個全是,懶得改了 一、選擇題。 1、廣域網覆蓋的地理范圍…

【再談設計模式】享元模式~對象共享的優化妙手

一、引言 在軟件開發過程中,我們常常面臨著創建大量細粒度對象的情況,這可能會導致內存占用過高、性能下降等問題。享元模式(Flyweight Pattern)就像是一位空間管理大師,它能夠在不影響功能的前提下,有效地…

Milvus×EasyAi:如何用java從零搭建人臉識別應用

如何從零搭建一個人臉識別應用?不妨試試原生Java人工智能算法:EasyAi Milvus 的組合拳。 本文將使用到的軟件和工具包括: EasyAi:人臉特征向量提取Milvus:向量數據庫用于高效存儲和檢索數據。 01. EasyAi:…

NS3學習——tcpVegas算法代碼詳解(2)

NS3學習——tcpVegas算法代碼詳解(1)-CSDN博客 目錄 4.TcpVegas類中成員函數 (5) CongestionStateSet函數 (6) IncreaseWindow函數 1.檢查是否啟用 Vgas 2.判斷是否完成了一個“Vegas 周期” 2.1--if:判斷RTT樣本數量是否足夠 2.2--e…

GitLab 將停止為中國區用戶提供服務,60天遷移期如何應對? | LeetTalk Daily

“LeetTalk Daily”,每日科技前沿,由LeetTools AI精心篩選,為您帶來最新鮮、最具洞察力的科技新聞。 GitLab作為一個廣受歡迎的開源代碼托管平臺,近期宣布將停止服務中國大陸、澳門和香港地區的用戶提供服務。根據官方通知&#x…

華為實訓課筆記 2024 1223-1224

華為實訓 12/2312/24 12/23 [Huawei]stp enable --開啟STP display stp brief --查詢STP MSTID Port Role STP State Protection 實例ID 端口 端口角色 端口狀態 是否開啟保護[Huawei]display stp vlan xxxx --查詢制定vlan的生成樹計算結…

企業數字化轉型中如何區分“IT投入”和“業務投入”

在數字化轉型的浪潮中,企業往往面臨一個關鍵問題:如何區分“IT投入”和“業務投入”?在很多企業中,這兩個概念往往被混淆,不少公司甚至認為“數字化轉型”就是“IT的事情”,但實際上,它們之間有…

【Spring AI】Spring AI Alibaba的簡單使用

提示:文章最后有詳細的參考文檔。 前提條件 SpringBoot版本為3.x以上JDK為17以上申請api-key,地址:百煉平臺 引入依賴 說明:我的springboot版本為3.2.4,spring-ai-alibaba-starter版本為1.0.0-M2.1(對應spring-ai版本…

《Java源力物語》-3.空值獵手

~犬📰余~ “我欲賤而貴,愚而智,貧而富,可乎? 曰:其唯學乎” \quad 夜色漸深,在一處偏僻小徑上,月光透過濃密的源力云層,在地面上投下斑駁的光影。String正獨自練習著剛從…

科技云報到:人工智能時代“三大件”:生成式AI、數據、云服務

科技云報到原創。 就像自行車、手表和縫紉機是工業時代的“三大件”。生成式AI、數據、云服務正在成為智能時代的“新三大件”。加之全球人工智能新基建加速建設,成為了人類社會數字化遷徙的助推劑,讓新三大件之間的耦合越來越緊密。從物理世界到數字世…

hiprint結合vue2項目實現靜默打印詳細使用步驟

代碼地址是:vue-plugin-hiprint: hiprint for Vue2/Vue3 ?打印、打印設計、可視化設計器、報表設計、元素編輯、可視化打印編輯 本地安裝包地址:electron-hiprint 發行版 - Gitee.com 1、先安裝hipint安裝包在本地 2、項目運行npm(socket.…

CUDA各種內存和使用方法

文章目錄 1、全局內存2、局部內存3、共享內存3.1 靜態共享內存3.2 動態共享內存 4、紋理內存5、常量內存6、寄存器內存7、用CUDA運行時API函數查詢設備CUDA 錯誤檢測 1、全局內存 特點:容量最大,訪問延時最大,所有線程都可以訪問。 線性內存…

Chapter 03 復合數據類型-1

1.列表 Python內置的一種有序、可變的序列數據類型; 列表的定義: [ ]括起來的逗號分隔的多個元素組成的序列 列表對象的創建: (1)直接賦值 >>> list1 []#創建一個空列表賦值給list1 >>> list…

【后端】LNMP環境搭建

長期更新各種好文,建議關注收藏! 本文近期更新完畢。 LNMPlinuxnginxmysqlphp 需要的資源 linux服務器 web服務軟件nginx 對應的語言編譯器代碼文件 數據庫mysql安裝 tar.gz包或者命令行安裝 進入root: sodu 或su mkdir path/{server,soft}…

基于PyQt5的UI界面開發——多界面切換

介紹 最初,因為課設的緣故,我只是想做一個通過按鍵進行切面切換而已,但是我看網上資料里面僅是語焉不詳,讓我困惑的很,但后面我通過摸索才發現這件事實在是太簡單了,因此我想要記錄下來。 本博客將介紹如…

操作002:HelloWorld

文章目錄 操作002:HelloWorld一、目標二、具體操作1、創建Java工程①消息發送端(生產者)②消息接收端(消費者)③添加依賴 2、發送消息①Java代碼②查看效果 3、接收消息①Java代碼②控制臺打印③查看后臺管理界面 操作…

機器視覺檢測相機基礎知識 | 顏色 | 光源 | 鏡頭 | 分辨率 / 精度 / 公差

注:本文為 “keyence 視覺沙龍中機器視覺檢測基礎知識” 文章合輯。 機器視覺檢測基礎知識(一)顏色篇 視覺檢測硬件構成的基本部分包括:處理器、相機、鏡頭、光源。 其中,和光源相關的最重要的兩個參數就是光源顏色和…