Project1

标题: 关于如何判断文件名称 [打印本页]

作者: kyjoke    时间: 2024-5-10 08:41
标题: 关于如何判断文件名称
最近在写一个新的立绘插件,我打算直接用文件名正则来判断是否是立绘,以此来免除繁杂的设置。
我写了path模块来获取文件名,不过这貌似会导致浏览器环境无法运行?有没有更好的解决办法

作者: 505681468    时间: 2024-5-10 17:27
本帖最后由 505681468 于 2024-5-10 18:08 编辑

不应该呀,写了啥?报错啥?
按原生方法读取文件不行吗

还是说你想要只判断文件是否存在
非 nwjs 环境是不能直接判断文件的
PC可以直接判断
安卓可以在安卓层暴露判断方法出来给js使用
IOS层和浏览器层就不知道了

JAVASCRIPT 代码复制
  1. StorageManager.exists = function(savefileId) {
  2.     if (this.isLocalMode()) {
  3.         return this.localFileExists(savefileId);
  4.     } else {
  5.         return this.webStorageExists(savefileId);
  6.     }
  7. };
  8.  
  9. StorageManager.isLocalMode = function() {
  10.     return Utils.isNwjs();
  11. };
  12.  
  13. Utils.isNwjs = function() {
  14.     return typeof require === 'function' && typeof process === 'object';
  15. };

作者: 灯笼菜刀王    时间: 2024-5-10 20:04
提供关联设置,  有关联时调用关联, 缺省时调用文件名,   让非PC端用户自己去设置好关联即可, 笑
作者: kyjoke    时间: 2024-5-10 22:36
505681468 发表于 2024-5-10 17:27
不应该呀,写了啥?报错啥?
按原生方法读取文件不行吗

虽然我不需要手机和浏览器端,不过我是考虑发布给大家用的时候的兼容性的。
我打算写一个可以全场景界面显示,用公共事件控制的多图层支持序列帧的立绘插件,目前已经初步实现了全场景显示和多图层以及序列帧功能。
我判断的不是文件是否存在,而是读取文件名称,然后用正则来提取文件名称的数据来进行各种设置,比如文件名%[10-1],这里面的10代表为序列帧的序列号,1就代表播放的速度。
我用require('path')实现了这个,在rm原生有类似的方法吗?
作者: 505681468    时间: 2024-5-10 23:52
kyjoke 发表于 2024-5-10 22:36
虽然我不需要手机和浏览器端,不过我是考虑发布给大家用的时候的兼容性的。
我打算写一个可以全场景界面 ...


原生没有,rm源码我也贴了
对于非 nwjs 是通过 localStorage 浏览器储存来实现文件保存的
通过 url 访问来读取文件的,原生并没有读取文件属性的方法

读取文件名称和判断文件是否存在都是一样的,读取文件属性而不是读取文件
还有就是浏览器/安卓的环境不一样,安卓比浏览器多了安卓文件访问,它两的测试环境不通用

原生对于非pc端,或者说非 nwjs 端没有文件访问
相对于对每个平台都做文件访问接口,做配置文件烘焙或者会更好
在部署游戏前,执行你插件的方法,生成配置文件
作者: kyjoke    时间: 2024-5-11 01:01
505681468 发表于 2024-5-10 23:52
原生没有,rm源码我也贴了
对于非 nwjs 是通过 localStorage 浏览器储存来实现文件保存的
通过 url 访问 ...

手动写配置的话那就又麻烦了,像三十烷的那个序列帧插件,有多少帧就得写多少帧。我搞的要是和其他插件一样麻烦的话实属是写了等于没写
作者: 505681468    时间: 2024-5-11 01:36
kyjoke 发表于 2024-5-11 01:01
手动写配置的话那就又麻烦了,像三十烷的那个序列帧插件,有多少帧就得写多少帧。我搞的要是和其他插件一 ...


不用配置,你可以用js脚本读取文件列表,生成json配置文件(也可以不用)
做个中间层,在游戏读取data构造游戏data对象的时候,加一层插件配置的数据应用
或者直接写入原生的data配置,例如 actors 的 note,这样就可以走原生的 meta 了

