我正在使用C#在XNA中构建2D游戏,我正在使用sprite来跟踪玩家的位置并在spritebatch.Draw()方法中进行相应的旋转。我现在正在尝试实现每像素碰撞检测,我相信精灵的旋转会将其抛弃。碰撞检查如下。
private bool collision(Rectangle object1, Color[,] dataA, Rectangle object2, Color[,] dataB)
{
if (object1.Bottom < object2.Top)
return perPixel(object1, dataA, object2, dataB);
if (object1.Top > object2.Bottom)
return perPixel(object1, dataA, object2, dataB);
if (object1.Left > object2.Right)
return perPixel(object1, dataA, object2, dataB);
if (object1.Right < object2.Left)
return perPixel(object1, dataA, object2, dataB);
return true;
}
private bool perPixel(Rectangle object1, Color[,] dataA, Rectangle object2, Color[,] dataB)
{
//Bounds of collision
int top = Math.Max(object1.Top, object2.Top);
int bottom = Math.Min(object1.Bottom, object2.Bottom);
int left = Math.Max(object1.Left, object2.Left);
int right = Math.Min(object1.Right, object2.Right);
//Check every pixel
for (int y = top; y < bottom; y++)
{
for (int x = left; x < right; x++)
{
Color colourA = dataA[x, y];
Color colourB = dataB[x, y];
if (colourA.A != 0 && colourB.A != 0)
{
return true;
}
}
}
return false;
}
如果有帮助的话,只会检查其中一组被检查的精灵。
答案 0 :(得分:0)
当我在旋转的sprited上进行碰撞检测时,我遇到了一个非常类似的问题。 我基本上做的是旋转以sprite为角度的矩形角度theta,这里theta是spriteBatch.Draw()的旋转参数中传递的角度
我所说的非常天真的实现。
for each X in RectangleofSpriteToBeRotated{
for each Y in RectangleofSpriteToBeRotated{
Vector2 temp = Vector2.Transform(PointXY, Matrix.CreateRotationZ(Theta));
//Save Point Temp in a new 2D Array
}
}
如果你/我不明白我在说什么,那么请评论,我会尽力详细说明。
更新: 你应该尝试这样做,我假设第二个精灵应该旋转,我没有运行此代码
private bool collision(Rectangle object1, Color[,] dataA, Rectangle object2, Color[,] dataB)
{
var RotatedP0= new Vector2.Transform( new Vector2( object2.Top,object2.Left ),Matrix.CreateRotationZ(theta));
var RotatedP1= new Vector2.Transform( new Vector2 (object2.Bottom,object2.Right),Matrix.CreateRotationZ(theta ) );
if (object1.Bottom < RotatedP0.Y)
return perPixel(object1, dataA, object2, dataB);
if (object1.Top > RotatedP1.Y)
return perPixel(object1, dataA, object2, dataB);
if (object1.Left > RotatedP1.X)
return perPixel(object1, dataA, object2, dataB);
if (object1.Right < RotatedP0.X)
return perPixel(object1, dataA, object2, dataB);
return true;
}
private bool perPixel(Rectangle object1, Color[,] dataA, Rectangle object2, Color[,] dataB)
{
//Bounds of collision
int top = Math.Max(object1.Top, object2.Top);
int bottom = Math.Min(object1.Bottom, object2.Bottom);
int left = Math.Max(object1.Left, object2.Left);
int right = Math.Min(object1.Right, object2.Right);
//Check every pixel
for (int y = top; y < bottom; y++)
{
for (int x = left; x < right; x++)
{
Color colourA = dataA[x, y];
Vector2 v = Vector2.Transform(new Vector2(x,y), Matrix.CreateRotationZ(theta));
Color colourB = dataB[ (int) v.X, (int) v.Y];
if (colourA.A != 0 && colourB.A != 0)
{
return true;
}
}
}
return false;
}