menu
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user