public override void WriteEndElement() { states.Pop(); if (elemName == null) { return; } if (thread == null) { thread = callback.GetThread(StringSlice.Empty); } long position = callback.CurrentPosition; long endPosition = callback.CurrentEndPosition; switch (elemName) { case "m": output = new Content(position, endPosition, thread, dateTime, new StringSlice(GetAndClearContent()), severity); break; case "f": output = new FrameBegin(position, endPosition, thread, dateTime, new StringSlice(GetAndClearContent())); break; case "ef": output = new FrameEnd(position, endPosition, thread, dateTime); break; } elemName = null; Reset(); }
public void RenderFrame(object o, ElapsedEventArgs e) { FrameTimer.Enabled = false; FrameStart = DateTime.Now; Graphics g = Buffer.Graphics; g.SmoothingMode = SmoothingMode.AntiAlias; p.Gui.Draw(g); Buffer.Render(Graphics.FromHwnd(p.Handle)); FrameEnd = DateTime.Now; FrameTime = FrameEnd.Subtract(FrameStart).TotalMilliseconds; if (FrameTime < (1000 / FrameLimit)) { FrameTimer.Interval = ((1000 / FrameLimit) - FrameTime); FrameTime = (1000 / FrameLimit); } else { FrameTimer.Interval = FrameTime; } FramesPerSec = (1000 / FrameTime); FrameTimer.Enabled = true; }
/// <summary> /// Duplicates the values from an existing atlas to make a copy that /// references only the sprite (all other values copied). /// </summary> /// <param name="atlas"></param> public SpriteAtlas(SpriteAtlas atlas) { sprite = atlas.sprite; frame = atlas.frame; frames = atlas.frames; frameSpeed = atlas.frameSpeed; frameEndBehavior = atlas.frameEndBehavior; frameWidth = atlas.frameWidth; frameHeight = atlas.frameHeight; atlasRows = atlas.atlasRows; atlasCols = atlas.atlasCols; frameOffsetH = atlas.frameOffsetH; frameOffsetV = atlas.frameOffsetV; }
/// <summary>Initializes a sprite atlas from another.</summary> /// <param name="spriteAtlas">The existing sprite atlas.</param> /// <param name="sameFrame"> /// Whether the frame is copied or set to 0. /// </param> public SpriteAtlas(SpriteAtlas spriteAtlas, bool sameFrame) { atlasCols = spriteAtlas.atlasCols; atlasRows = spriteAtlas.atlasRows; frameEndBehavior = spriteAtlas.frameEndBehavior; frameHeight = spriteAtlas.frameHeight; frameOffsetH = spriteAtlas.frameOffsetH; frameOffsetV = spriteAtlas.frameOffsetV; frames = spriteAtlas.frames; frameSpeed = spriteAtlas.frameSpeed; frameWidth = spriteAtlas.frameWidth; if (sameFrame) { frame = spriteAtlas.frame; } sprite = spriteAtlas.sprite; sprite.rectSrc.Width = frameWidth; sprite.rectSrc.Height = frameHeight; sprite.rectDest.Width = frameWidth * this.sprite.scaleX; sprite.rectDest.Height = frameHeight * this.sprite.scaleY; }
protected virtual void OnFrameEnd(RenderTimer timer) { FrameEnd?.Invoke(this, new FrameStageEventArgs(timer)); }
/// <summary> /// Update the animation. /// </summary> public void Update(float dt) { if (IsPaused) { return; } if (wantToChangedTag != null) { ReallySetTag(wantToChangedTag, wantToChangedTagReverseMode); wantToChangedTag = null; wantToChangedTagReverseMode = false; } if (wantToSetFrameIndexFlag) { SetFrameImmediately(wantToSetFrameIndex); } if (dt == 0) { return; } if (dt < 0) { throw new Exception($"{nameof(dt)} must be positive"); } if (currentTag == null) { throw new Exception("not set tag yet"); } string currentExecuteTagName = currentTag.Name; // invoke .... if (isNeedStartToCallFrameAction) { FrameBegin?.Invoke(currentExecuteTagName, CurrentFrameIndex); isNeedStartToCallFrameAction = false; } if (currentTag.loopTime) { var lastFrame = CurrentFrameIndex; ElapsedTimeMoveFrame_LoopMode(CurrentFrameIndex, TimeElapsed, dt, out var beginFrameList, out var endFrameList); foreach (var itemIndex in beginFrameList) { FrameBegin?.Invoke(currentExecuteTagName, itemIndex); } foreach (var itemIndex in endFrameList) { FrameEnd?.Invoke(currentExecuteTagName, itemIndex); } if (beginFrameList.Count > 0) { CurrentFrameIndex = beginFrameList[beginFrameList.Count - 1]; } // add the remain .... TimeElapsed += dt; } else { var lastFrameIndex = currentTag.Frames.Count - 1; if (CurrentFrameIndex == lastFrameIndex && TimeElapsed > currentTag.Duration) { // do nothing ... } else { var curFrame = CurrentFrameIndex; ElapsedTimeMoveFrame_NoLoopMode(CurrentFrameIndex, TimeElapsed, dt, out var beginFrameList, out var endFrameList); foreach (var itemIndex in beginFrameList) { FrameBegin?.Invoke(currentExecuteTagName, itemIndex); } foreach (var itemIndex in endFrameList) { FrameEnd?.Invoke(currentExecuteTagName, itemIndex); } // add the remain .... if (beginFrameList.Count > 0) { CurrentFrameIndex = beginFrameList[beginFrameList.Count - 1]; } TimeElapsed += dt; } } }
/// <summary> /// Raises the <see cref="FrameEnd"/> event. /// </summary> protected virtual void OnFrameEnd() => FrameEnd?.Invoke(this);
/// <summary> /// Sets the behavior of the animation at the end of the frame. /// Examples are to continue from the first frame, or reverse animation. /// </summary> /// <param name="endBehavior">The end behavior (see FrameEnd enum).</param> public void SetEndBehavior(FrameEnd endBehavior) { frameEndBehavior = endBehavior; }