文章目录
前言:
本节博客的内容,在语法中将会分析Godot中的Connect,if,find_node,AudioStreamPlayer,get_tree(),Scene Tree与call_group()
具体参考资料:
来自开发游戏的老王的Godot教程【手把手带你Godot游戏开发】FlappyBird:7 心里有数(计分系统)
重温经典FlappyBird
总代码块实现功能:
主要功能是:鸟儿在穿过随机生成的水管之后,才能获得相对应的获得得分,并伴随着得分音效。
其判断依据是:鸟儿是否穿过得分区域。
注://其脚本内容附在得分区域上
总代码块
#ScoreArea.gd
extends Area2D
func _ready():
connect("body_exited",self,"_on_body_exited")
func _on_body_exited(_body):
if _body.name == "Bird":
AudioManager.play("sfx_point")
GameData.score += 1
#加分以后通过SceenTree把新的分数更新给所有想接受这个消息的节点
get_tree().call_group("SCORE","on_score_updated",GameData.score)
Connect
Connect的用法和理解,在之前博主的博客中有过详细讲解,这里就不细讲解对应解法。
在此函数代码块中,便是通过Connect函数将body_exited的信号连到_on_body_exited。
在发出信号之后,调用func _on_body_exited(_body):
if 用法
在这里呢,有过一定编程经验的人,会对if语句有着了解。
那么在Godot中如何使用呢?
1.官方解释
在Godot的官网中,其实并没有过多篇幅详细去介绍其使用以及讲解。
2.C语言中的if用法
我们将C语言在if语句中的使用进行讲解。
因其类似于Godot语言在if语句的使用,我们进行拆分说明。
(1).简单if语句
if(表达式)
{
执行代码块;
}
其执行顺序便是:如果表达式的值为真,则执行其后的代码块内容,否则不执行该代码块。
(2).简单if-else语句
if(表达式)
{
执行代码块1;
}
else
{
执行代码块2;
}
执行顺序是: 如果表达式的值为真,则执行代码块1,否则执行代码块2。
(3).简单if-elseif-else语句
if(表达式1)
{
执行代码块1;
}
else if(表达式2)
{
执行代码块2;
}
else
{
执行代码块3;
}
执行顺序是:
如果表达式1的值为真,则执行代码块1;
若表达式1为假,则执行表达式2;
如果表达式2的值为真,则执行代码块2;
若表达式2为假,则执行表达式3。
3.Godot中的if用法
if [expression]:
statement(s)
elif [expression]:
statement(s)
else:
statement(s)
(1).逻辑顺序
那么它的逻辑顺序,就类似于C语言的逻辑顺序。
从第一个if表达式开始,判断对应表达式的真假,一直到elif语句。
若哪句表达式为真,便执行对应的statement。
若前两个均为假的,就执行最后一个else的statement。
(2).表达方式
那么它的表达方式,仍于C语言有着区别。
if语句的表达式可不用写括号。
例:if 1 + 1 == 2:
if语句的表达式结尾需要以冒号结尾。
例:if [expression]:
短语句可以写在与条件相同的行上:
例:if 1 + 1 == 2: return 2 + 2
可以通过嵌套三元 if 表达式来处理的超过两种可能性的情况。
嵌套时,推荐把三元 if 表达式拆分到多行以保持可读性:
例:
var fruit = (
"apple" if count == 2
else "pear" if count == 1
else "banana" if count == 0
else "orange"
)
代码if含义
func _on_body_exited(_body):
if _body.name == "Bird":
AudioManager.play("sfx_point")
GameData.score += 1
#加分以后通过SceenTree把新的分数更新给所有想接受这个消息的节点
get_tree().call_group("SCORE","on_score_updated",GameData.score)
在这里便是 if语句首先判断表达式_body.name == "Bird":
是否为真。
若为真,便在之后执行。
AudioManager.play("sfx_point")
GameData.score += 1
#加分以后通过SceenTree把新的分数更新给所有想接受这个消息的节点
get_tree().call_group("SCORE","on_score_updated",GameData.score)
若为假,则不执行以上代码内容。
代码题外话
_body.name == "Bird":
“==”:
1.关系运算符
2.判断是否相等
这里便是判断经过得分区域的是否是小鸟"bird";
若是小鸟"bird",才执行之后的得分加分。
调用代码块(一) — 游戏配乐
if语句为真之后执行:
AudioManager.play("sfx_point")
这里就便调用AudioManager脚本中的play函数()
extends Node
func play(name : String):
var sfx = find_node(name)
if sfx is AudioStreamPlayer:
sfx.play()
find_node
官网用法
它往往在实例化场景中用的较多
可对应名字去查找对应的节点
也可对应寻找它的子节点和父辈节点。
、
在这里的用法,便是用find_node(name)赋值给一个变量sfx。
可在后面利用if语句进行判断,便于在对应情况去可放对应的音效。
AudioStreamPlayer
官方解释
其对应意思:在这里便是非定位的播放音频
if sfx is AudioStreamPlayer:
该功能:通过if语句判断,sfx的节点是音频,便执行sfx.play()
,将播放该音频。
代码块含义
extends Node
func play(name : String):
var sfx = find_node(name)
if sfx is AudioStreamPlayer:
sfx.play()
这里便是去寻找对应输入的名字,去寻找对应其播放器进行播放。
AudioManager.play("sfx_point")
总代码块中,便是去通过调用AudioManager.play
去执行以上内容,为去寻找对应的sfx_point的音效。若音效文件中,并没有该名称的音效,就不执行其语句。
调用代码块(二) —游戏得分更新
#GameData.gd
extends Node
var score = 0
func update_record():
if score > load_record():
FileHelper.save("user://record.res",score)
func load_record():
return FileHelper.read("user://record.res",0)
代码块含义
因此内容,之后会打算进行细分析。
这里就先只说明,其功能是更新数据。
GameData.score += 1
:它对应的数据+1
get_tree()
官方解释
其该用途便是返回该节点。
在官网中,对该函数就便有27条搜索记录,也可看出它的应用性广和重要性啦。
但我们会发现上上图中,有一个Scene Tree。
那么它是什么呢。
Scene Tree
官方解释
该类是管理着场景中节点的层次结构,可以对整个场景进行暂停,加载,切换等等操作,起着十分重要的作用。而且也掌控着游戏循环的操作。
与get_tree() 的关系
在众多解释中,博主找到使用 InputEvent这一概念
它简化来说,就是去寻找对应位置找到某事件的开始,从而完成某一事件的循环。与我们之前所讲的Timer节点不同,它只是针对该节点的循环,可以通过Scene Tree对某个场景执行或者事件进行循环。
这里便是对它的工作原理进行讲解。
这里就又回到刚开始去讲解get_Tree()的概念。
正是通过get_tree()这个函数,才能执行跳转到任某一节点的SceneTree进行跳转。
call_group()
官方解释
对于博主的理解来说
call_group的用法,便是通过括号里的group调用给method。也就是我们最初在学习编程语言的函数调用的理解。将我们的节点信息进行回调,从而得到循环的效果。
实际应用
在官网中的第一个2D游戏制作中,便应用了这段代码内容
就算通过回溯调用,进行执行函数操作。
所以在flappy bird中的实际中,即也是这样的理解。
欢迎各位批评指正!!!
那么,再次感谢开发游戏的老王的Godot教程【手把手带你Godot游戏开发 第一弹】零基础入门案例:FlappyBird(教程目录及源代码)