Ejemplo n.º 1
0
    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;
                }
            }
        }
Ejemplo n.º 3
0
        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;
                }
            }
        }
Ejemplo n.º 5
0
 private void PostCreateArcNote(ArcArc arc)
 {
     if (postArcCoroutine != null)
     {
         StopCoroutine(postArcCoroutine);
     }
     postArcCoroutine = StartCoroutine(PostCreateArcNoteCoroutine(arc));
 }
Ejemplo n.º 6
0
 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;
 }
Ejemplo n.º 7
0
 public void EndModify()
 {
     EndOfFrame.Instance.Listeners.AddListener(() =>
     {
         Enable        = false;
         note          = null;
         currentSetter = null;
         AdeCursorManager.Instance.Mode = lastMode;
         AdeCursorManager.Instance.EnableVerticalPanel = false;
     });
 }
Ejemplo n.º 8
0
 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;
     }
 }
Ejemplo n.º 9
0
        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;
        }
Ejemplo n.º 10
0
        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);
                }
            }
        }
Ejemplo n.º 11
0
        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;
        }
Ejemplo n.º 12
0
 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;
        }
Ejemplo n.º 14
0
 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;
 }
Ejemplo n.º 15
0
        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);
        }
Ejemplo n.º 16
0
        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();
 }
Ejemplo n.º 19
0
 public RemoveArcTapCommand(ArcArc arc, ArcArcTap arctap)
 {
     this.arc    = arc;
     this.arctap = arctap;
 }
Ejemplo n.º 20
0
 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(), "时间对齐"));
    }