启用Use Custom User Dir
,游戏运行时产生的用户持久化数据将会存放在这个目录下
有人可能好奇,这个Use Custom User Dir
目录在哪里?顺便介绍Godot一个贴心的小设计,在项目>打开项目数据文件夹
就可以直接打开了,省得你还要自己创建快捷方式,赞一个!
在Windows下实际上就是"用户名/AppData/Roaming/应用名"
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():
var record = FileHelper.read("user://record.res",0)
if score > record:
record = score
FileHelper.save("user://record.res",score)
return record
加密版
#GameData.gd
extends Node
var score = 0
func update_record():
var record = FileHelper.read_encrypted("user://record.res",OS.get_unique_id(),0)
if score > record:
record = score
FileHelper.save_encrypted("user://record.res",score,OS.get_unique_id())
return record
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()
就可以触发更新历史记录了,但是游戏结束的一些收尾工作我们还没有完成,所以这件事暂时先放一放。