示例#1
0
        /**
         * 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();
        }