在XNA中绘制边界框

时间:2013-07-08 03:58:25

标签: c# xna

标题几乎总结了我的问题。我正处于2D碰撞的困难时期,所以我认为实际看到我正在使用的边界框会更容易。这样,我可以看到它是否与我的其他边界框相交。我正在检查一个玩家精灵和一组尖刺精灵。我想看看边​​界框。有没有相对这样做的简单方法(强调简单,因为我对XNA很新)?感谢任何帮助,谢谢!

以下是我的碰撞方法的示例代码......

protected bool Collide()
{
    if (!isRolling)
    {
        playerRect = new Rectangle((int)pos.X, (int)pos.Y, size.X, size.Y);
        spikesRect = new Rectangle((int)pos2.X, (int)pos2.Y, 65, 80);
        return playerRect.Intersects(spikesRect);
    }
    else
    {
        playerRect = new Rectangle((int)pos.X, (int)pos.Y + offset, 5, 5);
        spikesRect = new Rectangle((int)pos2.X, (int)pos2.Y, 65, 80);
        return playerRect.Intersects(spikesRect);
    }
}

所以我需要将playerRect和spikesRect绘制到屏幕上。

2 个答案:

答案 0 :(得分:2)

您可以查看此example(如果您只关心绘制线条,请阅读this),或者您可以尝试以下使用FillMode.WireFrame的代码。类似的东西:

spriteBatch.Begin(SpriteSortMode.Immediate,BlendState.Opaque);
RasterizerState state = new RasterizerState();
state.FillMode = FillMode.WireFrame;
spriteBatch.GraphicsDevice.RasterizerState = state;

//loop this for all sprites!
spriteBatch.Draw(sprite, position, Color.White);

spriteBatch.End();

根据您现在发布的代码,您在绘图代码中需要做的就是:

spriteBatch.Draw(playerTexture, playerRect, color);
//...
spriteBatch.Draw(spikesTexture, spikesRect, color);

确保绘制顺序足够高。

答案 1 :(得分:0)

创建单色1x1纹理,然后使用spriteBatch.Draw拉伸它,如果填充边界矩形:

Texture2D pixel;
public override void LoadContent()
{
pixel = new Texture2D(this.GraphicsDevice,1,1);
Color[] colourData = new Color[1];
colourData[0] = Color.White; //The Colour of the rectangle
pixel.SetData<Color>(colourData);

}

public void DrawRectangle(SpriteBatch spriteBatch, Rectangle bounds)
{
spriteBatch.Draw(pixel,bounds,Color.White);
}

这是一些非常混合的代码,但基本上必须创建一次纹理,最好是在游戏的加载内容方法中。这4行创建1像素的纹理和像素白色的颜色。 'this'指的是游戏本身,因为游戏总是保留其自己的GraphicsDevice的副本,该变量被创建为游戏类中的一个字段,因此它可以创建一次并在之后的任何时间使用。重要的是,纹理不是单个方法的局部,并且每次调用时都会创建纹理,因为纹理不会被设计为像这样抛弃。

第二种方法是可以调用以将矩形绘制到屏幕的公共方法。你可以简单地用它包含的单行替换对方法的调用(交换参数ofc),但是使用公共方法意味着可以在主游戏类之外调用它(而不是受精灵批处理的私有范围的限制)和纹理)。