浅谈代码 (二)

20020202 学生2020 2022-03-18 16:49:35
加精

这次的代码内容是来自 开发游戏的老王的Godot教程中5.2 无尽水管子滚滚来(二) 摆一下连接
https://orzgame.blog.csdn.net/article/details/104919515

对应博客的内容:https://blog.csdn.net/qq_56540563/article/details/123613075

该帖子我们来浅谈一下水管的脚本代码

先摆代码

#Pipe.gd
extends Node2D

func _ready():
    position.y += randf()*300-150 #Y轴随机偏移量的范围(-150,150)

func _process(delta):
    position += Vector2.LEFT*200.0*delta
    if position.x < 0:
        queue_free()

继续采取分段的方法,来解释代码对应意思
—————————————————————————————————————————————————————

extends Node2D

大家看到这里可能会说,诶,你摆这个代码,讲一些什么呢。

这里呢,便要着重强调这个extends的作用其对应的内容。

img

其实它就是官方解释的一样,它是继承某一个脚本,某一个节点的性质等等。这里就不详细说了。
例如在上一篇帖子中,讲到Timer节点中的脚本讲解中,它便是继承了Timer节点的timeout的信号。

img


这便是extends的作用及其相对应的内容。

那么回归本节代码内容,它其实就是简单的继承了Node2D节点中的性质。

—————————————————————————————————————————————————————————————————

摆下一个要讲的代码块


func _ready():
    position.y += randf()*300-150 #Y轴随机偏移量的范围(-150,150)

那么接下来,我就要讲一个不同于C语言函数的内容,就是出现的各种不同的函数形式。在之后接下来的专栏代码讲解中,遇到关键的地方会着重去讲解一下。

_ready()函数:

img


它便是在就绪后首先执行的函数,最先执行程序的指令。

ready用中文解释就是准备的意思,就跟平时我们做任意一件事情前,要有个准备阶段,再去进行实施阶段。那么_ready函数也是同样的作用,它便是准备阶段。

但是这里需要注意的是,_ready() 对于每个节点只能调用一次,不会再被调用第二次。

这也可同等类比于现实生活中,对于准备这个概念的衡量。
当然,若你非常需要再执行一次ready()函数,便可通过请求再次调用request_ready()来绕过,它可以在再次添加节点之前的任何地方调用。


randf()函数:

在C语言中,可利用了rand()函数可以生成随机数,其作用是获取一定范围内的一个随机数
在python语言中,可利用random()函数可以生成随机浮点数,其作用可返回0<=n<1之间的随机实数n。
randf()函数在Godot中的作用使用,更类似于python语言对应的理解使用。

randf()它的作用便是随机在区间 [0, 1] 上出现一个随机的浮点数


position

它的具体使用就不详细说明,它其实就是默认Vector2( 0, 0 )。Vector的使用方法,会在下一个函数结合去进行讲述。



func _ready():
    position.y += randf()*300-150 #Y轴随机偏移量的范围(-150,150)

这段代码的具体意义,就是调整水管对应的Y轴随机偏移这种情况,使得游戏的水管随机出现上下波动的情况。

—————————————————————————————————————————————————————————————————

摆下一个要讲的代码块

func _process(delta):
    position += Vector2.LEFT*200.0*delta
    if position.x<-900:
        queue_free()

func _process(delta):

_process()函数

processd对应的中文解释是进程的意思,就相当于在游戏中,计算机要处理对应的该函数的指令,执行游戏进程中的一些指令。
在官方的解释中,它对应的作用,便是在主循环的处理步骤中被调用。处理发生在每一帧,并且尽可能快。

img


这便是process()函数的作用。

那在实际实现水管出现中,由于我们制作的小鸟是始终没有发生着移动。但水管会随着时间和脚本的指令,重复并且向左移动,让小鸟跳过设置的水管障碍,从而完成得分。

使用该函数在此代码块中,是因为此处是需要执行水管均往左方向进行移动,并且是发生在游戏进程中。则处理指令需要快速迅速,这便符合它本身的作用了。

这便是process()函数为何在此处应用的原理了。

img

这里值得注意的是,process()里面有一个delta。
delta是以秒未单位。此处的意思便是该函数按秒进行处理。

    position += Vector2.LEFT*200.0*delta

Vector2
Vector对应的中文解释是向量的意思,由于我们这里所做的是2D游戏,其实就相当于我们在平面直角坐标系中对应的位置。

那么我们来看一下官方给的解释:

img


在这里大家可以注意到,是存在Vector2,它是包含x,y字段的。

那存在不存在Vector3呢?

img


答案是存在的,Vector3,它是包含x,y,z字段的,它其实运用范围较广的是3D游戏,因2D不存在第三维度的情况。

表层的意思就是这些啦。其实它也存在于其他多种函数的情况。若有感兴趣的,可以自己搜一搜相关的信息资料。


LEFT

LEFT 这里就不占太大篇幅进行描述了,它主要是左单位向量,表示左的方向。其英文意思与实际应用是一样的。


    position += Vector2.LEFT*200.0*delta

这里便是指的是其对应位置,要往左移动200每秒。(delta在前文有着介绍,不加赘述)

—————————————————————————————————————————————————————————————————

if position.x<-900:
        queue_free()

queue_free()

立马提到queue_free(),大家是不是十分陌生,但free()是不是大家仍很熟悉这个表达方式。

它便在计算机专业课的数据结构课程中,讲解过单链表的节点释放中有过其对应作用,上图:

img


在Godot中的queue_free()与类C语言中的free()的作用是差不多。

那么摆一下在官网中的详细解释

img


这便是在Godot中的定义。


其作用便是在实际的游戏设计中,排队释放删除节点。

这里需要注意,是排队!!!因为是queue,其对应的英文解释是排队的意思。


if position.x<-900:
        queue_free()

那么这段代码的意思,便是位置小于-900的时候,便会释放节点。

这里大家会注意到,我的代码中是位置小于-900,不同于 开发游戏的老王 的小于0。

这是为什么呢,我会单独出一个帖子进行讲解。

这里不便给大家赘述。

—————————————————————————————————————————————————————

#Pipe.gd
extends Node2D

func _ready():
    position.y += randf()*300-150 #Y轴随机偏移量的范围(-150,150)

func _process(delta):
    position += Vector2.LEFT*200.0*delta
    if position.x < 0:
        queue_free()

今天所分析的代码,其在此设计游戏中的作用,便是让水管随机按照一定时间出现,并在移动到一定位置销毁的操作。

—————————————————————————————————————————————————————
好了,这周的更新就画一个句号了。

欢迎各位批评指正。

有需要讨论的地方,可以在我的评论区进行探讨。

(此帖子是更新以来最多内容的一次,之后会进行调整内容的分布,这次也请各位谅解。)

在此感谢,开发游戏的老王 的Godot教程。

...全文
124 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

非常感谢!仿佛看到了一位C站老博主!

20020202 学生2020 2022-03-18
  • 举报
回复
@开发游戏的老王 感谢老师的夸奖,我会多学习总结,也多把学习到的内容进行理解和归纳。这段时间通过写帖子,学习了Markdown的使用。希望我能跟老师学习更多的专业知识和发布博客经验。♥️

137

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发教学区
开发语言 高校
社区管理员
  • 开发游戏的老王
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