Godot 游戏引擎学习 第八课

Godot 游戏引擎学习 第八课

December 26, 2020

增加音乐和音效

其实原理差不多,之前学习制作金币的时候当时是添加过音效的,不过当时用的是 AnimationPlayer 来实现,通过方法轨道调用 AudioStreamPlayerplay 方法来播放音乐。

我刚开始的时候准备不去跟着 UP 的视频,自己动手来做的。但是自己脑抽了折腾了好久不弄不成功,而且最后莫名奇妙的发现游戏里 Slime 不见了...,音乐也没播放成功

我起码检查了二十分钟发现原来是当时我写 Slime 的动画的时候头来的 walk 状态没给 export 属性赋值,导致动画自动播放后这些属性直接变为死亡后的状态了,恰好里面更改过 Visible 属性,导致精灵直接消失不见了。

不过后来思路理清楚了倒是很快就做了,这里就不细说了,都是之前的东西。

另外还增加了场景 BGM 后因为角色死了我们调用了场景重置函数,所以这里 UP 说了一个场景树的概念,我们的主场景为 Wolrd, 只要一重置整个场景树就会恢复成初始化状态,如果想要实现 BGM 在角色死掉的时候不断掉就要重新添加一个额外的和 World 同级的节点。

这里就要用到项目 > 项目设置 > 自动加载这个功能,就是把一个场景单独加载成一个和主场景同级的节点。这样我们重置主场景就不会影响到这个节点了。

image-20201226221022077

增加音量开关

然后增加了一个音量、音效的开关实现,音量应该也是同理的。

我们可以在编辑器下方开到一个音频标签,这里面就是我们管理所有游戏声音的地方,点开后可以看到只有一个默认的 Master 总线,所有的总线通过合成后都会通过 Master 播放出来。

在 AudioStreamPlayer 的属性面板通过更改 Bus 即可更改音频通过那个总线播放。

所以我们增加一个 BGM 的总线,一个 SFX 的总线,然后通过代码监听按键来控制开关即可。

image-20201226221609991

代码部分:

extends Node

func _input(event):
    var sfx_id = 2

    if event.is_action_pressed("ui_cancel"):
        AudioServer.set_bus_mute(sfx_id, !AudioServer.is_bus_mute(sfx_id))

角色死亡动画

添加方式其实和怪物的一样,都是通过 AnimationPlayer 来调用音频播放即可。这里修改了一点角色死亡的判断逻辑,代码如下:

# ...
func _on_Hurtbox_hurt():

	velocity.y = -jump_force
	animation_palyer.play("death")
	yield(animation_palyer, "animation_finished")
	get_tree().reload_current_scene()
# ...
    
# ...
# 每一帧都会执行这个函数
func _process(delta):
	# 跳跃
	velocity.y += gravity * delta

	if is_dead:
		return
# ...

转场动画

UP 这节课讲的是利用 ColorRectAnimationPlayer 做的一个简单的渐变转场,因为转场是全局的所以我们添加在之前增加的 Globals 场景上面。

节点结构和动画设置如下如下:

image-20201226232115641

在编写一个场景 reload 函数方便调用:

# ...
func reload_world():
    # 死亡的时候让动画倒叙播放
    animation_player.play_backwards("fadein")
    # 等待动画播放完毕
    yield(animation_player, "animation_finished")
    # 重置场景
    get_tree().reload_current_scene()
    # 动画正序播放
    animation_player.play("fadein")
# ...

# ...
# 角色受到伤害
func _on_Hurtbox_hurt():
	# 往上蹦跶一下,然后播放死亡动画
	velocity.y = -jump_force
	animation_palyer.play("death")
	# 等待动画播放完毕
	# 外部加载的场景都可以通过名称直接调用,调用写好的函数重置场景
	Globals.reload_world()
# ...

最终效果

像模像样了,明天就是最后一颗,这个教程还在更新,作者说准备这周不出新教程,鸽一周。我准备尝试着自己写两个关卡实现机关之类的功能。

第八课

加入评论