private void FramerateIndependantLoop() { // update timer _time = _gameTime = FP.GetTimer(); FP._platformTime = (uint)_time - _platformTime; _updateTime = _time; FP.Elapsed = (_time - _last) / 1000.0f; if (FP.Elapsed > MaxElapsed) { FP.Elapsed = MaxElapsed; } FP.Elapsed *= FP.Timescale; _last = _time; // update console if (FP.Console != null) { FP.Console.Update(); } // update loop if (!Paused) { Update(); } // update input Input.Update(); // update timer _time = _renderTime = FP.GetTimer(); FP._updateTime = _time - _updateTime; // render loop if (!Paused) { Render(); } // update timer _time = _platformTime = FP.GetTimer(); FP._renderTime = _time - _renderTime; FP._gameTime = _time - _gameTime; }
private void Render() { var t = FP.GetTimer(); if (_frameLast == 0) { _frameLast = t; } // render loop FP.Screen.Clear(ClearColor); if (FP._world.Visible) { var view = new View(FP.Screen.DefaultView); view.Rotation = -FP.Camera.Angle; view.Zoom(FP.Camera.Zoom); // don't need to set the position FP.Screen.SetView(view); FP._world.Render(); } FP.Console.Render(); Draw.Render(); FP.Screen.Display(); // more timing stuff t = FP.GetTimer(); _frameList.Add(t - _frameLast); _frameListSum += t - _frameLast; if (_frameList.Count > 10) { _frameListSum -= _frameList[0]; _frameList.RemoveAt(0); } FP.Framerate = 1000 / ((float)_frameListSum / (float)_frameList.Count); _frameLast = t; }
/// <summary> /// Engine constructor /// </summary> /// <param name="width">The width of your game.</param> /// <param name="height">The height of your game.</param> /// <param name="framerate">The game framerate, in frames per second (default 60).</param> public Engine(uint width, uint height, float framerate = 60) { // Engine properties FP.Width = width; FP.Height = height; FP.Framerate = framerate; FP.Fixed = true; FP.TimeInFrames = false; // Globals FP.Tweener = new Tweener(); FP.Engine = this; FP.Screen = new RenderWindow(new VideoMode(FP.Width, FP.Height), ""); FP._world = new World(); FP.Camera = new Camera(); FP.Console = new Punk.Debugging.Console(); CheckWorld(); FP.Screen.Clear(); // Random FP.RandomizeSeed(); // Timing FP.Timer = new Stopwatch(); FP.Timer.Restart(); FP._time = (uint)FP.Timer.ElapsedMilliseconds; _frameList = new List <uint>(); FP.Timescale = 1; // Window events FP.Screen.Closed += new EventHandler(OnClosed); FP.Screen.GainedFocus += new EventHandler(OnFocusGained); FP.Screen.LostFocus += new EventHandler(OnFocusLost); Library.LoadEmbeddedAssets(); Input.Init(); // FIXME: Currently only FixedFramerateLoop is hooked up. // FIXME: Framerate independent loops may not be possible without timer callbacks like Flash has. _rate = 1000.0f / FP.Framerate; Init(); if (FP.Fixed) { _skip = _rate * (MaxFrameSkip + 1); _last = _prev = FP.GetTimer(); while (FP.Screen.IsOpen()) { FP.Screen.DispatchEvents(); FP.Screen.SetTitle(Math.Round(1000.0f / (FP._gameTime)).ToString()); FixedFramerateLoop(); } } else { _last = FP.GetTimer(); while (FP.Screen.IsOpen()) { FP.Screen.DispatchEvents(); FramerateIndependantLoop(); } } }
private void FixedFramerateLoop() { // update timer _time = FP.GetTimer(); _delta += (_time - _last); _last = _time; // quit if a frame hasn't passed if (_delta < _rate) { return; } // update timer _gameTime = _time; FP._platformTime = _time - _platformTime; // update console if (FP.Console != null) { FP.Console.Update(); } // update loop if (_delta > _skip) { _delta = _skip; } while (_delta >= _rate) { FP.Elapsed = _rate * FP.Timescale * 0.001f; // update timer _updateTime = _time; _delta -= _rate; _prev = _time; // update loop if (!Paused) { Update(); } // update input Input.Update(); // update timer _time = FP.GetTimer(); FP._updateTime = _time - _updateTime; } // update timer _renderTime = _time; // render loop if (!Paused) { Render(); } FP.Console.Render(); // update timer _time = _platformTime = FP.GetTimer(); FP._renderTime = _time - _renderTime; FP._gameTime = _time - _gameTime; }