标题几乎总结了我的问题。我正处于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绘制到屏幕上。
答案 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),但是使用公共方法意味着可以在主游戏类之外调用它(而不是受精灵批处理的私有范围的限制)和纹理)。