public int GetClosestValidIndex(int index) { return((Frames.LastOrDefault(x => index > x.Index) ?? Frames.FirstOrDefault()) ?.Index ?? -1); }
public AnimationRouteFrameSlider GetFrameSlider(TimeSpan currentStopperTime) { AnimationRouteFrameSlider slider = new AnimationRouteFrameSlider(); //if(currentStopperTime < AnimationStartTime) //{ // if(Frames != null && Frames.Count > 0) // slider.NextFrame = Frames[0]; // return slider; //} TimeSpan time = currentStopperTime;// - AnimationStartTime;//lub odwrotnie bool breaked = false; for (int i = 0; i < Frames.Count; i++) { var frame = Frames[i]; if (time < frame.FrameTime) { if (i - 1 >= 0) { slider.PreviousFrame = Frames[i - 1]; } slider.CurrentFrame = frame; if (i + 1 < Frames.Count) { slider.NextFrame = Frames[i + 1]; } breaked = true; break; } else { time -= frame.FrameTime; } } if (!breaked) { slider.PreviousFrame = Frames.LastOrDefault(); } return(slider); }
/// <summary> /// 判断某时刻指针是否在某物件上 /// </summary> /// <param name="obj"></param> /// <param name="time"></param> /// <returns></returns> public bool Contains(OsuHitObject obj, double time, double?judgement_radius = null) { if (obj.StartTime == 10752) { } var frame = Frames.LastOrDefault(f => time >= f.Time); if (frame == null) { frame = Frames.First().PreviousFrame; } var next_frame = frame?.NextFrame; if (next_frame == null) { return(false); } //插值计算 var cur_timestramp = (time - frame.Time) / (next_frame.Time - frame.Time);//归一化 var temp_offset = (next_frame.Position - frame.Position) * (float)cur_timestramp; //指针位置 var cur_position = frame.Position + temp_offset; cur_position = Vector2.Clamp( cur_position, frame.Position, next_frame.Position ); var dist = Vector2.Distance(obj.Position, cur_position); return(dist <= (judgement_radius ?? obj.Radius)); }
private void Search7_AroundTarget() { SFMT sfmt = new SFMT(Seed.Value); int start = (int)Frame_min.Value; int target = (int)TargetFrame.Value; int min = target - 100; int max = target + 100; if (start > min) { start = min; } // Blinkflag FuncUtil.getblinkflaglist(min, max, sfmt, Modelnum); // Prepare int i = 0; byte blinkflag = 0; for (; i < start; i++) { sfmt.Next(); } ModelStatus status = new ModelStatus(Modelnum, sfmt); ModelStatus stmp = new ModelStatus(Modelnum, sfmt); status.raining = stmp.raining = Raining.Checked; getsetting(sfmt); int frameadvance = 0; int realtime = 0; int frametime = 0; // Calc frames around target for (; i <= max;) { for (; frameadvance == 0; frameadvance = status.NextState()) { realtime++; } for (; frameadvance > 0; frameadvance--, i++) { if (min <= i && i <= max) { RNGPool.CopyStatus(stmp); var result = RNGPool.Generate7(); blinkflag = FuncUtil.blinkflaglist[i - min]; Frames.Add(new Frame(result, frame: i, time: frametime * 2, blink: blinkflag)); } RNGPool.AddNext(sfmt); } // Backup current status status.CopyTo(stmp); frametime = realtime; } // Get all possible results by EC matching // Can't identify MainRNGEggs by EC if (Method < 3) { Frames = Frames.OrderBy(f => f.FrameNum + (f.rt as Result7).FrameDelayUsed).ToList(); var EClist = Frames.Select(f => f.rt.EC).ToArray(); // Another Buffer sfmt = new SFMT(Seed.Value); int starting = Frames[0].FrameNum + (Frames[0].rt as Result7).FrameDelayUsed; for (i = 0; i < starting; i++) { sfmt.Next(); } RNGPool.CreateBuffer(sfmt); // Skip Delay RNGPool.Considerdelay = false; if (RNGPool.igenerator is Stationary7 st7) { st7.AssumeSynced = Nature.CheckBoxItems[SyncNature.SelectedIndex].Checked; } uint EC; uint EClast = EClist.Last(); int Nframe = -1; ulong rand = 0; do { RNGPool.modelnumber = Modelnum; RNGPool.ResetModelStatus(); var result = RNGPool.Generate7() as Result7; EC = result.EC; RNGPool.AddNext(sfmt); if (EClist.Contains(EC)) { var framenow = Frames.LastOrDefault(f => f.EC == EC); Nframe = framenow.FrameNum; frametime = framenow.realtime; rand = framenow.Rand64; continue; } else if (Nframe > -1) { result.RandNum = rand; Frames.Add(new Frame(result, frame: Nframe, time: frametime, blink: 4)); } }while (EC != EClast); } // Filters RNGResult.IsPokemon = true; Frames = Frames.Where(f => filter.CheckResult(f.rt)) .OrderBy(f => f.FrameNum) .ToList(); }