解读C++绑定库calc_ssr函数的NoteInfo参数 用于Java移植
问题解答
1. calc_ssr中NoteInfo相关参数设计与传参逻辑
- 关于
rows指针的作用:
C/C++中指向结构体的指针可以作为连续结构体数组的首地址使用,你看到的*rows并不是单个实例的指针,而是存放所有谱面音符数据的NoteInfo数组的第一个元素地址。配套传入的num_rows就是这个数组的总长度,函数内部std::vector<NoteInfo> note_info(rows, rows + num_rows)这行代码的作用就是把从首地址开始的num_rows个NoteInfo元素批量复制到vector容器中,再传入MinaSDCalc使用,完全符合数组入参的逻辑要求。 - 关于
NoteInfo结构体字段含义:rowTime:你的判断正确,该字段是当前音符行的出现时间,单位为秒,从歌曲起始点开始计算,每个NoteInfo实例的rowTime都是独立的时间值,绝不会是常量,否则会导致谱面时序完全错误,计算结果无效。notes:位掩码字段,每一位对应一个游戏轨道的按键状态,例如7键模式下低7位分别对应7个轨道,对应位为1表示该时间点对应轨道有需要按下的音符。
- 传参逻辑:
调用calc_ssr前需要先解析谱面数据,把所有音符按时间升序排序,同一个时间点出现的多轨道音符合并为一个NoteInfo实例,所有实例组成连续的数组后,将数组首地址、数组长度分别作为rows和num_rows参数传入即可。
Java移植适配提示
Java中没有指针概念,你可以直接把对应参数替换为List<NoteInfo>类型,直接传入组装好的音符对象列表即可,无需额外传递长度参数。
内容的提问来源于stack exchange,提问作者Ry-
相关产品推荐
相关产品推荐

