phigros铺面文件结构的探究 | 您所在的位置:网站首页 › phigros念什么 › phigros铺面文件结构的探究 |
实现连接:https://github.com/luanmenglei/PhigrosRemake 本专栏内容不保证完全正确,如有错误请提出 前言:最近想要用wasm技术来实现一个phigros的模拟器,所以去研究了下phigros的铺面和@lchzh3473的sim-phi(lchzh3473/sim-phi: Simulation of Phigros display with js/canvas (github.com)) phigros原版的铺面文件为json格式,其大致结构如下: 大致结构formatVersion:这个格式是第几代的,目前3应该是最新一代,最老的为1 (本专栏讨论的是formatVersion为3的铺面) offset: 歌曲开始播放的时间,是一个浮点类型,根据sim-phi的代码来看单位大概是秒? numOfNotes: 铺面的note总数 judgeLineList: 铺面中最重要的信息,判定线和notes的信息都保存在其中 judgeLineList的类型为一个数组,其中包含着许多的line对象,一个line对象的结构如下 numOfNotes的含义同上 numOfNotesAbove:该判定线上方有的note的数量 numOfNotesBelow:下方note的数量 judgeLineDisappearEvents,judgeLineMoveEvents,judgeLineRotateEvents,speedEvents这四个事件构成了所有判定线的移动消失旋转变速,顾名思义,这四个事件分别可以改变判定线的不透明度(即opacity范围是[0.0,1.0] 0.0=完全透明 1.0=完全不透明),判定线定位点的定位点的位置(所有note的位置都是相对于定位点的位置),判定线的旋转角度和判定线里的note的基准速度 注:note为一条直线 每个事件一般都会有startTime和endTime这两个属性,即这个事件开始时间和结束时间(浮点类型,据我推测单位貌似是1/32拍,在sim-phi中有一个toRealTime的函数,可以将这种单位转化为秒,算法为time/bpm*1.875(=15/8=60/32) 所以这个单位的单位长度应该就是在此bpm下1/32拍所耗费的时间) 这里要注意的是:phigros原版的铺面格式不像是别的铺面格式,其事件必须为连续的,所以其实pgr里的事件更像是一个个块来划分什么时候判定线为什么样子 除speedEvent外,其余三个事件都有4个属性,分别是start, end, start2, end2 (说实话我非常想吐槽这个命名,而且对于disappear和rotation事件,貌似用不到start2和end2??)这四个属性顾名思义,代表着开始前这个事件所掌管的属性为(start, start2)而当这个事件结束之后其所掌管的属性为(end, end2),另外,根据@lchzh3473的sim-phi中的代码可得这四个数值转化为事件的方法如下: ps: 不保证准确,但是我不会il2cpp的逆向 为了方便表示,我们记t1为这个事件进行的进度的比,即(bgmTime-startTime)/(endTime-startTime),t2=(1-eventProgress) judgeLineDisappearEvents的opacity = start * t1 + end * t2 (感性理解就是t1,t2分别是start,end的权重,而却靠近头部,t1就越大,越靠近尾部,t2就越大,phigros官铺格式中只有这一种缓动,其余的缓动都是靠叠这种缓动来实现的) judgeLineMoveEvents: x = width * (i.start * t1 + i.end * t2); y = height * (1 - i.start2 * t1 - i.end2 * t2); (这里要1-的原因应该是pgr里的2d坐标系原点是左下角而canvas的坐标原点为左上) judgeLineRotateEvents: angle = start * t1 + end * t2 (是角度制) 特殊的,speedEvent的除startTime和endTime外,还有value和floorPosition这两个值 说实话我不是很确定floorPosition和value有什么含义和它们的单位 但是我推测floorPosition应该是没有任何用处,可以动态算出来的,因为在旧格式转新格式和pec转新格式中floorPosition都是直接算出来的 补充: 唯一用处这大概是floorPosition的唯一用处,其中line的positionY为 positionY算法所以note的floorPosition和speedEvent的floorPosition到底有什么关系等以后再想(摆烂) 话题回到note type取值: 1 => tap 2 => drag 3 => hold 4 => flick positionX为在判定线上的相对位置,与真实坐标映射是去乘width / 18 也没啥好讲的,接下来的还是要去写东西验证修改一下 完结撒花! |
CopyRight 2018-2019 实验室设备网 版权所有 |