예제 #1
0
파일: gamemain.cs 프로젝트: imiyu/DiscUsage
        /// <summary>
        /// Update the splash screen.
        /// </summary>
        public void UpdateSplash()
        {
            // Calculate the upper-left corner of the splash screen image
            int x = (graphics.ScreenWidth - splash.Width) >> 1;
            int y = (graphics.ScreenHeight - splash.Height) >> 1;

            // The source region is the entire image
            src.X      = 0;
            src.Y      = 0;
            src.Width  = splash.Width;
            src.Height = splash.Height;

            // Draw the splash screen
            graphics.DrawBitmap(x, y, src, splash);

            // Flip the back buffers
            graphics.Flip();

            // Store the tick at which this frame started
            Timer.Stopwatch sw        = new Timer.Stopwatch();
            Int64           startTick = sw.CurrentTick();

            // Draw the splash screen
            graphics.DrawBitmap(x, y, src, splash);

            // Draw a "Loading" message as this might take a while
            graphics.DrawText(graphics.ScreenWidth >> 1,
                              graphics.ScreenHeight - 50,
                              "Loading...",
                              Color.White, ui.Font, FontDrawOptions.DrawTextCenter);

            // Flip the back buffers
            graphics.Flip();

            if (!introLoaded)
            {
                LoadIntro();
            }

            // delay if the splash screen hasn't been up long enough
            while (sw.DeltaTimeMilliseconds(sw.CurrentTick(), startTick)
                   < TotalSplashTime * 1000.0F)
            {
                Thread.Sleep(0);
            }

            mode = ModeSwitch.UpdateIntro;
        }
예제 #2
0
파일: gamemain.cs 프로젝트: imiyu/DiscUsage
        /// <summary>
        /// Start the game.  This method loads the game resources and
        /// runs the main game loop.
        /// </summary>
        public void Run()
        {
            // Load and validate the splash screen
            splash = graphics.CreateBitmap(GetFullPath(@"Data\Splash\splash.bmp"), false);
            Debug.Assert(splash != null,
                         "GameMain.Run: Failed to initialized splash screen");
            Debug.Assert(splash.Width <= graphics.ScreenWidth &&
                         splash.Height <= graphics.ScreenHeight,
                         "GameMain.Run: Splash screen has invalid dimensions");

            // Load the game ui now because it has font information that is
            // needed for drawing the 'Loading...' tag
            DataSet dsUI = new DataSet();

            Debug.Assert(dsUI != null,
                         "GameMain.LoadLevel: Failed to initialize UI DataSet");

            dsUI.Locale = CultureInfo.InvariantCulture;

            // Load the ui xml file
            dsUI.ReadXml(GetFullPath(@"Data\UI\ui.xml"));

            // Load the resources specified in the xml file
            ui = new UserInterface(dsUI, graphics, level);
            Debug.Assert(ui != null,
                         "GameMain.LoadLevel: Failed to initialize UI");

            // Set the current update method as the splash screen updater
            update = new UpdateDelegate(UpdateSplash);

            // Loop until the game is done
            while (!done)
            {
                // Switch the update delegate if a switch was requested.
                switch (mode)
                {
                case ModeSwitch.UpdateLevel:
                    gi.ClearKeyPresses();
                    update    = new UpdateDelegate(UpdateLevel);
                    numFrames = 0;
                    secondsElapsedForCurrentFrames = 0;
                    break;

                case ModeSwitch.UpdateCountdown:
                    intro.Dispose();
                    intro = null;
                    level.Update(gi);
                    update = new UpdateDelegate(UpdateCountdown);
                    break;

                case ModeSwitch.UpdateIntro:
                    LoadLevel();
                    update = new UpdateDelegate(UpdateIntro);
                    splash.Dispose();
                    splash = null;
                    break;
                }

                mode = ModeSwitch.None;

                // Store the tick at which this frame started
                Int64 startTick = sw.CurrentTick();

                // Check if the user pressed the exit key
                if (gi.KeyPressed((int)gi.HardwareKeys[Player.ButtonMap()[
                                                           (int)Player.Buttons.Quit]]))
                {
                    done = true;
                }
                else if (levelLoaded && (level.Done || gi.KeyPressed(
                                             (int)gi.HardwareKeys[Player.ButtonMap()[
                                                                      (int)Player.Buttons.ResetLevel]])))
                {
                    Reset();
                    Application.DoEvents();
                    continue;
                }

                // Update the game
                update();

                // Check for pending events from the OS
                Application.DoEvents();

                // Lock the framerate...
                Int64 deltaMS = sw.DeltaTimeMilliseconds(sw.CurrentTick(), startTick);
                Int64 minMS   = (Int64)(1000.0F * MinSecondsPerFrame);
                Int64 maxMS   = (Int64)(1000.0F * MaxSecondsPerFrame);

                // Check if the frame time was fast enough
                if (deltaMS <= minMS)
                {
                    // Loop until the frame time is met
                    do
                    {
                        if (gi.KeyPressed((int)gi.HardwareKeys[
                                              Player.ButtonMap()[(int)Player.Buttons.Quit]]))
                        {
                            done = true;
                            break;
                        }

                        // Thread.Sleep(0);
                        Application.DoEvents();
                        deltaMS = sw.DeltaTimeMilliseconds(sw.CurrentTick(),
                                                           startTick);
                    } while (deltaMS < minMS);
                }

                // Increment the number of frames
                numFrames++;
                // Increment the overall time for these frames
                if (deltaMS < maxMS)
                {
                    secondsElapsedForCurrentFrames += deltaMS / 1000.0F;
                }
                else
                {
                    secondsElapsedForCurrentFrames += maxMS / 1000.0F;
                }

                // Make sure enough time has elapsed since the last check
                if (level != null && secondsElapsedForCurrentFrames >
                    level.FrameRateCheckRate)
                {
                    currentSecondsPerFrame =
                        secondsElapsedForCurrentFrames / numFrames;
                    numFrames = 0;
                    secondsElapsedForCurrentFrames = 0;
                }
            }
        }