评论

收藏

一次调试经历

游戏开发 游戏开发 发布于:2021-07-18 09:49 | 阅读数:260 | 评论:0

最近在读《Godot Engine Game Development Projects Build five cross-platform 2D and 3D games with Godot 3.0》,到了第3章。这一章的游戏是一个2D游戏,玩家在一个地图里要躲避敌人,拿到钥匙打开红色大门,进入里面拿到星星,就算胜利。若被敌人触碰则失败。 跟着书里一步步做,一路磕磕碰碰的,总算是能运行了。也弄掉了不少bug,但有一个bug始终困扰着我。这个bug是这样的,玩家被敌人触碰就会终止游戏回到开始界面,但是每次被敌人触碰时,就直接报错。并指向下面代码的30行:
DSC0000.png

然后错误提示大意是说area的type是非法的。这个函数是用于检查玩家与场景中什么东西碰撞了,第1个if块是与敌人碰撞;第2个if块是与可以捡的物品(也就只有金币)碰撞;第3个if块是捡到了红色钥匙;第4个if块是拿到了星星。逻辑并不复杂,可是我明明是碰到敌人,为何会变成检测钥匙呢?这个type是用来标记物品类型的,与敌人无关。
查了很久,排查了很多方面,拼写错误、敌人没放进组里、资源命名错误……然而都一一排除了。
于是只能先给敌人加一个type属性吧,反正值不匹配就行了。运行后,居然正常了。于是我瞬间意识到一件事情:这个函数每次执行时其中的每个if语句都被执行了一遍,而不是执行一个if后会返回。为了验证猜测,直接全部打上断点(单步、跳出这两招鬼知道它会跳进多深的堆栈,与这次的目标不符),运行后,果然如猜测那样。
那么最后,只需要在第26行后面加上一条return语句就OK了。
反思,这语言的语法与Python极为相似,那么作为函数,必须有返回才结束。这个函数中明明没有显式的返回,为何一开始就没有注意到呢?估计是平时就从没注意到函数有个隐藏的return。

关注下面的标签,发现更多相似文章