0

标题几乎总结了我的问题。我在 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 和 peaksRect 绘制到屏幕上。

4

2 回答 2

2

您可以查看此示例(如果您只关心绘制线条,请阅读示例),或者您可以尝试以下使用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);

只要确保抽奖顺序足够高。

于 2013-07-08T04:07:16.617 回答
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 的副本,该变量被创建为游戏类中的一个字段,因此它可以创建一次并在之后的任何时间使用。重要的是,纹理不是单一方法的本地纹理,并且每次调用它时都会创建纹理,而不是像那样被丢弃。

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

于 2013-07-08T04:32:28.047 回答