/** * Game render loop */ private void RenderLoop() { FloatColor clearColor = GameColor.DARK_GREY; GL.ClearColor(clearColor.red(), clearColor.blue(), clearColor.green(), 1f); // Set up main menu text GameFont menuItem = new GameFont("Start Game", GameColor.ORANGE); GameFont startGame = new GameFont("Press Space to Start Game", GameColor.YELLOW); Matrix4d scale = Matrix4d.CreateTranslation(new Vector3d(100, 0, 0)); //Might still need a scale() method Matrix4d target = new Matrix4d(); Camera camera = new Camera(window.GetWidth(), window.GetHeight()); camera.SetPosition(new Vector3d(-100, 0, 0)); shader = new Shader("shader"); double frameCap = 1.0 / 60; // 60 FPS double frameTime = 0; double time = GetTime(); double unprocessed = 0; SetState(State.GAME); // Set the game state SetLevel(0); // Set the starting level logicLoop = new Thread(() => LogicLoop()); // Run the logic in a separate thread logicLoop.Start(); window.CenterWindow(); // Center window on screen RenderLevel(); return; // Poll window while window isn't about to close while (run) { canRender = false; // Control frames per second { double timeNow = GetTime(); double elapsed = timeNow - time; unprocessed += elapsed; frameTime += elapsed; time = timeNow; } // Run all non-render related tasks while (unprocessed >= frameCap) { unprocessed -= frameCap; canRender = true; target = scale; window.Update(); if (frameTime >= 1.0) { frameTime = 0; } } // Render when scene changes if (canRender) { RenderLevel(); GL.Clear(ClearBufferMask.ColorBufferBit); if (state.Equals(State.GAME)) { gameState = true; shader.Bind(); shader.UpdateUniforms(camera, target); objectManager.RenderAll(); window.updateTimer(); window.RenderElements(); GetCurrentLevel().RenderLoop(); } else if (state.Equals(State.LEVEL_COMPLETE)) { GetCurrentLevel().SetActive(false); // Set level as inactive // If user has the level complete dialogue enabled if (levelCompleteDialogue) { gameState = false; shader.Bind(); shader.UpdateUniforms(camera, target); objectManager.RenderAll(); window.RenderElements(); // Add dark rectangle to make text more readable shader.Unbind(); GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); GL.Color4(clearColor.red(), clearColor.green(), clearColor.blue(), .5f); GL.Rect(-10f, -10f, 10f, 10f); Scene latestLevel = GetCurrentLevel(); menuItem.renderString("Congratulations!", Alignment.CENTER, 0.1f, 0.45f); menuItem.renderString("You've completed " + latestLevel.getName() + " in " + latestLevel.GetElapsedSeconds() + " seconds.", Alignment.CENTER, 0.02f, 0.2f); startGame.renderString("(Press Space to continue.)", Alignment.CENTER, -0.45f, 0.3f); } else { SetState(State.NEXT_LEVEL); } } else if (state.Equals(State.NEXT_LEVEL)) { gameState = false; NextLevel(); SetState(State.GAME); } if (!state.Equals(State.LEVEL_COMPLETE)) { // Fading shader.Unbind(); GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); if (fadeN > 0) { fadeN -= 2.5f; GL.Color4(clearColor.red(), clearColor.blue(), clearColor.green(), (float)System.Math.Sin(fadeN)); GL.Rect(-10f, -10f, 10f, 10f); } } window.SwapBuffers(); // Swap the render buffers } } SaveGame.writeData(); }