CocosCreator之KUOKUO带你用递归函数实现物体连续运动到指定位置

本次引擎2.0.5

编辑工具VSCode

如遇不会某个步骤可以先过一遍之前教程,或者下方评论,感谢支持!

 

目标:递归连续运动到点

在游戏中,有时候我们会设置好某几个地方让怪物不断的移动或者移动一次,怎么做呢?

CocosCreator给我们提供了sequence这个顺序函数,但是不够灵活。

我们可以用callFunc与递归的组合来实现灵活的runAction配置。

 

好了,熟悉的教学流程,我们新建个项目然后给个白色单色背景;

然后我们再弄个红色单色快快当主角:

然后我们弄个zhujue.js脚本绑在主角上。

假如我们想让它运动到(0,0)再到(200,200);

通常我们会这么写:

cc.Class({
    extends: cc.Component,

    properties: {
    },
    
    onLoad () {
        var act_1 = cc.moveTo(2,0,0);
        var act_2 = cc.moveTo(2,200,200);
        this.node.runAction(cc.sequence(act_1,act_2));
    },

});

这样:

但是假如我想运动很多点,或者说不固定次数,sequence就很难做到。

怎么办呢?

我们先了解一下递归!!

递归就是函数调用自身实现嵌套的这种。

这样:

cc.Class({
    extends: cc.Component,

    properties: {
    },
    
    onLoad () {
        // 调用递归函数
        // 参数给了5
        this.diguiFun(5);
    },

    diguiFun(max) {
        // 如果这个数到了0   我们退出递归
        if (max <= 0) {
            return;
        }
        else {
            // 打印一下值便于观察
            console.log(max)
            // 再次调用  参数减去1
            this.diguiFun(max - 1);
        }
    },

});

注意:

其中的max - 1 传递参数是很重要的,这样它才可以减去1,不然会死循环。

我们看看结果:

从5到1;

我们把函数升级一下,从几到几。

cc.Class({
    extends: cc.Component,

    properties: {
    },
    
    onLoad () {
        // 调用递归函数
        // 从2 到 5
        this.diguiFun(2 , 5);
    },

    diguiFun(min , max) {
        // 如果这个数到了max   我们退出递归
        if (min == max) {
            return;
        }
        else {
            // 打印一下值便于观察
            console.log(max)
            // 再次调用  参数减去1
            this.diguiFun(min , max - 1);
        }
    },

});

怎么样,这样就可以实现从几到几的控制:

如果从小往大加呢??

很简单,吧max不变加min就行:

我们看一下min

好了,有点小伙伴可能会问:这跟动作系统有啥关系?

嘿嘿,因为动作里可以有回调函数呀!

我贴出代码,你理解一下:

cc.Class({
    extends: cc.Component,

    properties: {
    },
    
    onLoad () {   
        // 定义一个数组    
        this.map = [];
        // 给上5个点
        this.map[0] = cc.v2(0,0);
        this.map[1] = cc.v2(-100,200);
        this.map[2] = cc.v2(200,0);
        this.map[3] = cc.v2(-300,-100);
        this.map[4] = cc.v2(20,200);
        // 从0 走到 4 ,在递归函数中判断退出那里加上1就可以改成到5
        this.diguiFun(0 , 5);
    },

    diguiFun(min , max) {
        // 如果这个数到了max   我们退出递归
        // 如果改成max + 1     就匹配了
        if (min == max) {
            return;
        }
        else {
            var call = cc.callFunc(function(){
                // 回调函数是再次递归
                this.diguiFun(min + 1 , max);
            },this);
            // 运行一个动作,然后call
            // this.map中已经存放了坐标点
            var act = cc.sequence(cc.moveTo(1,this.map[min]),call);
            this.node.runAction(act);
        }
    },

});

跟着注释理解一下,是不是不难。

看看效果:

嗯,zhujue在一个点一个点的走!

O(∩_∩)O~~

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
回答: 在Cocos Creator中,常用的设计模式包括子弹工厂模式、单例模式和建造者模式。子弹工厂模式是通过工厂来创建子弹节点,根据提供的子弹种类、速度和方向来自动创建子弹节点并返回,实现了代码的精简和灵活性。\[1\]单例模式用于创建一个全局唯一的实例,可以在整个应用程序中共享和访问该实例,避免了多次实例化的问题。\[2\]建造者模式用于创建复杂的对象,通过将对象的构建过程分解为多个步骤,使得对象的构建更加灵活和可扩展。\[3\]这些设计模式在Cocos Creator中可以帮助开发者更好地组织和管理代码,提高开发效率和代码质量。 #### 引用[.reference_title] - *1* [CocosCreator进阶实战第四部分:工厂模式](https://blog.csdn.net/kuokuo666/article/details/103722679)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [设计模式---创建型模式(工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式)](https://blog.csdn.net/sinat_36499762/article/details/115624011)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KUOKUO众享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值