Пример #1
0
 public Hold(LanePotision lane, TimingPosition timingBegin, TimingPosition timingEnd, NoteSize size)
 {
     System.Diagnostics.Debug.Assert(timingBegin < timingEnd);
     HoldBegin = new HoldBegin(lane, timingBegin, size);
     HoldBegin.PositionChanging += (begin, beginLane, beginTiming) =>
     {
         if (stepNotes.Where(x => x.Timing <= beginTiming).Any())
         {
             return(false);
         }
         if (!(beginTiming < HoldEnd.Timing))
         {
             return(false);
         }
         return(true);
     };
     HoldEnd = new HoldEnd(lane, timingEnd, size);
     HoldEnd.PositionChanging += (end, endLane, endTiming) =>
     {
         if (stepNotes.Where(x => x.Timing >= endTiming).Any())
         {
             return(false);
         }
         if (!(HoldBegin.Timing < endTiming))
         {
             return(false);
         }
         return(true);
     };
     stepNotes = new List <HoldStepNote>();
 }
Пример #2
0
        /// <summary>
        /// nullを返すことがあります
        /// </summary>
        /// <param name="lane"></param>
        /// <param name="timing"></param>
        /// <param name="size"></param>
        /// <param name="noteType"></param>
        /// <returns></returns>
        public static ShortNote Factory(LanePotision lane, TimingPosition timing, NoteSize size, NoteType noteType)
        {
            switch (noteType)
            {
            case NoteType.Touch:
                return(new Touch(lane, timing, size));

            case NoteType.Chain:
                return(new Chain(lane, timing, size));

            case NoteType.SlideL:
                return(new SlideL(lane, timing, size));

            case NoteType.SlideR:
                return(new SlideR(lane, timing, size));

            case NoteType.SnapU:
                return(new SnapU(lane, timing, size));

            case NoteType.SnapD:
                return(new SnapD(lane, timing, size));

            default:
                Debug.Assert(false);
                return(null);
            }
        }
Пример #3
0
 public override bool ReLocate(LanePotision lane, TimingPosition timing)
 {
     if (PositionChanging is null)
     {
         return(false);
     }
     if (!PositionChanging.Invoke(this, lane, timing))
     {
         timing = Timing;
     }
     return(base.ReLocate(lane, timing));
 }
Пример #4
0
        /// <summary>
        /// 絶対実座標から仮想座標を計算します
        /// LaneのRangeは(-inf, inf)(RawLaneを計算)
        /// </summary>
        /// <param name="env">エディタレーン環境</param>
        /// <param name="p">実座標(左上原点)</param>
        /// <param name="beat">拍数のストライド</param>
        /// <param name="scores"></param>
        /// <param name="position">計算された仮想座標</param>
        /// <returns>仮想座標の計算に成功したかどうか</returns>
        public static bool ConvertRealToVirtual(IReadOnlyEditorLaneEnvironment env, Point p, TimingPosition beat, IReadOnlyList <IReadOnlyScore> scores, out Position position)
        {
            p        = new Point(p.X - env.PanelRegion.X, p.Y - env.PanelRegion.Y);
            position = null;
            if (env.AvailableLaneWidth == 0)
            {
                return(false);
            }
            var laneLeft  = env.SideMargin;
            var laneRight = laneLeft + env.AvailableLaneWidth;

            if (!(laneLeft <= p.X && p.X < laneRight))
            {
                return(false);
            }
            int lanePos = (int)(((p.X - laneLeft) + env.OffsetXRaw) / env.LaneUnitWidth);

            if ((p.X - laneLeft) + env.OffsetXRaw < 0)
            {
                lanePos--;
            }
            var newLanePos = new LanePotision(lanePos);
            var timing     = new TimingPosition(env.TimingUnitHeight.ToUInt(), (env.PanelRegion.Height - p.Y) - (int)env.BottomMargin + env.OffsetY);
            var accum      = new TimingPosition(1, 0);

            foreach (var score in scores)
            {
                var tmp = new TimingPosition(score.BeatDen, (int)score.BeatNum);
                if (timing < tmp + accum)
                {
                    break;
                }
                accum += tmp;
            }
            var cnt          = (int)Math.Floor(((timing - accum) / beat).BarRatio);
            var newTimingPos = new TimingPosition(beat.DivValue, cnt) + accum;

            position = new Position(newLanePos, newTimingPos);
            return(true);
        }
Пример #5
0
 public HoldRelay(LanePotision lane, TimingPosition timing, NoteSize size)
     : base(lane, timing, size)
 {
 }
Пример #6
0
 public PreviewNote(LanePotision lane, TimingPosition timing, NoteSize size)
     : base(lane, timing, size)
 {
 }
Пример #7
0
 protected ShortNote(LanePotision lane, TimingPosition timing, NoteSize size)
     : base(lane, timing, size)
 {
 }
Пример #8
0
 public SnapD(LanePotision lane, TimingPosition timing, NoteSize size)
     : base(lane, timing, size)
 {
 }
Пример #9
0
 public virtual bool ReLocate(LanePotision lane, TimingPosition timing)
 {
     Lane   = new LanePotision(lane);
     Timing = new TimingPosition(timing);
     return(true);
 }
Пример #10
0
 protected NoteBase(LanePotision lane, TimingPosition timing, NoteSize size)
 {
     Lane     = new LanePotision(lane);
     Timing   = new TimingPosition(timing);
     NoteSize = new NoteSize(size);
 }
Пример #11
0
 protected HoldStepNote(LanePotision lane, TimingPosition timing, NoteSize size)
     : base(lane, timing, size)
 {
 }