File Animation.cs
File List > Render > src > Animation.cs
Go to the documentation of this file.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
namespace Qkmaxware.Rendering {
public interface IAnimator {
void OnStart() {}
void OnEarlyUpdate(TimeSpan dt) {}
void OnUpdate(TimeSpan dt) {}
void OnLateUpdate(TimeSpan dt) {}
}
public abstract class AnimatedScene : IEnumerable<Color[,]> {
public Scene Scene;
public BaseCamera Camera {get; private set;}
protected abstract TimeSpan DeltaTime();
public AnimatedScene(Scene scene) : this(new PerspectiveCamera(new Size(640, 480)), scene) {}
public AnimatedScene(BaseCamera camera, Scene scene) {
this.Camera = camera;
this.Scene = scene;
}
public virtual IEnumerator<Color[,]> GetEnumerator() {
// First render
var initialObjects = Scene.OfType<IAnimator>();
foreach (var obj in initialObjects) {
obj.OnStart();
}
Camera.Render(Scene);
yield return Camera.PixelBuffer;
// Subsequent render loop
while(true) {
var objects = Scene.OfType<IAnimator>();
var dt = this.DeltaTime();
foreach (var obj in objects) {
obj.OnEarlyUpdate(dt);
}
foreach (var obj in objects) {
obj.OnUpdate(dt);
}
foreach (var obj in objects) {
obj.OnLateUpdate(dt);
}
Camera.Render(Scene);
yield return Camera.PixelBuffer;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
}
public class FixedFpsAnimatedScene : AnimatedScene {
public int FPS = 30;
public FixedFpsAnimatedScene(Scene scene, int fps = 30) : base(scene) {
this.FPS = fps;
}
public FixedFpsAnimatedScene(BaseCamera camera, Scene scene, int fps = 30) : base(camera, scene) {
this.FPS = fps;
}
protected override TimeSpan DeltaTime() {
return TimeSpan.FromSeconds(1.0/FPS);
}
}
public class RealtimeAnimatedScene : AnimatedScene {
public RealtimeAnimatedScene(Scene scene) : base(scene) {}
public RealtimeAnimatedScene(BaseCamera camera, Scene scene) : base(camera, scene) {}
private DateTime lastFrame = DateTime.Now;
protected override TimeSpan DeltaTime() {
var now = DateTime.Now;
var dt = now - lastFrame;
lastFrame = now;
return dt;
}
}
}