Godot Engine:两行代码实现观察者模式(Observer Pattern),就问你服不服?

本博客中的所有文章未经本人允许一律谢绝转载

上篇博文《Godot Engine:用自动加载(AutoLoad)实现单例模式(Singleton Pattern)》向各位展示了Godot用“自动加载”这种“非主流”的方式实现单例模式。今天咱们看一下Godot又可以使用哪些“旁门左道”帮我们实现另一种常用设计模式—观察者模式(Observer Pattern)

扫盲:什么是观察者模式?

23种经典设计模式之一,游戏开发最常用的设计模式之一,详情请见观察者模式的百度百科。CSDN上各色大佬提供了它的各种语言的实现,本人在此仅用八个字概括观察者模式的作用就是 :“消息分发,自由订阅”。 你品,你细品,是不是这个理儿?

用GDScript能实现么?这个可以有~

上文说了GDScript没有静态变量,因此它无法用传统方式实现单例模式。但是GDScript有很好用的数组,可以很方便的遍历,因此用GDScript按传统方法实现观察者模式毫无问题的;并且Godot还有非常好用的信号机制,通过信号来实现也是不错的选择。然而,这都不是今天的重点!

下面这个典型的观察者模式场景,用你最熟悉的语言或者游戏引擎来实现,最少需要多少行代码?

主角老王,释放了一个必杀,所有敌人都受到相应伤害

用Godot三行代码能实现?能!

下面是借助Godot的组(Group)实现的观察者模式:

敌人的代码:

#enemy.gd
func _ready():
	add_to_group("ENEMY") #第1行:把自己加入ENEMY组
func on_attacked(damage):#第2行:实现回调方法
	print("我受到老王" + str(damage) + "攻击力的大招!太强了!老王威武!")

注意: 当节点离开场景树,Godot会自动为它退出所有组,所以很多情况下,我们无须操心组的管理。

主角老王的代码:

#laowang.gd
func attack(damage : int):
	get_tree().call_group("ENEMY","on_attacked",damage)#第3行:通过场景树调用ENEMY的on_attacked方法

还能更少么?能!两行!

直接通过编辑器把敌人场景的根节点注册到"ENEMY"组,又省了一行代码!
在这里插入图片描述
Godot中的组可以通过编辑器静态创建也可以在运行时动态创建,并且一个节点可以加入若干个组,这一点比Unity
的Tag要灵活很多!

发布了386 篇原创文章 · 获赞 1308 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/hello_tute/article/details/105120001