phigros铺面文件结构的探究 您所在的位置:网站首页 phigros念什么 phigros铺面文件结构的探究

phigros铺面文件结构的探究

2023-09-27 04:31| 来源: 网络整理| 查看: 265

实现连接: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 实验室设备网 版权所有