就是把你的插件本来要自动分析的结果,保存成配置而已
作者: kyjoke    时间: 2024-5-11 01:40
505681468 发表于 2024-5-11 01:36
不用配置,你可以用js脚本读取文件列表,生成json配置文件(也可以不用)
做个中间层,在游戏读取data构 ...

哦?不过我不是很懂如何具体操作,有范例的代码吗?我只是在获取文件名这步用到了node模块,如果代码不是很复杂,应该是可以改成这样式的。
作者: 505681468    时间: 2024-5-11 02:19
kyjoke 发表于 2024-5-11 01:40
哦?不过我不是很懂如何具体操作,有范例的代码吗?我只是在获取文件名这步用到了node模块,如果代码不是 ...

简单点就走原生rm读取文件,然后分析,生成配置文件,走PC存档方法保存
然后重开游戏,走原生生成data对象的时候,就有配置数据了
之后部署/发布游戏之前记得生成配置文件就好了

你已经能正常获取文件列表,走完配置分析了,然后把配置结果保存就行了
参考存档保存 StorageManager.saveToLocalFile


作者: kyjoke    时间: 2024-5-11 02:48
505681468 发表于 2024-5-11 02:19
简单点就走原生rm读取文件,然后分析,生成配置文件,走PC存档方法保存
然后重开游戏,走原生生成data对 ...

我最不明白的就是rm原生的读取文件了,毕竟我才用了rm几个月,所以我才想要示范的代码
作者: 小秋橙    时间: 2024-5-11 07:46
505681468 发表于 2024-5-11 02:19
简单点就走原生rm读取文件,然后分析,生成配置文件,走PC存档方法保存
然后重开游戏,走原生生成data对 ...

感觉整层楼在讨论的问题都非常奇怪…既然rm运行时无法“对存档以外的目录一股脑读取完再列出所有文件名”,那不就意味着“在json文件或插件参数中提供了文件名再去加载”吗?如果是这样的话应该对这个已知的文件名做正则匹配才对啊…
作者: 505681468    时间: 2024-5-11 11:47
本帖最后由 505681468 于 2024-5-11 11:54 编辑
小秋橙 发表于 2024-5-11 07:46
感觉整层楼在讨论的问题都非常奇怪…既然rm运行时无法“对存档以外的目录一股脑读取完再列出所有文件名” ...


是的,现在这部分他已经走完了
在pc上获取目录下的文件名,正则匹配做数据解析,已经做了

他的问题是,在非PC端无法获取文件名
作者: 505681468    时间: 2024-5-11 11:51
kyjoke 发表于 2024-5-11 02:48
我最不明白的就是rm原生的读取文件了,毕竟我才用了rm几个月,所以我才想要示范的代码 ...

很短的,你就看一看代码就行了,全文搜索很快的呀

保存本地文件 rm 做了文件名拦截,只能用 id 来存游戏文件,你取消掉这部分就是自定义文件保存了
判断文件是否存在也有了 existsSync

  1. StorageManager.saveToLocalFile = function(savefileId, json) {
  2.     var data = LZString.compressToBase64(json);
  3.     var fs = require('fs');
  4.     var dirPath = this.localFileDirectoryPath();
  5.     var filePath = this.localFilePath(savefileId);
  6.     if (!fs.existsSync(dirPath)) {
  7.         fs.mkdirSync(dirPath);
  8.     }
  9.     fs.writeFileSync(filePath, data);
  10. };

  11. StorageManager.loadFromLocalFile = function(savefileId) {
  12.     var data = null;
  13.     var fs = require('fs');
  14.     var filePath = this.localFilePath(savefileId);
  15.     if (fs.existsSync(filePath)) {
  16.         data = fs.readFileSync(filePath, { encoding: 'utf8' });
  17.     }
  18.     return LZString.decompressFromBase64(data);
  19. };

  20. StorageManager.localFilePath = function(savefileId) {
  21.     var name;
  22.     if (savefileId < 0) {
  23.         name = 'config.rpgsave';
  24.     } else if (savefileId === 0) {
  25.         name = 'global.rpgsave';
  26.     } else {
  27.         name = 'file%1.rpgsave'.format(savefileId);
  28.     }
  29.     return this.localFileDirectoryPath() + name;
  30. };
复制代码






欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1