增加音乐和音效

其实原理差不多,之前学习制作金币的时候当时是添加过音效的,不过当时用的是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()
# ...

最终效果

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

第八课