- 出道即巅峰,先做个盈利千万的小项目
- 新建 Godot 项目
- Godot 界面介绍
- FlappyBird:1.Hello World
- FlappyBird:2.坠落吧,小鸟
- FlappyBird:3.在哪坠落就在哪飞起来
- FlappyBird:4. 无限地面
- FlappyBird:4.1 无限地面之 Godot 青年 (AnimationPlayer) 版
- FlappyBird:4.2 无限地面之普通青年版
- FlappyBird:4.3 无限地面之文艺青年(shader) 版
- FlappyBird:5.1 无尽水管子滚滚来(一)
- Godot Engine:5 种碰撞体以及 RigidBody 的 4 种模式
- Godot Engine:碰撞和碰撞检测的简单实例(RigidBody2D 与 Area2D 碰撞)
- Godot Engine:碰撞和碰撞检测的简单实例(RigidBody2D 与 StaticBody2D 碰撞)
- FlappyBird:5.2 无尽水管子滚滚来(二)
- Godot Engine:Timer 节点使用范例
- FlappyBird:6 来点 MUSIC(音效系统)
- Godot Engine:用自动加载(AutoLoad) 实现单例模式(Singleton Pattern)
- FlappyBird:7 心里有数(计分系统)
- Godot Engine:本地数据存取的帮助类(加密/非加密)
- FlappyBird:8 让数据说话(显示分数)
- Godot Engine:如何使用外部字体和 Label 节点制作一个计时器
- FlappyBird:9.1 天下没有不 OVER 的 GAME(上)
- Godot Engine:两行代码实现观察者模式(Observer Pattern),就问你服不服?
- FlappyBird:9.2 天下没有不 OVER 的 GAME(下)
- FlappyBird:10 大不了从头再来(新局启动)
- Godot Engine:用 Call Method Track(方法回调轨道)实现动画回调
- FlappyBird:11 番外篇:罗永浩都抖音了,要不咱们也抖一抖?(屏幕震动)
- Godot Engine:屏幕振动效果的实现
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
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 要灵活很多!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论