CocosCreator - Bezier曲线插件

自己用业余时间写的第一款CocosCreator小插件。

Bezier插件链接

Bezier曲线插件说明

Bezier曲线是一款方便开发者做路径规划以及曲线运动的插件,支持可视化编辑、匀速曲线运动、支持各种缓动(InSine、OutSine等等)、支持多段曲线运动、绘制路径。方便开发者在项目组快速的实现曲线运动,不再为贝塞尔曲线不能匀速而烦恼。

注意:该插件仅支持Creator 2.2.0 - 2.4.4 版本,其他版本的需要手动拷贝 Packages/bezier/Bezier 文件夹到项目中,并且需要微调一下代码才能使用(非常简单,例如1.x.x 版本的仅需把cc.Vec3 类型改为cc.Vec2; 2.4.5版本的只需手动拷贝文件就行了)

Bezier曲线插件使用教程

1.导入组件:

CocosCreator - Bezier曲线插件

2.添加组件:

添加组件的方式主要有两种:
1.选中节点,点击鼠标右键,点击 “添加Bezier组件”。
2.在inspector面板,点击添加组件,选择“Bezier”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-09WzJWfu-1621399961675)(https://i.loli.net/2021/04/24/5oHUk92fGgPQrwF.gif)]

3.编辑曲线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F9fiJM1w-1621399961677)(https://i.loli.net/2021/05/03/2vceKfSHNG5Wm61.gif)]

4.运行曲线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Knh3Jcru-1621399961680)(https://i.loli.net/2021/05/03/bDYrk5ZzNOt6nIR.gif)]

5.缓动动画

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nVmhYquK-1621399961683)(https://i.loli.net/2021/05/03/Io6ArRxJz8Yi43O.gif)]

6.多段曲线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gVBS8Ql5-1621399961684)(https://i.loli.net/2021/05/03/5LvEOcuZj8FTdn4.gif)]

7.暂停与恢复

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5eHpbDSp-1621399961685)(https://i.loli.net/2021/05/09/CtcBL1PO8usgJn4.gif)]

BezierCurve组件:

可以在代码中通过API直接调用组件的方法实现播放、暂停、恢复、停止等操作。

例如:

let bezierCurve = this.player.getComponent(BezierCurve)
if (bezierCurve) {
    // 播放
    bezierCurve.Play()
    // 暂停
    bezierCurve.Pause()
    // 恢复
    bezierCurve.Resume()
    // 停止
    bezierCurve.Stop()
}

BezierCurve组件API:

export class BezierCurve{
    /**
     * 添加曲线
     * @param curve 曲线
     */
    public AddCurve(curve: Curve) : void

    /**
    * 删除曲线
    * @param curve 曲线
    */
    public DeleteCurve(curve: Curve): void;
    /**
     * 删除曲线
     * @param index 索引
     */
    public DeleteCurve(index: number): void;

    /**
     * 设置完成回调
     * @param callBack 回调
     */
    public void SetCompleteCallBack(callBack?: () => void) : void

    /**
     * 播放
     */
    public Play(): void 

     /**
     * 停止
     */
    public Stop(): void

    /**
     * 暂停
     */
    public Pause(): void 

    /**
     * 恢复
     */
    public Resume(): void
}


Bezier类:

如果我们不想在每个node 上都挂载`BezierCurve组件`怎么办? 此时我们也可以通过`Bezier`类来快速简单的实现曲线运动。

代码如下:


//  Example1:

// 曲线控制点
let posArr = [new cc.Vec3(-400, 0, 0), new cc.Vec3(0, 500, 0), new cc.Vec3(400, 0, 0)]
// 移动(返回一个Bezier对象, 通过该对象可以暂停、恢复、停止)
let bezier = Bezier.Move(this.player, posArr, 2, EaseType.Linear,  () => {
        console.log("play complete")
    })

// 暂停
bezier.Pause()
// 恢复
bezier.Resume()
// 停止
bezier.Stop()


//  Example2: 也可以自己构建一个Curve对象
let curve = new Curve();
curve.duration = 1
curve.points = [new cc.Vec3(-400, 0, 0), new cc.Vec3(0, 500, 0), new cc.Vec3(400, 0, 0)]
curve.ease = EaseType.Constant
let bezier = Bezier.Move(this.playerB,curve);
...

// Example3: 移动多个曲线(每个曲线都拥有自己独立的duration和ease)
let curve1 = new Curve();
curve1.duration = 1
curve1.points = [new cc.Vec3(-400, 0, 0), new cc.Vec3(0, 500, 0), new cc.Vec3(400, 0, 0)]
curve1.ease = EaseType.Constant

let curve2 = new Curve();
curve2.duration = 1
curve2.points = [new cc.Vec3(400, 0, 0), new cc.Vec3(0, -500, 0), new cc.Vec3(-400, 0, 0)]
curve2.ease = EaseType.Constant

Bezier.MoveQuenue(this.playerB,[curve1,curve2]);

// Example4: 移动多个曲线(所有曲线都共享同一个duration和ease)
let curve1 = new Curve();
curve1.points = [new cc.Vec3(-400, 0, 0), new cc.Vec3(0, 500, 0), new cc.Vec3(400, 0, 0)]

let curve2 = new Curve();
curve2.points = [new cc.Vec3(-400, 0, 0), new cc.Vec3(0, 500, 0), new cc.Vec3(400, 0, 0)]

Bezier.MoveList(this.playerB,[curve1,curve2],2,EaseType.Linear);

Bezier API:

export class BezierCurve{
    /**
     * Bezier曲线移动
     * @param target 目标节点
     * @param points 控制点
     * @param duration 持续时长
     * @param ease 缓动
     * @param callBack 完成回调
     * @returns Bezier
     */
    public static Move(target: cc.Node, points: cc.Vec3[], duration: number, ease?: EaseType, callBack?: () => void): Bezier;
    /**
     * Bezier曲线移动
     * @param target 目标节点
     * @param curve 曲线对象
     * @param callBack 完成回调
     */
    public static Move(target: cc.Node, curve: Curve, callBack?: () => void): Bezier;

    
    /**
     * 移动队列, 需要传入一个曲线列表, 顺序执行每个曲线。每个曲线的duration(生命周期)和ease(缓动)都是独立的
     * @param target 目标节点
     * @param curveList 曲线列表
     * @param callBack 回调
     * @returns Bezier
     */
    public static MoveQuenue(target: cc.Node, curveList: Curve[], callBack = () => { }): Bezier 


    /**
     * 曲线列表整体以ease缓动移动,共享duration(生命周期),ease(缓动)。
     * @param target 目标节点
     * @param curveList 曲线列表
     * @param duration 生命周期
     * @param ease 缓动
     * @param callBack 回调
     * @returns Bezier
     */
    public static MoveList(target: cc.Node, curveList: Curve[], duration: number, ease: EaseType = EaseType.Linear, callBack = () => { }): Bezier
}
上一篇:CocosCreator基于websocket实时对战开发方案


下一篇:微信小程序新版本后用户昵称变成了“微信用户“解决方法