通过制作2D平台游戏来学习Godot 4-第9部分: 加农炮处理程序
在前面的部分中,我们创建了大炮 (炸弹产生者) 和炸弹。现在是时候创建我们的大炮处理程序了,这是一只傲慢的绿猪,他会向我们大喊随机的语音气泡并 “点燃” 大炮。这个大炮处理程序在我们的游戏中没有特殊的目的,除了给我们的玩家一个不喜欢的人 (比如来自donkey Kong的驴)。我们的游戏可以在没有这个处理器的情况下完美地工作,但是如果大炮自己发射了,那会有什么乐趣呢?
你将在这部分学到什么:
如何使用RandomNumberGenerator方法。
如何更改计时器wait_time。
让我们创建一个Node2D节点作为其根节点的新场景。将此节点重命名为 “CannonHandler”,并将场景保存在Scenes文件夹下。
现在在这个场景中,我们希望CannonHandler有两个AnimatedSprite2D节点。第一个AnimatedSprite2D将作为车身对于我们的猪,第二个AnimatedSprite2D将作为语音气泡为了我们的猪。
将它们重命名为 “Body” 和 “SpeechBubble”。
我们还需要在我们的场景中添加一个计时器节点,这将在计时器超时后随机化我们返回的语音气泡动画。我们将通过随机化计时器的wait_time,这是从x倒计时到0所需的时间 (以秒为单位)。简单地说,每x秒我们的计时器将超时 (),并返回一个新的语音气泡!
我们希望这个计时器在游戏开始后立即开始随机化我们的语音气泡,因此请在检查器面板中启用Autostart属性。
选择你的身体节点,并添加两个新的动画: “空闲” 和 “匹配”。
为你的慢车动画,导航到 “res:// 资产/国王和猪/精灵/07-猪与匹配/匹配 (26x18 ).png”,并裁剪出所有三个动画帧。将循环值保留为启用,并将其FPS值更改为3。
为你的匹配动画,导航到 “res:// Assets/Kings and Pigs/Sprites/07-Pig与匹配/照明匹配 (26x18 ).png”,并裁剪出所有三个动画帧。关闭循环值并将其FPS值更改为3。
在您的检查面板中,还可以在偏移选项下方启用 “翻转H” 属性-因为我们希望我们的猪也向左转向我们的大炮。
选择您的SpeechBubble节点并向其中添加三个新动画: “boom”,“loser” 和 “sawaring”。
为你的动臂动画,导航到 “res:// Assets/Kings and Pigs/Sprites/13-对话框/Boom In (24x8 ).png” 并裁剪所有三个动画帧。关闭循环值并将其FPS值更改为3。
为你的失败者动画,导航到 “res:// 资产/国王和猪/精灵/13-对话框/失败者在 (24x8 ).png” 和裁剪出所有三个动画帧。关闭循环值并将其FPS值更改为3。
为你的宣誓动画,导航到 “res:// Assets/Kings and Pigs/Sprites/13-对话框/WTF In (24x8 ).png” 并裁剪出所有三个动画帧。关闭循环值并将其FPS值更改为3。
现在,将新脚本附加到CannonHandler场景根目录,并将其保存在脚本文件夹下。
此外,连接您的计时器节点的超时 ()信号到你的脚本。
由于我们的大炮会在游戏一开始就发射炸弹,我们需要我们的大炮处理程序的第一个动画是我们的匹配动画-因为一旦游戏开始产生炸弹,猪就会点燃大炮。我们将在我们的设置这个动画就绪 ()功能。
### CannonHandler.gd
extends Node2D
#when it's loaded into the scene
func _ready():
#play cannon lighting animation on start
$Body.play("matching")
接下来,我们希望我们的慢车动画播放,如果我们的炸弹是移动的-我们也希望我们的猪向我们喊随机的东西。我们可以通过运行一个条件来实现这一点,看看我们的全局is_bomb_moving变量设置为true,如果它返回为true,我们将使我们的SpeechBubble节点可见 (以显示我们的语音气泡)。我们将在内置的正在处理 ()功能,它将检查我们的炸弹在每一帧的运动状态。这将允许我们运行每帧更新一个节点的代码,从而尽可能频繁地更新我们的大炮处理程序的操作。
### CannonHandler.gd
#older code
func _process(delta):
#idle animation
if Global.is_bomb_moving == true:
$Body.play("idle")
#show speech bubble
$SpeechBubble.visible = true
我们希望我们的匹配动画播放,如果我们的炸弹不动,因为这意味着我们的炸弹正在产生。我们希望我们的猪停止对我们大喊大叫,而是匹配大炮。我们可以通过运行一个条件来实现这一点,看看我们的全局is_bomb_moving变量设置为false,如果为true,我们将使SpeechBubble节点不可见。
### CannonHandler.gd
#older code
func _process(delta):
#idle animation
if Global.is_bomb_moving == true:
$Body.play("idle")
#show speech bubble
$SpeechBubble.visible = true
#matching animation
if Global.is_bomb_moving == false:
$Body.play("matching")
#hide speech bubble
$SpeechBubble.visible = false
我们需要播放我们为SpeechBubble节点设置的动画,当它变得可见时。我们将通过随机化我们的语音值来实现这一点兰迪 ()方法,该方法将生成一个随机整数。然后,这个随机整数将除以我们的SpeechBubble节点的动画数量 (在我们的例子中是3)。这意味着结果只能是0、1或2-我们可以使用这些值根据此返回值随机播放动画。
### CannonHandler.gd
#older code
func _on_timer_timeout():
#randomizes speech
var random_speech = randi() % 3 #will return 0, 2, or 2
match random_speech:
0:
$SpeechBubble.play("boom")
1:
$SpeechBubble.play("loser")
2:
$SpeechBubble.play("swearing")
最后,我们将需要随机化wait_time为我们的定时器的超时 ()。这将确保我们的语音气泡在随机的时间量后再生,而不是每x设置秒。我们将通过randi_range()方法,这将允许我们生成一个介于从和到 (包括) 之间的伪随机32位有符号整数。我们将在1到10的任何一秒钟后随机化我们的语音气泡。
### CannonHandler.gd
#older code
func _process(delta):
#randomizes speech bubble randomize time
$Timer.wait_time = randi_range(1, 10)
#idle animation
if Global.is_bomb_moving == true:
$Body.play("idle")
#show speech bubble
$SpeechBubble.visible = true
#matching animation
if Global.is_bomb_moving == false:
$Body.play("matching")
#hide speech bubble
$SpeechBubble.visible = false
您的代码应该看起来像这个。
现在,让我们把身体节点调整得更大一点。将其Transform选项下的Scale属性更改为诸如 “1.5” 之类的值。你可以改变这个值,让你的猪像你想要的那样大或小。
然后改变你的SpeechBubble节点也有点大。将其Transform选项下的Scale属性更改为诸如 “2.5” 之类的值。我们还想把这个演讲泡泡移到猪头上。
保存场景,并在BombSpawner场景中实例化它。我们想把猪移到大炮前面。
现在,如果你运行你的主场景,你的大炮处理程序应该 “匹配” 大炮产生炸弹,以及改变它的语音每x随机秒。
祝贺你创建你的大炮处理程序!我们游戏中的这种变化可能纯粹是视觉上的,但它确实为我们的加农炮产卵器增加了一些生命。在下一部分中,我们将看看在游戏中添加相机。
现在是保存项目并备份项目的好时机,以便在发生任何破坏游戏的错误时可以恢复到此部分。在你继续这个系列之前,回去复习一下你学过的东西,一旦你准备好了,下一部分见!