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.mzph.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启动成功…

【再谈设计模式】享元模式~对象共享的优化妙手

一、引言 在软件开发过程中,我们常常面临着创建大量细粒度对象的情况,这可能会导致内存占用过高、性能下降等问题。享元模式(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的生成树计算结…

《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 视觉沙龙中机器视觉检测基础知识” 文章合辑。 机器视觉检测基础知识(一)颜色篇 视觉检测硬件构成的基本部分包括:处理器、相机、镜头、光源。 其中,和光源相关的最重要的两个参数就是光源颜色和…

【体验官招募】SoFlu - JavaAI 开发助手:开启智能开发新时代

你是否有过这样的经历?在深夜的办公室里,面对紧急的 Java 项目,看着厚厚的需求文档,你是否感到无从下手? 当你尝试理解客户那些复杂又模糊的需求时,是否会因为要和产品经理反复沟通确认每一个细节而感到厌…

自学记录HarmonyOS Next DRM API 13:构建安全的数字内容保护系统

在完成了HarmonyOS Camera API的开发之后,我开始关注更复杂的系统级功能。在浏览HarmonyOS Next文档时,我发现了一个非常有趣的领域:数字版权管理(DRM)。最新的DRM API 13提供了强大的工具,用于保护数字内容…

【HENU】河南大学计院2024 操作系统 简答题复习

和光同尘_我的个人主页 一直游到海水变蓝。 单项选择 15x2 30 判断 10x1 10 简答 3x10 30 综合 3x10 30 简答题 简述操作系统的四个基本特征。 并发性 共享性 虚拟性 异步性 并发性是最重要特性,其它三种特性以此为前提。 并发 并发(Concurrence)&#…

GEE错误——PCA系数变换的时候出现的错误

目录 错误提示1 错误提示2 原始的教程链接: 错误代码 修正后的代码 结果 错误提示1 这个是因为原始GEE教程中给的让我们填入需要进行计算的波段名称,而且是以list的形式传入。 错误提示2 这里我们虽然传入了正确的波段名称,但是发现要…