使用 PNG 作为带碰撞检测的背景图
Use PNG as Background Map with collision detection
我必须制作一个 pacman-like 游戏,我尝试了很多次,但我无法让它运行。这是我所做的:
这是地图。我不想发生碰撞的地方都是透明的。
这是吃豆子精灵。当然也是透明的。
这是我的地图代码:
mapTexture = Content.Load<Texture2D("11074582_10203478069210715_531544477_n");
mapPosition = new Vector2(0, 0);
mapRectangle = new Rectangle((int)mapLeftPosition.X, (int)mapLeftPosition.Y, 800, 500);
spriteBatch.Draw(mapTexture, mapPosition, mapRectangle, Color.White);
还有我的 Pacman 代码:
pacmanSprite = Content.Load<Texture2D>("pacman");
pacmanPosition = new Vector2((width / 2), height / 2);
pacmanOrigin = new Vector2(pacmanAnimatedRectangle.Width / 2, pacmanAnimatedRectangle.Height / 2);
pacmanAnimatedRectangle = new Rectangle(currentFrame.X * frameSize.X, currentFrame.Y * frameSize.Y, frameSize.X, frameSize.Y);
spriteBatch.Draw(pacmanSprite, pacmanPosition, pacmanAnimatedRectangle, Color.White, rotation, pacmanOrigin, 1f, SpriteEffects.None, 0);
以及我用来检查是否存在碰撞的代码:
private bool IntersectsPixel()
{
Color[] colorData1 = new Color[pacmanSprite.Width * pacmanSprite.Height]; //Get every pixel of the sprite
Color[] colorData2 = new Color[mapTexture.Width * mapTexture.Height];
pacmanSprite.GetData<Color>(colorData1);
mapTexture.GetData<Color>(colorData2);
int top = Math.Max(pacmanAnimatedRectangle.Top, mapRectangle.Top); //Get the square of both sprites
int bottom = Math.Min(pacmanAnimatedRectangle.Bottom, mapRectangle.Bottom);
int left = Math.Max(pacmanAnimatedRectangle.Left, mapRectangle.Left);
int right = Math.Min(pacmanAnimatedRectangle.Right, mapRectangle.Right);
for (int y = top; y < bottom; y++)
{
for (int x = left; x < right; x++)
{
Color A = colorData1[(y - pacmanAnimatedRectangle.Top) * (pacmanAnimatedRectangle.Width) + (x - pacmanAnimatedRectangle.Left)];
Color B = colorData2[(y - mapRectangle.Top) * (mapRectangle.Width) + (x - mapRectangle.Left)];
if (A.A != 0 && B.A != 0) //if collision spot is not transparent return true
{
return true;
}
}
}
return false;
所以我认为它应该可以,但是不行!一切都搞砸了:
这里 returns 碰撞检测是错误的,就像它应该的那样。
但是一旦我上升一点点:
它已经 returns 为真(检测到碰撞)。为什么??怎么可能,我做错了什么?
谢谢!
问题是我的代码正在检查矩形中的左上角,而我正在通过矩形的中心,这弄乱了整个代码。还是谢谢了!
我必须制作一个 pacman-like 游戏,我尝试了很多次,但我无法让它运行。这是我所做的:
这是地图。我不想发生碰撞的地方都是透明的。
这是吃豆子精灵。当然也是透明的。
这是我的地图代码:
mapTexture = Content.Load<Texture2D("11074582_10203478069210715_531544477_n");
mapPosition = new Vector2(0, 0);
mapRectangle = new Rectangle((int)mapLeftPosition.X, (int)mapLeftPosition.Y, 800, 500);
spriteBatch.Draw(mapTexture, mapPosition, mapRectangle, Color.White);
还有我的 Pacman 代码:
pacmanSprite = Content.Load<Texture2D>("pacman");
pacmanPosition = new Vector2((width / 2), height / 2);
pacmanOrigin = new Vector2(pacmanAnimatedRectangle.Width / 2, pacmanAnimatedRectangle.Height / 2);
pacmanAnimatedRectangle = new Rectangle(currentFrame.X * frameSize.X, currentFrame.Y * frameSize.Y, frameSize.X, frameSize.Y);
spriteBatch.Draw(pacmanSprite, pacmanPosition, pacmanAnimatedRectangle, Color.White, rotation, pacmanOrigin, 1f, SpriteEffects.None, 0);
以及我用来检查是否存在碰撞的代码:
private bool IntersectsPixel()
{
Color[] colorData1 = new Color[pacmanSprite.Width * pacmanSprite.Height]; //Get every pixel of the sprite
Color[] colorData2 = new Color[mapTexture.Width * mapTexture.Height];
pacmanSprite.GetData<Color>(colorData1);
mapTexture.GetData<Color>(colorData2);
int top = Math.Max(pacmanAnimatedRectangle.Top, mapRectangle.Top); //Get the square of both sprites
int bottom = Math.Min(pacmanAnimatedRectangle.Bottom, mapRectangle.Bottom);
int left = Math.Max(pacmanAnimatedRectangle.Left, mapRectangle.Left);
int right = Math.Min(pacmanAnimatedRectangle.Right, mapRectangle.Right);
for (int y = top; y < bottom; y++)
{
for (int x = left; x < right; x++)
{
Color A = colorData1[(y - pacmanAnimatedRectangle.Top) * (pacmanAnimatedRectangle.Width) + (x - pacmanAnimatedRectangle.Left)];
Color B = colorData2[(y - mapRectangle.Top) * (mapRectangle.Width) + (x - mapRectangle.Left)];
if (A.A != 0 && B.A != 0) //if collision spot is not transparent return true
{
return true;
}
}
}
return false;
所以我认为它应该可以,但是不行!一切都搞砸了:
这里 returns 碰撞检测是错误的,就像它应该的那样。 但是一旦我上升一点点:
它已经 returns 为真(检测到碰撞)。为什么??怎么可能,我做错了什么? 谢谢!
问题是我的代码正在检查矩形中的左上角,而我正在通过矩形的中心,这弄乱了整个代码。还是谢谢了!