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>(); }
/// <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); } }
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)); }
/// <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); }
public HoldRelay(LanePotision lane, TimingPosition timing, NoteSize size) : base(lane, timing, size) { }
public PreviewNote(LanePotision lane, TimingPosition timing, NoteSize size) : base(lane, timing, size) { }
protected ShortNote(LanePotision lane, TimingPosition timing, NoteSize size) : base(lane, timing, size) { }
public SnapD(LanePotision lane, TimingPosition timing, NoteSize size) : base(lane, timing, size) { }
public virtual bool ReLocate(LanePotision lane, TimingPosition timing) { Lane = new LanePotision(lane); Timing = new TimingPosition(timing); return(true); }
protected NoteBase(LanePotision lane, TimingPosition timing, NoteSize size) { Lane = new LanePotision(lane); Timing = new TimingPosition(timing); NoteSize = new NoteSize(size); }
protected HoldStepNote(LanePotision lane, TimingPosition timing, NoteSize size) : base(lane, timing, size) { }