返回介绍

FlappyBird:7 心里有数(计分系统)

发布于 2025-04-26 18:34:24 字数 3495 浏览 0 评论 0 收藏

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。