封装CocosCreator动作系统

支持以下功能,未支持的可以自行补充
* 渐隐渐显
* 位置
* 缩放
* 旋转
* 指定位置(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

猜你喜欢

转载自blog.csdn.net/juedno/article/details/80858157