using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Lodestone.TestBed { public partial class MainWindow : Form { public class DemoHandle { public Type Demo; public Demo Create() { return (Demo)System.Activator.CreateInstance(Demo); } public override string ToString() { return Demo.Name; } } Demo currentDemo; public MainWindow() { InitializeComponent(); var types = System.Reflection.Assembly.GetExecutingAssembly().GetTypes(); var demos = types .Where(x => x.IsClass && x.IsSubclassOf(typeof(Demo))) .Select(x => new DemoHandle { Demo = x, }) .ToArray(); DemoSelector.Items.AddRange(demos); if (DemoSelector.Items.Count != 0) { DemoSelector.SelectedIndex = 0; } viewport.DrawableSurface.Invalidated += delegate(object sender, EventArgs e) { var scene = currentDemo.Draw(); viewport.DrawableSurface.FrameReset(); viewport.DrawableSurface.DrawScene(scene, viewport.Camera); viewport.DrawableSurface.SubmitDrawCalls(); }; viewport.DrawableSurface.BackgroundColor = new Blacklight.Core.Color(0, 123.0 / 255.0, 204.0 / 255.0); // To force an update, since the zoom was set through the designer and thus too soon to cause an update. viewport.Zoom = viewport.Zoom; } private void MainWindow_Load(object sender, EventArgs e) { } private void GameLoopTimer_Tick(object sender, EventArgs e) { viewport.DrawableSurface.Invalidate(); } private void DemoSelector_SelectedIndexChanged(object sender, EventArgs e) { var demoHandle = (DemoHandle)DemoSelector.SelectedItem; currentDemo = demoHandle.Create(); currentDemo.Initialize(); if(_currThread != null) { _currThread.Abort(); _currThread.Join(); _currThread = null; } _currThread = new System.Threading.Thread(delegate() { while (true) { var watch = new System.Diagnostics.Stopwatch(); watch.Start(); currentDemo.Step(1.0 / 60.0); var elapsed = watch.ElapsedTicks; timeLabel.BeginInvoke(new Action(() => { timeLabel.Text = "Elapsed MS: " + 1000.0 * elapsed / (double)System.Diagnostics.Stopwatch.Frequency; })); System.Threading.Thread.Sleep((int)Math.Max(0, 1000 / 60 - watch.ElapsedMilliseconds)); } }); _currThread.Start(); } private void DemoStartButton_Click(object sender, EventArgs e) { var demoHandle = (DemoHandle)DemoSelector.SelectedItem; currentDemo = demoHandle.Create(); currentDemo.Initialize(); } System.Threading.Thread _currThread = null; private void MainWindow_FormClosing(object sender, FormClosingEventArgs e) { _currThread.Abort(); _currThread.Join(); } } }