【手把手带你Godot游戏开发】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()就可以触发更新历史记录了,但是游戏结束的一些收尾工作我们还没有完成,所以这件事暂时先放一放。

在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页