#if !XBOX360 // Project: EuroVernichter 3D, File: ScreenshotCapturer.cs // Namespace: XnaEngine.Game, Class: ScreenshotCapturer // Path: C:\code\EuroVernichter 3D\Engine\Game, Author: abi // Code lines: 176, Size of file: 4.62 KB // Creation date: 11/28/2006 10:03 PM // Last modified: 11/28/2006 10:04 PM // Generated with Commenter by abi.exDream.com #region Using directives using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using System; using System.Collections.Generic; using System.IO; using XnaGraphicEngine.Helpers; using XnaGraphicEngine.Graphics; #endregion namespace XnaGraphicEngine.Game { /// /// This is a game component that implements IUpdateable. /// public partial class ScreenshotCapturer : GameComponent { #region Variables /// /// Internal screenshot number (will increase by one each screenshot) /// private int screenshotNum = 0; /// /// Link to BaseGame class instance. Also holds windows title, /// which is used instead of Application.ProgramName. /// BaseGame game; #endregion #region Constructor /// /// Create screenshot capturer /// /// Set game public ScreenshotCapturer(BaseGame setGame) : base(setGame) { game = setGame; screenshotNum = GetCurrentScreenshotNum(); } // ScreenshotCapturer(setGame) #endregion #region Make screenshot #region Screenshot name builder /// /// Screenshot name builder /// /// Num /// String private string ScreenshotNameBuilder(int num) { return Directories.ScreenshotsDirectory + "\\" + game.Window.Title + " Screenshot " + num.ToString("0000") + ".jpg"; } // ScreenshotNameBuilder(num) #endregion #region Get current screenshot num /// /// Get current screenshot num /// /// Int private int GetCurrentScreenshotNum() { // We must search for last screenshot we can found in list using own // fast filesearch int i = 0, j = 0, k = 0, l = -1; // First check if at least 1 screenshot exist if (File.Exists(ScreenshotNameBuilder(0)) == true) { // First scan for screenshot num/1000 for (i = 1; i < 10; i++) { if (File.Exists(ScreenshotNameBuilder(i * 1000)) == false) break; } // for (i) // This i*1000 does not exist, continue scan next level // screenshotnr/100 i--; for (j = 1; j < 10; j++) { if (File.Exists(ScreenshotNameBuilder(i * 1000 + j * 100)) == false) break; } // for (j) // This i*1000+j*100 does not exist, continue scan next level // screenshotnr/10 j--; for (k = 1; k < 10; k++) { if (File.Exists(ScreenshotNameBuilder( i * 1000 + j * 100 + k * 10)) == false) break; } // for (k) // This i*1000+j*100+k*10 does not exist, continue scan next level // screenshotnr/1 k--; for (l = 1; l < 10; l++) { if (File.Exists(ScreenshotNameBuilder( i * 1000 + j * 100 + k * 10 + l)) == false) break; } // for (l) // This i*1000+j*100+k*10+l does not exist, we have now last // screenshot nr!!! l--; } // if (File.Exists) return i * 1000 + j * 100 + k * 10 + l; } // GetCurrentScreenshotNum() #endregion /// /// Make screenshot /// private void MakeScreenshot() { try { screenshotNum++; // Make sure screenshots directory exists if (Directory.Exists(Directories.ScreenshotsDirectory) == false) Directory.CreateDirectory(Directories.ScreenshotsDirectory); using (Texture2D dstTexture = new Texture2D( BaseGame.Device, BaseGame.Width, BaseGame.Height, 1, ResourceUsage.ResolveTarget, SurfaceFormat.Color, ResourceManagementMode.Manual)) { // Get data with help of the resolve method BaseGame.Device.ResolveBackBuffer(dstTexture); dstTexture.Save( ScreenshotNameBuilder(screenshotNum), ImageFileFormat.Jpg); } // using (dstTexture) } // try catch (Exception ex) { Log.Write("Failed to save Screenshot: " + ex.ToString()); } // catch (ex) } // MakeScreenshot() #endregion #region Update /// /// Allows the game component to update itself. /// /// Provides a snapshot of timing values. public override void Update(GameTime gameTime) { if (Input.KeyboardKeyJustPressed(Keys.PrintScreen)) MakeScreenshot(); base.Update(gameTime); } // Update(gameTime) #endregion } // class ScreenshotCapturer } // namespace XnaGraphicEngine.Game #endif