主界面设计(下)

近期成果

厂里有些忙,不过我在空闲时间也在尽力赶进度了,近期内写的任务安排基本全部完成。

  • 写个解析CSV的脚本
  • 找个一键EXCEL转化为CSV的工具
  • 完成初步的EXCEL总表
  • 完成初步的语言国际化
  • 游戏状态栏改成手机的一行形式
  • 参考大项目的分类方式整理文件

接下来大致给大家简单介绍一下近期成果。

CSV解析器

首先是CSV解析脚本……我参考了视频Godot用表格的方式制作物品信息 - bilibili

不过视频中把类型和类名混在一起了,不太方便,也不直观,我改成了读取第二行作为数据类型的判断依据。并且我做的是文字游戏,用的图不多……目前暂时把图片解析的部分注释掉了,还有就是加上了一些必要的判断和操作,以免出错。

最后代码如下:

extends Object

func load_csv(csv_path: String):
	var file: FileAccess = FileAccess.open(csv_path, FileAccess.READ)
	var header: PackedStringArray = file.get_csv_line(",")
	var types: PackedStringArray = file.get_csv_line(",")
	var items = []
	
	if not file:
		print("%s 文件打开失败", csv_path)
		return
	
	while file.get_position() < file.get_length():
		var csv_item: PackedStringArray = file.get_csv_line(",")
		var row: Dictionary = {}
		
		for i in range(header.size()):
			var title = header[i]
			var value = csv_item[i]
			var type_str = types[i]
			
			# 根据第二行的字符串转化为相应类型
			match type_str:
				"str": row[title] = value
				"int": row[title] = value.to_int()
				"flo": row[title] = value.to_float()
				_: row[title] = value
		items.append(row)
	
	file.close()  # 读取完成后关闭文件
	
	#for i in range(items.size()):
		## 获取字典icon_x的值,负责定位纹理切图x轴位置
		#var x = items[i]["icon_x"]
		## 获取字典icon_y的值,负责定位纹理切图y轴位置
		#var y = items[i]["icon_y"]
		## 创建切图纹理
		#var tex = AtlasTexture.new()
		## 将预加载的纹理赋值到新创建的切图纹理上
		#tex.atlas = CSV_ITEM_ICON
		## 设置切图大小
		#tex.region.size = Vector2(16, 16)
		## 设置切图定位
		#tex.region.position = Vector2(x * 16, y * 16)
		## 赋值到节点纹理上
		#get_child(i).texture = tex

	return items

EXCEL转化器

我没构建Python环境,所以用不了更方便的脚本,只好找了个软件来实现类似功能:Excel格式转换器 - 吾爱

不过也没差,反正效果一样的,软件很好用,我可以直接在一个总表里方便的管理我的所有可以使用CSV储存的游戏数据,直观方便,还能利用EXCEL强大的汇总、查询、整理功能。

就比如下图,转化后会生成language、talent等CSV文件,真的很方便。在这里也感谢一下吾爱老哥的无私分享。

图1. 数据总表

语言国际化

实装了切换语言的功能。

不过,为了界面显示的简洁,我没做可供玩家选择语言的二级界面,而是采用了点一下切换一次的设计。

角色状态栏

之前用的是占据空间比较多的方式,后面手机用着用着发现……好像手机状态栏的样式就挺不错,然后就改成了现在这种。

采用一栏式布局,时间等信息和手机布局一致,电量的位置则替换为生命。

至于设置选项则从界面里删掉了,改为了游戏机制。玩家需要回到家园并使用特殊道具才可调整,例如:使用世界之声道具,可以调整游戏音量。

文件夹整理

目前我大致遵循以下两个原则:

  • res目录(也就是初始目录)的文件夹尽可能的少,这样比较美观。

    我大致分成了:Assets、Entity、Procedure三大类,分别对应游戏资产、玩家可互动的实体、程序。然后在这三大类我又会划分为很多个具体的小类,例如Procedure下有个scene(界面),然后界面里有个menu(主菜单)文件夹,里面就存放着一些和这个界面相关的文件,具体有啥详见下一个原则。

  • 文件分类按照模块化的思路进行储存。

    原本我是按类型来存放资源的,也就是脚本放一个文件夹、主题放一个文件夹、界面又放另一个文件夹……这样倒是整齐了,但是找东西的时候很不方便,经常要点开好几个文件夹去找对应的脚本和界面。而现在我按照模块化思路直接放一起,用上面那个menu文件夹举例,这里面有menu菜单的界面、脚本、主题等各个和menu相关的东西。

本文作者:晝行燈

版权声明:本文采用 CC BY-NC 4.0 协议授权

转载需注明作者及原文链接: https://mansifield.pages.dev/pbhi6l/