鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[扩展阅读] 游戏中的角色移动:闭包(closure)在实际开发中的作用

    [复制链接]
发表于 2020-10-19 10:15:02 | 显示全部楼层
准备学了20讲回来再看看,也是不太明白move那里怎么带的参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-26 21:00:10 | 显示全部楼层
concrete 发表于 2016-5-17 09:56
nonlocal 将 pos_x和pos_y声明为全局变量,(全局变量越少越好,必要的全局变量放在最开始,如legal_x和l ...

我的理解是通过Move = creat( ),这样变量赋值,creat()函数就多了一个move标签,函数就不会被释放,所以函数的变量就会永远保存,起到了全局变量的作用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-26 21:01:30 | 显示全部楼层
拂袖明灯 发表于 2016-10-3 09:00
为什么我就直接复制过去运行还会报错啊
SyntaxError: multiple statements found while compiling a singl ...

直接复制会有换行错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-26 21:26:15 | 显示全部楼层
我的理解:在这个例子中,我们始终需要在内存中保存一个最新的位置坐标,但有不希望以全局变量的形式存在。所以就在一个函数内在构造一个内函数,这样外函数的变量就起到了全局变量的作用。内函数完成坐标更新的功能。更新后的结果以外函数的“全局变量”,永久保存在内存中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-26 21:39:12 | 显示全部楼层
28行:return moving
我理解是:返回了一个函数的地址,这样才有机会把内函数的参数传递进去。如果是return moving(),那返回的就是内函数的返回值了,也就是没有入口把内函数的参数传递进去了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 16:18:21 | 显示全部楼层
这个判断是否超出边界是不是得用循环体哇?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 13:19:05 | 显示全部楼层
不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-20 19:32:21 | 显示全部楼层
学到了学到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-4 08:51:05 | 显示全部楼层
求素材
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-5 10:40:49 | 显示全部楼层
想着未来可以做成这样的效果,这也很厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-14 21:28:33 From FishC Mobile | 显示全部楼层
回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-2 12:09:44 From FishC Mobile | 显示全部楼层
请问为什么是 return moving?而不是 return moving()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-5 16:05:11 From FishC Mobile | 显示全部楼层
看不懂的伙伴们可以把它形象成一个类,只不过比类占有了更少的空间,没有了复杂的魔方方法,每定义一次就相当于实例化一个类,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-14 22:32:57 | 显示全部楼层
完全看不懂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-20 17:28:59 | 显示全部楼层
小甲鱼没玩过贪吃蛇吗?应该从一边穿出边界,从另一边(对称点)穿进边界,而不是从0坐标穿进去,也有可能是小甲鱼马虎了。
把减数和被减数搞反了,修改下:
# 检查移动后是否超出x轴边界
        if new_x < legal_x[0]:
            pos_x = (new_x - legal_x[0]) - legal_x[0]
        elif new_x > legal_x[1]:
            pos_x = (new_x - legal_x[1]) - legal_x[1]
        else:            
            pos_x = new_x

pos_y也要这么修改,过程略

但你确定这种实现方式严谨吗,如果游戏人物出现了闪现技能,闪出地图边界永远就回不来了(如果闪现超过200距离)。我认为正确的算法应该是利用取余,-100到100定义为主值区间,超越主值区间的应该折算到主值区间中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-20 17:32:20 | 显示全部楼层
siven-siven 发表于 2020-10-26 21:26
我的理解:在这个例子中,我们始终需要在内存中保存一个最新的位置坐标,但有不希望以全局变量的形式存在。 ...

不能说是永久,不是无懈可击的,你的程序中不能出现第二次   
move = create()
否则角色位置就会被初始化了,这是从外部改变内部的最简单的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-26 21:45:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-6 18:51:13 | 显示全部楼层
good
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-14 20:23:41 | 显示全部楼层
原来学了还以为闭包只是一个数据操作机制,没什么用。从这个例子清晰地看到它可以有效的保护变量,防止滥用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 00:09:57 | 显示全部楼层
移动距离超过301就有逻辑错误了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 21:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表