12

この質問は以前に何度も聞かれたことを知っています。ただし、1時間以上のグーグル検索の後に見つけたすべてのソリューションは、本質的に同じものです. XNA でウィンドウのサイズを変更するには、次のコード行 (またはこれらのコード行のわずかなバリエーション) を Game1 クラスの Initiate() メソッドに追加するだけだと誰もが言います。

    //A lot of people say that the ApplyChanges() call is not necessary,
    //and equally as many say that it is.
    graphics.IsFullScreen = false;
    graphics.PreferredBackBufferWidth = 800;
    graphics.PreferredBackBufferHeight = 600;
    graphics.ApplyChanges();

これは私にはうまくいきません。コードはコンパイルおよび実行されますが、何も変わりません。GraphicsDevice および GraphicsDeviceManager クラスのドキュメントを精査してきましたが、上記以外のことを行う必要があることを示す情報を見つけることができませんでした。

また、XNA グラフィック カードの互換性に関する wiki エントリがしばらく更新されていないように見えますが、グラフィック カード (ATI HD 5870) で十分であると確信しています。

上記のグラフィックス カード、Visual C# 2010 Express、および最新バージョンの XNA を使用して、Windows 7 で実行しています。

だから、誰かが私がどこを台無しにしているかを見つけるのを手伝ってくれることを願っています. Game1 クラス全体 (名前を MainApp に変更) を以下に掲載します。募集されている他のクラスを見たい人がいたら、尋ねてください。投稿します。

public class MainApp : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    Player player;

    public MainApp()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }

    protected override void Initialize()
    {
        player = new Player();

        //This does not do ANYTHING
        graphics.IsFullScreen = false;
        graphics.PreferredBackBufferWidth = 800;
        graphics.PreferredBackBufferHeight = 600;
        graphics.ApplyChanges();

        base.Initialize();
    }

    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);

        Vector2 playerPosition = new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X,
                                             GraphicsDevice.Viewport.TitleSafeArea.Y
                                             + 2*(graphics.GraphicsDevice.Viewport.TitleSafeArea.Height / 3));
        player.Initialize(Content.Load<Texture2D>("basePlayerTexture"),
                          playerPosition);
    }

    protected override void UnloadContent()
    {
    }

    protected override void Update(GameTime gameTime)
    {
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();
       base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin();

        player.Draw(spriteBatch);

        spriteBatch.End();

        base.Draw(gameTime);
    }
}

PS これで C# を使用するのは 2 日目です。これが本当にばかげたエラーによるものである場合は、時間を無駄にして申し訳ありません。

4

2 に答える 2

40

(あなたが言うように)「多くの人がApplyChanges()呼び出しは必要ないと言い、同じくらい多くの人が必要だと言っています」というのはイライラします-問題の事実は、あなたが何をしているかに依存するということですそして、あなたがそれをしている場所!

(これをすべて知るにはどうすればよいですか?私はそれを実装しました。参照:この回答。)


ゲームの起動時に初期解像度を設定する場合:

コンストラクターでこれを行います(明らかに、名前を変更する場合は、名前を変更Game1したコンストラクターで行います!)

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        graphics.PreferredBackBufferHeight = 600;
        graphics.PreferredBackBufferWidth = 800;
    }

    // ...
}

中には触れないInitialize()でください!そして、電話しないApplyChanges()でください。

Game.Run()呼び出されると (既定のテンプレート プロジェクトでは で呼び出されますProgram.cs)、 が呼び出されるGraphicsDeviceManager.CreateDeviceに初期表示を設定するために呼び出されます。これが、 を作成し、ゲーム クラスのコンストラクター ( の前に呼び出される) で目的の設定を設定する必要がある理由です。 Initialize()GraphicsDeviceManagerGame.Run()

で解像度を設定しようとするInitializeと、グラフィック デバイスが 2 回設定されます。悪い。

(正直言って、これが混乱を招くことに驚いています。これは、デフォルトのプロジェクト テンプレートで提供されているコードです!)


ゲームの実行中に解像度を変更する場合:

ゲームのどこかに「解像度の選択」メニューを表示し、(たとえば) そのメニューのオプションをクリックしたユーザーに応答したい場合は、(そのときだけ) を使用する必要がありますApplyChanges。内からのみ呼び出す必要がありますUpdate。例えば:

public class Game1 : Microsoft.Xna.Framework.Game
{
    protected override void Update(GameTime gameTime)
    {
        if(userClickedTheResolutionChangeButton)
        {
            graphics.IsFullScreen = userRequestedFullScreen;
            graphics.PreferredBackBufferHeight = userRequestedHeight;
            graphics.PreferredBackBufferWidth = userRequestedWidth;
            graphics.ApplyChanges();
        }

        // ...
    }

    // ...
}

ToggleFullScreen()最後に、次のことと同じであることに注意してください。

graphics.IsFullScreen = !graphics.IsFullScreen;
graphics.ApplyChanges();
于 2012-07-02T02:51:58.473 に答える
1

私のコンピューターのデフォルトのGraphicsDevice.Viewport幅と高さは 800x480 です。1024x768 のように、それ以上のサイズを設定してみてください。

graphics.PreferredBackBufferHeight = 768;
graphics.PreferredBackBufferWidth = 1024;
graphics.ApplyChanges();

上記のコードはInitialize、ウィンドウを拡大するのに十分でした。

于 2012-07-01T16:25:16.390 に答える