- 出道即巅峰,先做个盈利千万的小项目
- 新建 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:屏幕振动效果的实现
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
FlappyBird:7 心里有数(计分系统)
1.启用 Use Custom User Dir
启用 Use Custom User Dir
,游戏运行时产生的用户持久化数据将会存放在这个目录下
有人可能好奇,这个 Use Custom User Dir
目录在哪里?顺便介绍 Godot 一个贴心的小设计,在 项目>打开项目数据文件夹
就可以直接打开了,省得你还要自己创建快捷方式,赞一个!
在 Windows 下实际上就是"用户名/AppData/Roaming/应用名"
2.创建脚本
文件存取工具类 FileHelper
FileHelper
是一个工具类,它包含 2 组(加密/非加密) 的文件存取方法。这个小游戏本身没是必要加密的,不过 Godot 的文件加密流程非常简单,在此也顺便展示一下。
注意: 为了使用方便, FileHelper
种 4 个方法全为静态方法,不需要挂到任何节点上,因此该类无须继承任何基类。
#FileHelper.gd
class_name FileHelper
#普通写入
static func save(path,data):
var file = File.new()
file.open(path,File.WRITE)
file.store_string(var2str(data))
file.close()
#普通读取
static func read(path,default_data):
var data = default_data
var file = File.new()
file.open(path,File.READ_WRITE)
var content :String = file.get_as_text()
if not content.empty():
data = str2var(content)
file.close()
return data
#加密写入
static func save_encrypted(path,data,key):
var file = File.new()
file.open_encrypted_with_pass(path,File.WRITE,key)
file.store_string(var2str(data))
file.close()
#加密读取
static func read_encrypted(path,key,default_data):
var data = default_data
var file = File.new()
file.open_encrypted_with_pass(path,File.READ_WRITE,key)
var content :String = file.get_as_text()
if not content.empty():
data = str2var(content)
file.close()
return data
游戏数据管理类 GameData 及单例化
下面是非加密/加密两个版本的 GameData
,任选其一即可。然后按照 《Godot Engine:用自动加载(AutoLoad) 实现单例模式(Singleton Pattern)》 一文中的方法将 GameData
单例化。
非加密版
#GameData.gd
extends Node
var score = 0
func update_record():
if score > load_record():
FileHelper.save("user://record.res",score)
func load_record():
return FileHelper.read("user://record.res",0)
加密版
#GameData.gd
extends Node
var score = 0
func update_record():
if score > load_record():
FileHelper.save_encrypted("user://record.res",score,OS.get_unique_id())
func load_record():
return FileHelper.read_encrypted("user://record.res",OS.get_unique_id(),0)
3.在游戏中触发加分
#ScoreArea.gd
extends Area2D
func _ready():
connect("body_exited",self,"_on_body_exited")
func _on_body_exited(_body):
if _body.name == "Bird":
AudioManager.play("sfx_point")
#print("得分!!!!")
GameData.score += 1
4.在游戏中触发更新历史记录
理论上讲,我们在触发死亡的代码部分插入 GameData.update_record()
就可以触发更新历史记录了,但是游戏结束的一些收尾工作我们还没有完成,所以这件事暂时先放一放。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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