找回密码
立即注册
搜索
发回帖 发新帖

5370

积分

0

好友

688

主题
发表于 半小时前 | 查看: 3| 回复: 0

上一篇小人总算会走了,不过有个毛病——它会穿墙。向左按十下,它就从画面左边溜出去,连声招呼都不打。

今天给它一张真正的地图,再教它一件事:有些地方,你去不了。

地图不用画,敲几行字就行

做推箱子,最省事的地图不是画出来的,是敲出来的。

一个字符串数组,每一行就对应地图的一行:# 是墙,. 是地板。改地图就是改这几行字,比在编辑器里一块块摆砖头快得多,改完直接跑,也不用等它导入。

画出来是这样:

字符串数组地图网格示意图,深色方块为墙

凑近看,就能对上号:

像素角色位于回字形地图左上角起点位置

深色实心方块就是 #,更暗的是 .。数组里写了什么,画面上就是什么,一个字符对应一格。

至于画线、画砖块纹理那些,留到后面做视觉打磨再说。现在先把「哪里走得动」这件事定死。

数组下标就是格子坐标

这句值得单独讲,因为我在这里卡过。

数组是一行一行存的,所以取一个格子要写成「第几行的第几列」—— y 在前,x 在后。你习惯的那个顺序在这里是反的。

我第一次就写反了,人物沿着对角线乱窜,还以为是输入映射配错。查了半天才发现是行列写反。这种错不会报错,它只会让你的人物走得非常诡异。

走之前,先问一句

核心就一个函数,问「这格是墙吗」。它前半段管边界,后半段管墙,两件事塞在一起,调用的时候根本不用分心。

这里有个我很喜欢的偷懒写法:走出数组范围,就当它是墙。

想想看,边界这东西,很多人会单独写一堆判断,散落在四个方向里,写四个漏一个。可边界说到底就是「地图外面那一圈不能走的地方」,跟墙是一回事。既然是一回事,就让它返回 true 好了,判定的地方一行都不用多写。

先算后判,别先走再退

这是今天最容易写错的地方。

好多人(包括当年的我)会这么写:先往前走一步,撞了墙再退回来。看着也没毛病对吧?能跑。

但它在给你埋雷。等你后面往格子里加箱子、加目标点,或者移动之后要播个动画、记一步撤销,「先走再退」就会变成「先改了三个地方,再挨个回滚三个地方」。漏一个,游戏状态就跟你的人物对不上。这种 bug 最难查,因为它只在特定顺序的操作下才冒出来。

正确做法是先把想去的地方算出来,问完再决定动不动。算出目标格,问一句「能进吗」,不能进就直接结束,什么都没发生过。干净,而且将来加什么逻辑都不用动这段判定。

跑起来,撞一下试试

我把人物放在 cell (1,1),就是左上角那条走廊,头顶上那格是墙。

按三次 W:

按W撞墙前后对比,小人位置不变

左边是按键之前,右边是连按 3 次 W 之后。两张图一模一样——我比对过,像素级别的相同。按了,没动,这就对了。

然后换右边,走廊是空的,按四次 D:

按四次D角色从cell(1,1)走到cell(5,1)

从 (1,1) 走到 (5,1),一格一格,不快不慢。

编辑器里选中 Player,位置也跟着走:

Godot 4.2.2编辑器界面,玩家节点变换坐标

两个小提醒

字符串取单个字符,记得用 substr 去截,别直接拿下标去和 # 比较。类型对不上会静默失败——Godot 不报错,它就一直返回 false,你就一直能穿墙。

还有,常量数组取出来的一行,赋值给变量时要写清楚它是字符串类型。不写的话 Godot 会甩你一个解析错误,说它推断不出类型。我第一次就被这个拦在门外。

最后

今天三句话:地图就是字符串数组,# 是墙 . 是地板;越界当墙,边界和判定合一;先算目标格再判定,不通过就结束,千万别先走再退。

现在小人撞墙知道停了,不过它还是个只会自己走的孤魂。下一篇教它推箱子——推得动和推不动,又是另一套判定。

下一篇见。

(配套工程在 GitHub 的 Boxman 仓库 tutorial 分支,每篇一个进度 tag,搜 seancheng33/Boxman 就能找到。)




上一篇:K8s 控制面 etcd 空间爆满:mvcc database space exceeded 导致 Pod 无法创建
下一篇:批判性思维正在被 AI 杀死?Anthropic 工程师给出的 6 个 Claude 使用建议
您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-11-13 20:37 , Processed in 0.061310 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

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