This commit is contained in:
SoulliesOfficial
2025-07-26 04:20:25 -04:00
parent bae0bfbc20
commit abf81ece7b
196 changed files with 3909 additions and 964 deletions

View File

@@ -13,6 +13,8 @@ namespace Ichni.RhythmGame
{
public partial class Flick : NoteBase
{
public NoteJudgeType preJudgeType;
public List<Vector2> availableFlickDirections;
public float flickBuffer = 0.5f;
@@ -66,22 +68,64 @@ namespace Ichni.RhythmGame
}
base.Update();
ExecuteFinalJudge(songTime);
}
protected override void RemoveFromCheckingList()
{
GameManager.instance.inputManager.checkingFlickList.Remove(this);
if (GameManager.instance.inputManager.checkingFlickList.Contains(this))
{
GameManager.instance.inputManager.checkingFlickList.Remove(this);
}
}
public override void ExecuteStartJudge()
{
base.ExecuteStartJudge();
isFinalJudged = true;
float triggerTime = GameManager.instance.songTime;
float timeDifference = triggerTime - exactJudgeTime;
if (GameManager.instance.inputManager.checkingFlickList.Contains(this))
NoteJudgeType startJudgeType = GetStartJudgeType(timeDifference);
if (startJudgeType != NoteJudgeType.Perfect)
{
GameManager.instance.inputManager.checkingFlickList.Remove(this);
return;
}
preJudgeType = startJudgeType;
isFirstJudged = true;
RemoveFromCheckingList();
}
public void ExecuteFinalJudge(float triggerTime)
{
if (isFirstJudged && !isFinalJudged && preJudgeType != NoteJudgeType.NotJudged &&
GameManager.instance.songTime >= exactJudgeTime)
{
if (preJudgeType == NoteJudgeType.Perfect)
{
Perfect(triggerTime);
}
else if (preJudgeType == NoteJudgeType.Good)
{
Good(triggerTime);
}
else if (preJudgeType == NoteJudgeType.Bad)
{
Bad(triggerTime);
}
else if (preJudgeType == NoteJudgeType.Miss)
{
Miss(triggerTime);
}
if (preJudgeType != NoteJudgeType.Miss)
{
noteAudioSubmodule.PlayGeneralJudgeAudios();
}
isFinalJudged = true;
}
}
}
@@ -93,8 +137,14 @@ namespace Ichni.RhythmGame
return noteJudgeSubmodule.judgeUnitList.All(judgeUnit => judgeUnit.CheckJudgeAvailability(inputUnitSwipe));
}
public bool CheckSwipeDirection(Vector2 screenSwipeDirection)
public bool CheckSwipeDirection(InputUnitSwipe inputUnitSwipe)
{
if (inputUnitSwipe.isGeneric)
{
Debug.Log($"输入方向 {inputUnitSwipe.swipeDirection} 是通用的,直接匹配成功。");
return true;
}
Camera gameCamera = GameManager.instance.cameraManager.gameCamera.gameCamera;
foreach (Vector2 localDir in availableFlickDirections)
@@ -113,18 +163,18 @@ namespace Ichni.RhythmGame
continue;
}
float dotProduct = Vector2.Dot(screenSwipeDirection, noteScreenDirection);
float dotProduct = Vector2.Dot(inputUnitSwipe.swipeDirection, noteScreenDirection);
// 4. 检查点积是否满足阈值
if (dotProduct >= flickBuffer)
{
// 匹配成功!无需再检查其他方向。
Debug.Log($"匹配成功! 输入方向 {screenSwipeDirection} 匹配了本地方向 {localDir} (屏幕投影: {noteScreenDirection}), 点积: {dotProduct}");
Debug.Log($"匹配成功! 输入方向 {inputUnitSwipe.swipeDirection} 匹配了本地方向 {localDir} (屏幕投影: {noteScreenDirection}), 点积: {dotProduct}");
return true;
}
}
Debug.Log($"匹配失败. 输入方向 {screenSwipeDirection} 未匹配任何允许的方向。");
Debug.Log($"匹配失败. 输入方向 {inputUnitSwipe.swipeDirection} 未匹配任何允许的方向。");
return false;
}
}