我的GraphicsDeviceManager的IsFullScreen无法使用XNA

时间:2014-03-24 15:56:57

标签: c# visual-studio-2010 visual-studio-2012 xna fullscreen

我回来和XNA一起玩游戏,但是我遇到了一个问题。 当我使用IsFullScreen中的GraphicsDeviceManager并将其放入游戏构造函数中的true时,我的游戏不会全屏显示,而是停留在窗口。

我查找了IsFullScreen的值,当我在Game构造函数中时,它的值为true,但是当我查看Update或{{中的值时1}} valoue是假的。

当我按Draw时,我试图将值设为true,但没有任何改变。 我还尝试使用FToggleFullScreen的值发生了很大变化但没有发生任何事情。 我尝试设置IsFullScreen宽度和高度,然后我需要使用PreferredBackBuffer,并且每次调用ApplyChanges时都会将IsFullScreen放到false。即使它改变了窗口大小,它也不是全屏,所以不是我想要的。

这是我的代码,如果您看到任何内容,请告诉我,欢迎任何建议。

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace MyGames
{
  /// <summary>
  /// This is the main type for your game
  /// </summary>
  public class SpaceInvader : Game
  {
    private readonly GraphicsDeviceManager graphics_;
    private KeyboardState oldKeyboardState_;
    private KeyboardState newKeyboardState_;
    private SpriteBatch spriteBatch_;
    private Ship playerShip_;

    public SpaceInvader()
    {
      graphics_ = new GraphicsDeviceManager(this);
      Content.RootDirectory = "Content";
      // Set device frame rate to 60 fps.
      TargetElapsedTime = TimeSpan.FromSeconds(1 / 60.0);
      graphics_.PreferredBackBufferWidth = 480;
      graphics_.PreferredBackBufferHeight = 268;
    }

    protected override void Initialize()
    {
      playerShip_ = new Ship(new Vector2(Window.ClientBounds.Width / 2, Window.ClientBounds.Height - 150), new Vector2(10,10));
      base.Initialize();
    }

    protected override void LoadContent()
    {
      // Create a new SpriteBatch, which can be used to draw textures.
      spriteBatch_ = new SpriteBatch(GraphicsDevice);
      playerShip_.LoadContent(Content);
    }

    protected override void UnloadContent()
    {
      // TODO: Unload any non ContentManager content here
    }

    protected override void Update(GameTime gameTime)
    {
      newKeyboardState_ = Keyboard.GetState();
      // Allows the game to exit
      if (newKeyboardState_.IsKeyDown(Keys.Escape))
        Exit();

      // TODO: Add your update logic here
      playerShip_.Update(Window, newKeyboardState_, oldKeyboardState_);

      base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
      if (oldKeyboardState_.IsKeyDown(Keys.F) && newKeyboardState_.IsKeyUp(Keys.F))
        graphics_.ToggleFullScreen();
      graphics_.GraphicsDevice.Clear(Color.CornflowerBlue);
      //set rendering back to the back buffer

      // Draw the sprite.
      spriteBatch_.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
      playerShip_.Draw(spriteBatch_);
      spriteBatch_.End();

      base.Draw(gameTime);
      oldKeyboardState_ = newKeyboardState_;
    }
  }
}

我正在使用Windows 7和VisualStudio Ultimate 2012。

EDIT1: 我刚刚尝试使用VisualStudio 2010,它运行良好。

我还注意到我以前遇到的另一个问题,在Program.cs中我无法使用:

 using (SpaceInvader game = new SpaceInvader())
 {
   game.Run();
 }

我需要改为使用:

SpaceInvader game = new SpaceInvader();
game.Run();

我不知道它是否正在改变某些东西,但它会在第二个支撑上抛出异常NullReferenceException was unhandled

EDIT2: 我在download page of XNA上看到它允许我使用VisualStudio 2010,但它不是在讨论VisualStudio 2012。 在阅读these kind of pages之后,我认为它运行不正常是正常的,因为我没有做任何类似安装XNA的事情。

我认为这是VS2012的问题。

3 个答案:

答案 0 :(得分:0)

哈哈。小错误,您需要添加:this.graphics.ApplyChanges();。我曾做过同样的事情。 了解每次想要更改内容时都需要这样做,在调用之前不会有任何更改。

答案 1 :(得分:0)

我打算关闭主题,因为我说要使用XNA,你需要使用VS2010。

我在XNA的下载页面上看到,它允许我使用VisualStudio 2010,但它不是在谈论VisualStudio 2012.在阅读这些页面之后,我想它是不正常的,因为它运行不正常,因为我没有做任何类似安装XNA的事情。

我认为这是VS2012的问题。

答案 2 :(得分:-4)

尝试以下代码,而不是切换bool:

isFullscreen() = true;