支持以下功能,未支持的可以自行补充
* 渐隐渐显
* 位置
* 缩放
* 旋转
* 指定位置(place)
* 序列执行动作,执行完成回调
* 缓动动作
* 重复动作
* 同步执行动作
* 贝塞尔曲线动作
* 官方api详情:http://docs.cocos.com/creator/manual/zh/scripting/action-list.html
/**
* 节点动作工具类
*/
export default class NodeActionTools
{
private static _instance:NodeActionTools;
public static get Instance():NodeActionTools
{
if (this._instance == null)
{
this._instance = new NodeActionTools();
}
return this._instance;
}
/**
* 移动到目标位置
* @param position 目标位置
* @param duration 时间
* @param easeObj 缓动动作类型
*/
public moveTo(position: cc.Vec2,duration: number = 1,easeType?:any):cc.ActionInterval
{
let action:cc.ActionInterval = cc.moveTo(duration,position);
if (easeType != null)
{
action.easing(easeType);
}
return action;
}
/**
* 移动指定距离
* @param deltaPos 移动的距离
* @param duration 时间
* @param easeObj 缓动动作类型
*/
public moveBy(deltaPos:cc.Vec2,duration: number = 1,easeType?:any):cc.ActionInterval
{
let action:cc.ActionInterval= cc.moveBy(duration,deltaPos);
if (easeType != null)
{
action.easing(easeType);
}
return action;
}
/**
* 将节点大小缩放到指定的倍数
* @param duration 时间
* @param sx x缩放值
* @param sy y缩放值
* @param easeObj 缓动动作类型
*/
public scaleTo(duration: number,sx: number, sy?: number,easeType?:any):cc.ActionInterval
{
let action:cc.ActionInterval = null;
if (sy!= null)
{
action = cc.scaleTo(duration,sx,sy);
}else
{
action = cc.scaleTo(duration,sx);
}
if (easeType != null)
{
action.easing(easeType);
}
return action;
}
/**
* 按指定的倍数缩放节点大小
* @param duration 时间
* @param sx x缩放值
* @param sy y缩放值
* @param easeObj 缓动动作类型
*/
public scaleBy(duration: number,sx: number, sy?: number,easeType?:any):cc.ActionInterval
{
let action:cc.ActionInterval = null;
if (sy!= null)
{
action = cc.scaleBy(duration,sx,sy);
}else
{
action = cc.scaleBy(duration,sx);
}
if (easeType != null)
{
action.easing(easeType);
}
return action;
}
/**
* 旋转到目标角度
* @param duration
* @param deltaAngleX
*/
public rotateTo(duration:number,deltaAngleX:number):cc.ActionInterval
{
let action:cc.ActionInterval = cc.rotateTo(duration,deltaAngleX);
return action;
}
/**
* 渐显 调用渐显之前必须要先把alpha 设置为0
* @param duration 时间
*/
public fadeIn(duration: number = 1):cc.ActionInterval
{
let action:cc.ActionInterval = cc.fadeIn(duration);
return action;
}
/**
* 渐隐 调用渐显之前必须要先把alpha 设置为255
* @param duration 时间
*/
public fadeOut(duration: number = 1):cc.ActionInterval
{
let action:cc.ActionInterval = cc.fadeOut(duration);
return action;
}
/**
* 放置在目标位置。
* @param pos 目标位置
*/
public place(targetPos: cc.Vec2):cc.ActionInstant
{
let action:cc.ActionInstant = cc.place(targetPos);
return action;
}
/**
* 按贝赛尔曲线轨迹移动到目标位置 调用该方法之前 要先把node的位置设置在起始点 不然轨迹会不对
* @param time 时间
* @param startPos 起始位置
* @param cneterPos 中间位置
* @param endPos 目标位置
*/
public bezierTo(time:number,startPos:cc.Vec2,cneterPos:cc.Vec2,targetPos:cc.Vec2):cc.ActionInterval
{
let c: cc.Vec2[] = [startPos,cneterPos,targetPos];
let action:cc.ActionInterval = cc.bezierTo(time,c);
return action;
}
/**
* 顺序执行动作(动作列表中的动作必须带有 duration 属性) 回调调用creatCallFunc 来创建 然后放置在数组里, 注意除了在最后的回调中可以暂停或者停止动作之外,其他回调都不能这样做
* @param finiteTimeActions 动作列表
*/
public sequence(finiteTimeActions:cc.FiniteTimeAction[]):cc.ActionInterval
{
let action:cc.ActionInterval = cc.sequence(finiteTimeActions);
return action;
}
/**
* 重复动作,可以按一定次数重复一个动,如果想永远重复一个动作请使用 repeatForever 动作来完成。
* @param repeatAction 需要重复的动作
* @param times 重复次数
*/
public repeat(repeatAction:cc.FiniteTimeAction, times:number):cc.ActionInterval
{
let action:cc.ActionInterval = cc.repeat(repeatAction,times);
return action;
}
/**
* 永远地重复一个动作,有限次数内重复一个动作请使用 repeat 动作,由于这个动作不会停止,所以不能被添加到 cc.sequence 或 cc.spawn 中。
* @param repeatAction
*/
public repeatForever(repeatAction:cc.FiniteTimeAction):cc.ActionInstant
{
let action:cc.ActionInterval = cc.repeatForever(repeatAction);
return action;
}
/**
* 同步执行动作
* @param finiteTimeActions 动作列表
*/
public spawn(finiteTimeActions:cc.FiniteTimeAction[]):cc.ActionInstant
{
let action:cc.FiniteTimeAction = cc.spawn(finiteTimeActions);
return action;
}
/**
* 创建动作回调
* @param selector 回调函数
* @param selectorTarget 执行目标
* @param data 函数参数
*/
public creatCallFunc(selector: Function, selectorTarget: any, data?: any):cc.ActionInstant
{
//selector.bind(selectorTarget);
let event:cc.ActionInstant= cc.callFunc(selector,selectorTarget,data)
return event;
}
/**
* 执行动作
* @param node
* @param action
*/
public runAction(node:cc.Node,action:cc.Action):void
{
node.runAction(action);
}
/**
* 暂停所有的动作
* @param node
*/
public pauseAllActions(node:cc.Node):void
{
node.pauseAllActions();
}
/**
* 恢复运行本节点上所有暂停的动作
* @param node
*/
public resumeAllActions(node:cc.Node):void
{
node.pauseAllActions();
}
/**
* 停止动作
* @param node
* @param action
*/
public stopAction(node:cc.Node,action:cc.ActionInterval):void
{
node.stopAction(action);
}
/**
* 停止全部动作
* @param node
*/
public stopAllAction(node:cc.Node):void
{
node.stopAllActions();
}
}
这里遇到的一些坑 看这里:https://blog.csdn.net/juedno/article/details/80815820