浏览代码

feat: 评测&练习多段重播逻辑

TIANYONG 1 年之前
父节点
当前提交
b023169a4e
共有 2 个文件被更改,包括 18 次插入7 次删除
  1. 15 5
      src/helpers/formateMusic.ts
  2. 3 2
      src/state.ts

+ 15 - 5
src/helpers/formateMusic.ts

@@ -1082,17 +1082,27 @@ const parseXmlToRepeat = (repeats: any) => {
 
 // 校验当前选段是否满足重播条件
 export const verifyCanRepeat = (startNum: number, endNum: number) => {
+	let repeatIdx = -1
 	if (state.repeatInfo.length) {
-		for (let i = 0; i < state.repeatInfo.length; i++) {
-			const element = state.repeatInfo[i];
+		for (let i = state.repeatInfo.length - 1; i >= 0; i--) {
 			const { start, end } = state.repeatInfo[i];
 			if (startNum <= start && endNum >= end) {
-				return true
+				repeatIdx = i
+				return {
+					repeatIdx,
+					canRepeat: true
+				}
 				break;
 			}
 		}
-		return false
+		return {
+			repeatIdx,
+			canRepeat: false
+		}
 	} else {
-		return false
+		return {
+			repeatIdx,
+			canRepeat: false
+		}
 	}
 }

+ 3 - 2
src/state.ts

@@ -545,10 +545,11 @@ export const setSection = (start: number, end: number, userSpeed?: number) => {
   const lastEndId = endNotes[endNotes.length - 1].noteId
   let lastEndNotes = endNotes.filter((n: any) => n.noteId === lastEndId)
   // 是否符合重播规则
-  const isCanRepeat = verifyCanRepeat(start, end)
+  const canRepeatInfo = verifyCanRepeat(start, end)
+  const isCanRepeat = canRepeatInfo.canRepeat
   // 如果符合重播规则,但是lastEndNotes长度为1,则需要向前找,直到找到lastEndNotes长度为2
   let currentEndNum: number = end
-  const lastEndIndex = state.repeatInfo.last()?.end
+  const lastEndIndex = canRepeatInfo.repeatIdx
   while (isCanRepeat && lastEndNotes.length === 1 && lastEndNotes[0].MeasureNumberXML <= lastEndIndex) {
     currentEndNum = currentEndNum - 1
     const newEndNotes = state.times.filter(