【问题标题】:How can I draw both Texture2Ds thats in a list in XNA?如何在 XNA 的列表中绘制两个 Texture2D?
【发布时间】:2015-12-04 16:26:08
【问题描述】:

我有一个名为 blockTexture 的 Texture2D 列表,其中包含 2 个元素。

我用下面这行来画第一个元素

foreach (Vector2 blockPosition in blockPositions)
 spriteBatch.Draw(blockTexture[0], blockPosition, Color.White);

blockPosition 列表是在随机位置显示元素

我可以让它同时绘制两个元素吗?

如果我将 blockTexture[0] 更改为 blockTexture[1],它会绘制第二个元素。但我需要它同时绘制两者。

我该怎么做?

编辑:

Texture2D personTexture;
// The images will be drawn with this SpriteBatch
SpriteBatch spriteBatch;
// Person 
Vector2 personPosition;
const int PersonMoveSpeed = 5;

List<Vector2> blockPositions = new List<Vector2>();
float BlockSpawnProbability = 0.01f;
const int BlockFallSpeed = 2;

List<Texture2D> blockTexture = new List<Texture2D>();

Random random = new Random();

受保护的覆盖 void LoadContent() {

        blockTexture.Add(Content.Load<Texture2D>("Block"));
        blockTexture.Add(Content.Load<Texture2D>("right"));

        // Load textures
      // blockTexture = Content.Load<Texture2D>("Block");
       personTexture = Content.Load<Texture2D>("Person");
       //rightTexture = Content.Load<Texture2D>("Right");

        //Load the score font
        font = Content.Load<SpriteFont>("gameFont");

        // Create a sprite batch to draw those textures
        spriteBatch = new SpriteBatch(graphics.GraphicsDevice);
    }

    protected override void Update(GameTime gameTime)
    {
        // Get input
        KeyboardState keyboard = Keyboard.GetState();
        GamePadState gamePad = GamePad.GetState(PlayerIndex.One);

        // Spawn new falling blocks 
        if (random.NextDouble() < BlockSpawnProbability)
        {
            float x = (float)random.NextDouble() * (Window.ClientBounds.Width - blockTexture[0].Width);
            blockPositions.Add(new Vector2(x, -blockTexture[0].Height));
       }

        // Get the bounding rectangle of the person
        Rectangle personRectangle =
            new Rectangle((int)personPosition.X, (int)personPosition.Y,
            personTexture.Width, personTexture.Height);

        // Update each block
        personHit = false;
        for (int i = 0; i < blockPositions.Count; i++)
        {
            // Animate this block falling
            blockPositions[i] =
                new Vector2(blockPositions[i].X, blockPositions[i].Y + BlockFallSpeed);

             // Get the bounding rectangle of this block
                Rectangle sprite =
                    new Rectangle((int)blockPositions[i].X, (int)blockPositions[i].Y,
                    blockTexture[0].Width, blockTexture[0].Height);


                // check collision with person
                if (personRectangle.Intersects(sprite))
                    personHit = true;
                // Remove this block if it have fallen off the screen
                if ((blockPositions[i].Y > Window.ClientBounds.Height))
                {
                    blockPositions.RemoveAt(i);
                    // When removing a block, the next block will have the same index
                    // as the current block. Decrement i to prevent skipping a block.
                    i--;
                }
            }

            base.Update(gameTime);
        }

在抽奖环节:

foreach (Vector2 blockPosition in blockPositions)
            {
                //foreach (Texture2D blocktexture in blockTexture)
               //spriteBatch.Draw(blockTexture[1], blockPosition, Color.White);
                for (int i = 0; i < blockPositions.Count; i++ )
                {
                    spriteBatch.Draw(blockTexture[i], blockPositions[i], Color.White);


                }

【问题讨论】:

    标签: c# xna xna-4.0


    【解决方案1】:

    尝试在 foreach 循环中按顺序显式绘制两者:

    foreach (Vector2 blockPosition in blockPositions)
    {
        spriteBatch.Draw(blockTexture[0], blockPosition, Color.White);
        spriteBatch.Draw(blockTexture[1], blockPosition, Color.White);
    }
    

    或者你的意思是你想在blockPositions[0]blockTexture[1]blockPositions[1] 绘制blockTexture[0]?在这种情况下:

    for (int i = 0; i < blockPositions.Length; i++)
    {
        spriteBatch.Draw(blockTexture[i], blockPositions[i], Color.White);
    }
    

    【讨论】:

    • 感谢您的评论,但在这种情况下,它只会绘制底部的元素,即 blockTexture[1]。
    • 我刚看到你的编辑。当它运行时它确实有效,直到两个对象都到达屏幕结束,然后新的开始下降,并且它停止运行游戏给出一个错误说参数超出范围异常..你知道我该如何解决这个问题吗?
    • 我必须查看更多代码才能调试该问题。
    • 我认为这是因为 blockPositions 和 blockTexture 的大小不同。我写了一些代码。如果你能帮我解决这个问题,我将不胜感激。我只需要这两个不同的对象落在不同的位置。
    • 这样就行了,好吧。如果blockTextureblockPositions 短,第二个代码块将崩溃。
    猜你喜欢
    • 2011-10-09
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2013-12-07
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多