public void MirrorSelectedNotes() { var selected = AdeCursorManager.Instance.SelectedNotes; List <ICommand> commands = new List <ICommand>(); foreach (var n in selected) { switch (n) { case ArcTap tap: ArcTap newtap = tap.Clone() as ArcTap; newtap.Track = 5 - newtap.Track; commands.Add(new EditArcEventCommand(tap, newtap)); break; case ArcHold hold: ArcHold newhold = hold.Clone() as ArcHold; newhold.Track = 5 - newhold.Track; commands.Add(new EditArcEventCommand(hold, newhold)); break; case ArcArc arc: ArcArc newarc = arc.Clone() as ArcArc; newarc.XStart = 1 - newarc.XStart; newarc.XEnd = 1 - newarc.XEnd; if (newarc.Color < 2) { newarc.Color = 1 - newarc.Color; } commands.Add(new EditArcEventCommand(arc, newarc)); break; } } CommandManager.Instance.Add(new BatchCommand(commands.ToArray(), "镜像")); }
private void RenderArcTaps(ArcArc arc) { int timing = ArcGameplayManager.Instance.Timing; ArcTimingManager timingManager = ArcTimingManager.Instance; int offset = ArcAudioManager.Instance.AudioOffset; foreach (ArcArcTap t in arc.ArcTaps) { if (!timingManager.ShouldTryRender(t.Timing + offset, t.TimingGroup) || t.Judged || t.GroupHide()) { t.Enable = false; continue; } float pos = timingManager.CalculatePositionByTiming(t.Timing + offset, t.TimingGroup) / 1000f; if (pos > -100 && pos <= 90) { t.Alpha = 1; t.Enable = true; } else if (pos > 90 && pos <= 100) { t.Enable = true; t.Alpha = (100 - pos) / 10f; } else { t.Enable = false; } } }
private void UpdateArcTapCursor() { if (selectedArc != null && selectedArc.Instance == null) { selectedArc = null; if (Mode == ClickToCreateMode.ArcTap) { Mode = ClickToCreateMode.Idle; } return; } if (Mode != ClickToCreateMode.ArcTap || selectedArc == null) { AdeCursorManager.Instance.EnableArcTapCursor = false; AdeCursorManager.Instance.EnableVerticalPanel = false; return; } Vector3 pos = AdeCursorManager.Instance.AttachedHorizontalPoint; int timing = ArcTimingManager.Instance.CalculateTimingByPosition(-pos.z * 1000) - ArcAudioManager.Instance.AudioOffset; canAddArcTap = selectedArc.Timing <= timing && selectedArc.EndTiming >= timing; AdeCursorManager.Instance.EnableArcTapCursor = canAddArcTap; AdeCursorManager.Instance.EnableVerticalPanel = canAddArcTap; if (!canAddArcTap) { return; } ArcTimingManager timingManager = ArcTimingManager.Instance; float t = 1f * (timing - selectedArc.Timing) / (selectedArc.EndTiming - selectedArc.Timing); Vector2 gizmo = new Vector3(ArcAlgorithm.ArcXToWorld(ArcAlgorithm.X(selectedArc.XStart, selectedArc.XEnd, t, selectedArc.LineType)), ArcAlgorithm.ArcYToWorld(ArcAlgorithm.Y(selectedArc.YStart, selectedArc.YEnd, t, selectedArc.LineType)) - 0.5f); AdeCursorManager.Instance.ArcTapCursorPosition = gizmo; }
private void JudgeArcTaps(ArcArc arc) { int currentTiming = ArcGameplayManager.Instance.Timing; int offset = ArcAudioManager.Instance.AudioOffset; foreach (ArcArcTap t in arc.ArcTaps) { if (t.Judged) { continue; } if (currentTiming > t.Timing + offset && currentTiming <= t.Timing + offset + 150) { t.Judged = true; if (ArcGameplayManager.Instance.IsPlaying) { ArcEffectManager.Instance.PlayTapNoteEffectAt(new Vector2(t.LocalPosition.x, t.LocalPosition.y + 0.5f), true); } } else if (currentTiming > t.Timing + offset + 150) { t.Judged = true; } } }
private void PostCreateArcNote(ArcArc arc) { if (postArcCoroutine != null) { StopCoroutine(postArcCoroutine); } postArcCoroutine = StartCoroutine(PostCreateArcNoteCoroutine(arc)); }
public void ModifyNote(ArcArc note, Action <Vector2> setter) { Enable = true; this.note = note; currentSetter = setter; lastMode = AdeCursorManager.Instance.Mode; AdeCursorManager.Instance.Mode = CursorMode.Vertical; AdeCursorManager.Instance.EnableVerticalPanel = true; }
public void EndModify() { EndOfFrame.Instance.Listeners.AddListener(() => { Enable = false; note = null; currentSetter = null; AdeCursorManager.Instance.Mode = lastMode; AdeCursorManager.Instance.EnableVerticalPanel = false; }); }
public void CancelAddLongNote() { if (postHoldCoroutine != null || postArcCoroutine != null) { StopCoroutine(postHoldCoroutine ?? postArcCoroutine); postHoldCoroutine = postArcCoroutine = null; AdePositionSelector.Instance.EndModify(); AdeTimingSelector.Instance.EndModify(); CommandManager.Instance.Cancel(); selectedArc = null; } }
public override void Assign(ArcEvent newValues) { base.Assign(newValues); ArcArc n = newValues as ArcArc; XStart = n.XStart; XEnd = n.XEnd; LineType = n.LineType; YStart = n.YStart; YEnd = n.YEnd; Color = n.Color; IsVoid = n.IsVoid; TimingGroup = n.TimingGroup; }
public void OnSelectParent() { List <ArcNote> selectedNotes = AdeCursorManager.Instance.SelectedNotes; if (selectedNotes.Count == 1) { if (selectedNotes[0] is ArcArcTap) { ArcArc arc = (selectedNotes[0] as ArcArcTap).Arc; AdeCursorManager.Instance.DeselectAllNotes(); AdeCursorManager.Instance.SelectNote(arc); } } }
public void SetClickToCreateMode(int mode) { ClickToCreateMode newMode = (ClickToCreateMode)mode; if (newMode == ClickToCreateMode.ArcTap && selectedArc == null) { AdeToast.Instance.Show("请选中一条 Arc"); Mode = ClickToCreateMode.Idle; return; } Mode = newMode; if (newMode != ClickToCreateMode.ArcTap) { selectedArc = null; } skipNextClick = false; }
public void OnNoteSelect(ArcNote note) { if (note is ArcArc) { if (Mode == ClickToCreateMode.ArcTap) { if (selectedArc != null) { skipNextClick = true; } selectedArc = note as ArcArc; } else { selectedArc = note as ArcArc; skipNextClick = true; } } }
private void UpdateInfo() { EnableInfo = EnableVertical || EnableHorizontal; string content = string.Empty; if (!EnableInfo) { return; } content += $"音乐时间: {AttachedTiming + ArcAudioManager.Instance.AudioOffset}\n"; content += $"谱面时间: {AttachedTiming}"; if (EnableVertical) { Vector3 pos = AttachedVerticalPoint; content += $"\n坐标: ({ArcAlgorithm.WorldXToArc(pos.x).ToString("f2")},{ArcAlgorithm.WorldYToArc(pos.y).ToString("f2")})"; } if (AdeClickToCreate.Instance.Enable && AdeClickToCreate.Instance.Mode != ClickToCreateMode.Idle) { content += $"\n点立得: {AdeClickToCreate.Instance.Mode.ToString()}"; if (AdeClickToCreate.Instance.Mode == ClickToCreateMode.Arc) { content += $"\n{AdeClickToCreate.Instance.CurrentArcColor}/{AdeClickToCreate.Instance.CurrentArcIsVoid}/{AdeClickToCreate.Instance.CurrentArcType}"; } } if (rangeSelectPosition != null) { content += $"\n段落选择起点: {rangeSelectPosition}"; } if (SelectedNotes.Count == 1 && SelectedNotes[0] is ArcArc) { ArcArc arc = SelectedNotes[0] as ArcArc; float p = (AttachedTiming - arc.Timing) / (arc.EndTiming - arc.Timing); if (p >= 0 && p <= 1) { float x = ArcAlgorithm.X(arc.XStart, arc.XEnd, p, arc.LineType); float y = ArcAlgorithm.Y(arc.YStart, arc.YEnd, p, arc.LineType); content += $"\nArc: {(p * 100).ToString("f2")}%, {x.ToString("f2")}, {y.ToString("f2")}"; } } InfoText.text = content; }
private IEnumerator PostCreateArcNoteCoroutine(ArcArc arc) { AdePositionSelector.Instance.ModifyNote(arc, (a) => { arc.XStart = arc.XEnd = a.x; arc.YStart = arc.YEnd = a.y; arc.Rebuild(); }); while (AdePositionSelector.Instance.Enable) { yield return(null); } AdeTimingSelector.Instance.ModifyNote(arc, (a) => { arc.EndTiming = a; arc.Rebuild(); }); while (AdeTimingSelector.Instance.Enable) { yield return(null); } AdePositionSelector.Instance.ModifyNote(arc, (a) => { arc.XEnd = a.x; arc.YEnd = a.y; arc.Rebuild(); }); while (AdePositionSelector.Instance.Enable) { yield return(null); } CommandManager.Instance.Commit(); pendingNote = null; postArcCoroutine = null; }
public override ArcEvent Clone() { ArcArc arc = new ArcArc() { Timing = Timing, EndTiming = EndTiming, XStart = XStart, XEnd = XEnd, LineType = LineType, YStart = YStart, YEnd = YEnd, Color = Color, IsVoid = IsVoid, TimingGroup = TimingGroup, }; foreach (var arctap in ArcTaps) { arc.ArcTaps.Add(arctap.Clone() as ArcArcTap); } return(arc); }
private void AddNoteHandler() { if (!AdeCursorManager.Instance.IsHorizontalHit) { return; } if (skipNextClick) { skipNextClick = false; return; } Vector3 pos = AdeCursorManager.Instance.AttachedHorizontalPoint; int timing = ArcTimingManager.Instance.CalculateTimingByPosition(-pos.z * 1000) - ArcAudioManager.Instance.AudioOffset; ArcNote note = null; switch (Mode) { case ClickToCreateMode.Tap: note = new ArcTap() { Timing = timing, Track = PositionToTrack(pos.x) }; break; case ClickToCreateMode.Hold: note = new ArcHold() { Timing = timing, Track = PositionToTrack(pos.x), EndTiming = timing }; break; case ClickToCreateMode.Arc: note = new ArcArc() { Timing = timing, EndTiming = timing, Color = currentArcColor, IsVoid = currentArcIsVoid, LineType = currentArcType }; break; case ClickToCreateMode.ArcTap: note = new ArcArcTap() { Timing = timing }; break; } if (note == null) { return; } switch (Mode) { case ClickToCreateMode.Tap: CommandManager.Instance.Add(new AddArcEventCommand(note)); break; case ClickToCreateMode.Hold: case ClickToCreateMode.Arc: CommandManager.Instance.Prepare(new AddArcEventCommand(note)); break; case ClickToCreateMode.ArcTap: if (canAddArcTap) { CommandManager.Instance.Add(new AddArcTapCommand(selectedArc, note as ArcArcTap)); } else { if (selectedArc != null) { selectedArc = null; Mode = ClickToCreateMode.Idle; } } break; } if (note is ArcLongNote) { pendingNote = note as ArcLongNote; } switch (Mode) { case ClickToCreateMode.Hold: PostCreateHoldNote(note as ArcHold); break; case ClickToCreateMode.Arc: PostCreateArcNote(note as ArcArc); break; } }
public void Remove(ArcArc arc) { Arcs.Remove(arc); arc.Destroy(); CalculateArcRelationship(); }
public void Add(ArcArc arc) { arc.Instantiate(); Arcs.Add(arc); CalculateArcRelationship(); }
public RemoveArcTapCommand(ArcArc arc, ArcArcTap arctap) { this.arc = arc; this.arctap = arctap; }
public AddArcTapCommand(ArcArc arc, ArcArcTap arctap) { this.arc = arc; this.arctap = arctap; }
public void SnapSelectedNotesTiming() { // We hide the menu when grid is not open, so we should not check here var selected = AdeCursorManager.Instance.SelectedNotes; List <ICommand> commands = new List <ICommand>(); foreach (var note in selected) { if (note is ArcArcTap) { if (selected.Contains((note as ArcArcTap).Arc)) { continue; } var newNote = note.Clone(); var arc = (note as ArcArcTap).Arc; int newTiming = GetSnapedTiming(note.Timing); if (newTiming < arc.Timing) { newTiming = arc.Timing; } if (newTiming > arc.EndTiming) { newTiming = arc.EndTiming; } newNote.Timing = newTiming; commands.Add(new EditArcEventCommand(note, newNote)); } else { var newNote = note.Clone(); int newTiming = GetSnapedTiming(note.Timing); newNote.Timing = newTiming; if (note is ArcLongNote) { int newEndTiming = GetSnapedTiming((note as ArcLongNote).EndTiming); if (newEndTiming < newTiming) { newEndTiming = newTiming; } if (newEndTiming == newTiming) { bool needAvoidZeroLength = false; if (note is ArcHold) { needAvoidZeroLength = true; } if (note is ArcArc) { var arc = note as ArcArc; if (arc.ArcTaps.Count > 0) { needAvoidZeroLength = true; } if (Mathf.Approximately(arc.XStart, arc.XEnd) && Mathf.Approximately(arc.YStart, arc.YEnd)) { needAvoidZeroLength = true; } } if (needAvoidZeroLength) { newEndTiming = GetNextSnapedTiming(newTiming); } } (newNote as ArcLongNote).EndTiming = newEndTiming; } commands.Add(new EditArcEventCommand(note, newNote)); if (note is ArcArc) { ArcArc newArc = newNote as ArcArc; foreach (var arcTap in (note as ArcArc).ArcTaps) { var newArcTap = arcTap.Clone(); int newArcTapTiming = GetSnapedTiming(arcTap.Timing); if (newArcTapTiming < newArc.Timing) { newArcTapTiming = newArc.Timing; } if (newArcTapTiming > newArc.EndTiming) { newArcTapTiming = newArc.EndTiming; } newArcTap.Timing = newArcTapTiming; commands.Add(new EditArcEventCommand(arcTap, newArcTap)); } } } } CommandManager.Instance.Add(new BatchCommand(commands.ToArray(), "时间对齐")); }