You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
6.6 KiB
198 lines
6.6 KiB
4 weeks ago
|
/*
|
||
|
* @Author: YeeChan
|
||
|
* @Date: 2020-12-23 11:50:28
|
||
|
* @Description:
|
||
|
*/
|
||
|
|
||
|
import FMSkeletonExtend from "./FMSkeletonExtend";
|
||
|
import FMComponentExtend from "../Base/FMComponentExtend";
|
||
|
import SoundMgr from "../Mgr/SoundMgr";
|
||
|
|
||
|
/****************************************************
|
||
|
* spine对象的处理
|
||
|
*****************************************************/
|
||
|
const { ccclass, property, menu, disallowMultiple, executionOrder, requireComponent, executeInEditMode, playOnFocus } = cc._decorator;
|
||
|
@ccclass
|
||
|
@requireComponent(FMSkeletonExtend)
|
||
|
@disallowMultiple() //防止多个相同类型(或子类型)的组件被添加到同一个节点
|
||
|
@menu('FM组件/FMSpine')
|
||
|
export default class FMSpine extends FMComponentExtend {
|
||
|
|
||
|
//当前的spine
|
||
|
private spine: FMSkeletonExtend;
|
||
|
//事件的集合
|
||
|
private arrayEvent: Array<{ "name": string, "listener": FMListener }> = [];
|
||
|
|
||
|
//槽对应的节点
|
||
|
private arraySlotEvent: {} = {};
|
||
|
|
||
|
protected EventEnumView_custom: { [key: string]: string; } = {};
|
||
|
|
||
|
protected initView_custom() {
|
||
|
//事件 监听
|
||
|
this.getSpine().setEventListener((trackEntry, event) => {
|
||
|
let animation = trackEntry.animation;
|
||
|
let animationName = trackEntry.animation.name;
|
||
|
let eventName = event.data && event.data.name;
|
||
|
let eventStringValue = event.stringValue;
|
||
|
let eventIntValue = event.intValue;
|
||
|
let eventFloatValue = event.floatValue;
|
||
|
|
||
|
if (eventName == "sound") {//声音事件
|
||
|
SoundMgr.playSpineSound_custom(eventStringValue, animationName);
|
||
|
}
|
||
|
this.arrayEvent.forEach(element => {
|
||
|
let name = element.name;
|
||
|
let listener = element.listener;
|
||
|
if (name == eventName) {
|
||
|
callFM_custom(listener, animation, animationName, eventName);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
//this.spine.dumpSpineInfo_custom();
|
||
|
|
||
|
//this.getSpine().debugBones = true;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 添加槽的受影响动作及对应添加的子节点
|
||
|
* @param slotName 槽名字
|
||
|
* @param arrarAction 所受影响的动作
|
||
|
* @param childNode 动作里的自定义子节点
|
||
|
*/
|
||
|
addSlotByNodeEvent(slotName: string, arrarAction: string[], childNode: cc.Node[]) {
|
||
|
this.arraySlotEvent[slotName] = {
|
||
|
"slot": this.getSpine().findSlot(slotName),
|
||
|
"arrayAction": arrarAction,
|
||
|
"childNode": childNode
|
||
|
}
|
||
|
// console.log(slotName)
|
||
|
// console.log(this.getSpine().findSlot(slotName))
|
||
|
}
|
||
|
/**
|
||
|
* 添加事件监听
|
||
|
* @param eventName 事件的名字
|
||
|
* @param listener 事件的回调
|
||
|
*/
|
||
|
addEvent(eventName: string, listener: FMListener) {
|
||
|
this.arrayEvent.push({
|
||
|
"name": eventName,
|
||
|
"listener": listener
|
||
|
})
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 移除所有的事件监听
|
||
|
*/
|
||
|
removeEventAll() {
|
||
|
this.arrayEvent = [];
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 当前播放的动画名称
|
||
|
*/
|
||
|
animation(): string {
|
||
|
return this.getSpine().animation
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 当前骨骼中所有动画的时间缩放率
|
||
|
* @param scale
|
||
|
*/
|
||
|
setTimeScale(scale: number) {
|
||
|
this.getSpine().timeScale = scale;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 获取spine对象
|
||
|
*/
|
||
|
getSpine(): FMSkeletonExtend {
|
||
|
if (this.spine == null) {
|
||
|
this.spine = this.node.getComponent(FMSkeletonExtend)
|
||
|
}
|
||
|
return this.spine;
|
||
|
}
|
||
|
|
||
|
update(dt: number) {
|
||
|
// for (const key in this.arraySlotEvent) {
|
||
|
// if (this.arraySlotEvent.hasOwnProperty(key)) {
|
||
|
// const element = this.arraySlotEvent[key];
|
||
|
// let slot = element.slot
|
||
|
// let arrayAction: string[] = element.arrayAction;
|
||
|
// let childNode: cc.Node[] = element.childNode;
|
||
|
// for (let index = 0; index < arrayAction.length; index++) {
|
||
|
// const actionName = arrayAction[index];
|
||
|
// if (this.getSpine().animation != actionName) {//不一样
|
||
|
// childNode.forEach(element2 => {
|
||
|
// element2.active = false;
|
||
|
// });
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
// for (const key in this.arraySlotEvent) {
|
||
|
// if (this.arraySlotEvent.hasOwnProperty(key)) {
|
||
|
// const element = this.arraySlotEvent[key];
|
||
|
// let slot = element.slot
|
||
|
// let arrayAction: string[] = element.arrayAction;
|
||
|
// let childNode: cc.Node[] = element.childNode;
|
||
|
// for (let index = 0; index < arrayAction.length; index++) {
|
||
|
// const actionName = arrayAction[index];
|
||
|
// if (this.getSpine().animation == actionName) {//不一样
|
||
|
// childNode.forEach(element2 => {
|
||
|
// element2.active = true;
|
||
|
|
||
|
// element2.x = slot.bone.worldX;
|
||
|
// element2.y = slot.bone.worldY;
|
||
|
// element2.scaleX = slot.bone.scaleX;
|
||
|
// element2.scaleY = slot.bone.scaleY;
|
||
|
// element2.angle = slot.bone.getWorldRotationX();
|
||
|
|
||
|
// element2.color = cc.color(slot.color.r * 255, slot.color.g * 255, slot.color.b * 255);
|
||
|
// element2.opacity = slot.color.a * 255;
|
||
|
// });
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
//this.getSpine()
|
||
|
// vconsole.min.js:11 `cc.Node.rotationX` is deprecated since v2.1.0, please set `eulerAngles` instead. (`this.node.rotationX = x` -> `this.node.is3DNode = true; this.node.eulerAngles = cc.v3(x, 0, 0)`
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 设置当前动画。队列中的任何的动画将被清除
|
||
|
* @param name 动画名字
|
||
|
* @param loop 是否循环
|
||
|
* @param trackIndex 队列
|
||
|
*/
|
||
|
setAnimation(name: string, loop: boolean = false, trackIndex: number = 0) {
|
||
|
this.getSpine().setAnimation(trackIndex, name, loop);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 为所有关键帧设定混合及混合时间(从当前值开始差值)。
|
||
|
* @param fromAnimation 开始动作
|
||
|
* @param toAnimation 结束动作
|
||
|
* @param duration 时间
|
||
|
*/
|
||
|
setMix(fromAnimation: string, toAnimation: string, duration: number) {
|
||
|
this.getSpine().setMix(fromAnimation, toAnimation, duration);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 按名称查找皮肤,激活该皮肤
|
||
|
* @param skinName
|
||
|
*/
|
||
|
setSkin(skinName: string) {
|
||
|
this.getSpine().setSkin(skinName);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|