简体   繁体   English

如何在xna中摆脱纵向不必要的黑色方块?

[英]how can I get rid of the unnecessary black squares in portrait orientation in xna?

I have an image and I got it set so that the only orientation supported is portrait by using: 我有一个图像,我设置它,以便支持的唯一方向是肖像使用:

graphics.SupportedOrientations = DisplayOrientation.Portrait; on the game1() method 在game1()方法上

How can I get rid of the black boxes on the upper and lower edges of the screen? 如何摆脱屏幕上下边缘的黑框?

This is what it looks like: 这就是它的样子:

在此输入图像描述

Ignore that 29, it's my fps monitor. 忽略那个29,这是我的fps监视器。

Before orientation was changed: 在改变方向之前:

在此输入图像描述

After it was changed: 改变之后:

在此输入图像描述

This is my code. 这是我的代码。 You'll notice a lot of arrays and adding and stuff, I be using it for something else. 你会注意到很多数组和添加内容,我会用它来做别的事情。 Right now, I'm not really using it: 现在,我并没有真正使用它:

    Texture2D mineField;

    Vector2 mineFieldLocation,
        numFontLocation;

    int[] fieldPos = new int[9];

    float[]
        minePosX = new float[9],
        minePosY = new float[9];

    SpriteFont numFont;

    int posAdder = 45,
        index = 0;

    Random randMinePos = new Random();

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

        graphics.SupportedOrientations = DisplayOrientation.Portrait;

       graphics.IsFullScreen = true;

        // Frame rate is 30 fps by default for Windows Phone.
        TargetElapsedTime = TimeSpan.FromTicks(333333);

        // Extend battery life under lock.
        InactiveSleepTime = TimeSpan.FromSeconds(1);
    }

    /// <summary>
    /// Allows the game to perform any initialization it needs to before starting to run.
    /// This is where it can query for any required services and load any non-graphic
    /// related content.  Calling base.Initialize will enumerate through any components
    /// and initialize them as well.
    /// </summary>
    protected override void Initialize()
    {
        // TODO: Add your initialization logic here


        // le sumo o resto a la x o y 45 para que caiga en el mismo medio del cuadrado
        mineFieldLocation = new Vector2(30, 70);

        numFontLocation = new Vector2(33, 65);

        for (int i = 0; i < fieldPos.Length; i++)
        {
            fieldPos[i] = posAdder;

            posAdder += 45;                
        }

        for (int i = 0; i < fieldPos.Length; i++)
        {
            minePosX[i] = fieldPos[randMinePos.Next(0, 9)];
            minePosY[i] = fieldPos[randMinePos.Next(0, 9)];
        }

        base.Initialize();
    }

    /// <summary>
    /// LoadContent will be called once per game and is the place to load
    /// all of your content.
    /// </summary>
    protected override void LoadContent()
    {
        // Create a new SpriteBatch, which can be used to draw textures.
        spriteBatch = new SpriteBatch(GraphicsDevice);

        mineField = Content.Load<Texture2D>("Minesweeper");

        numFont = Content.Load<SpriteFont>("NumberFont");

        // TODO: use this.Content to load your game content here
    }

    /// <summary>
    /// UnloadContent will be called once per game and is the place to unload
    /// all content.
    /// </summary>
    protected override void UnloadContent()
    {
        // TODO: Unload any non ContentManager content here
    }

    /// <summary>
    /// Allows the game to run logic such as updating the world,
    /// checking for collisions, gathering input, and playing audio.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        // TODO: Add your update logic here

        base.Update(gameTime);
    }

    /// <summary>
    /// This is called when the game should draw itself.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();

        spriteBatch.Draw(mineField, mineFieldLocation, Color.White);

        spriteBatch.DrawString(numFont, "1", numFontLocation, Color.Green);

       // spriteBatch.DrawString(numFont, "0", new Vector2(minePosX[index],minePosY[index]), Color.Black);

        if (index < 8)
        {
            index++;
        }

        spriteBatch.End();

        // TODO: Add your drawing code here

        base.Draw(gameTime);
    }
}

As I said in my comment, you'll need to set the preferred width and height but I'll explain why.. 正如我在评论中所说,你需要设置首选的宽度和高度,但我会解释为什么..

First off, the documentation for SupportedOrientations states 首先, SupportedOrientations的文档说明

Gets or sets the display orientations that are available if automatic rotation and scaling is enabled. 获取或设置启用自动旋转和缩放时可用的显示方向。

Which I didn't believe you did have enabled (not sure if it is by default). 我不相信你确实启用了(不确定它是否默认)。 Following on from this there is a see also link on this page for Automatic Rotation and Scaling which drops lots of hints about setting the width and height... 继此之后还有一个参见此页面上的自动旋转和缩放链接,它提供了许多关于设置宽度和高度的提示......

If you then looked at your third image it kind of makes sense that that is needed as your current height looks to be what your width was, which leads me to believe that your current width is now what your previous height was. 如果你再看一下你的第三张图片,那就有必要了,因为你当前的高度看起来像你的宽度,这让我相信你现在的宽度现在是你之前的高度。 So to be sure I'd set both 所以要确定我会设置两者

when in portrait-only mode, you need to swap the values for width and height of your back-buffer: 在仅纵向模式下,您需要交换后缓冲区的宽度和高度值:

//For 480x800 (90* rotated wp7 device)
Graphics.PreferredBackBufferWidth = 480;
Graphics.PreferredBackBufferHeight = 800;

You were rendering a 800x480 backbuffer on a 480x800 screen. 您正在480x800屏幕上渲染800x480后备缓冲区。 This causes it to letterbox. 这导致它成为信箱。

Might also interest you: 也许你会感兴趣:
XNA - Get Current Screen Resolution XNA - 获取当前屏幕分辨率
XNA: get screen's width and height XNA:获取屏幕的宽度和高度

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM