【问题标题】:Use PNG as Background Map with collision detection使用 PNG 作为具有碰撞检测的背景图
【发布时间】:2015-05-25 13:30:37
【问题描述】:

我必须制作一个类似吃豆人的游戏,我尝试了很多次,但我无法让它工作。这是我所做的:

这是地图。我不希望发生碰撞的任何地方都是透明的。

这是吃豆子精灵。当然也是透明的。

这是我的地图代码:

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;

所以我认为它应该可以工作,但是不行!这一切都搞砸了:

在这里,它在碰撞检测中返回 false,就像它应该的那样。 但是一旦我上升一点:

它已经返回 true(检测到碰撞)。为什么??怎么可能,我做错了什么? 谢谢!

【问题讨论】:

  • 你能在'return true'上设置一个断点并检查坐标和颜色值吗?
  • 哪个坐标?颜色值真的很奇怪,当然,它们会使更新方法上的所有内容都滞后。但它们发生了巨大的变化,从 0,0,0,0 变为应该发生碰撞的颜色。
  • x&y 值。碰撞颜色是否符合预期(黄色和蓝色)?
  • 会不会是检查了错误的 pac 形状? (您可以为每个形状创建一个具有不同颜色的 pac-map 来测试它并查看碰撞的 pac 颜色..)
  • 不要使用像素碰撞,使用简单的盒子碰撞。无需像素碰撞,在您的情况下浪费资源。

标签: c# xna background-image collision-detection alpha


【解决方案1】:

问题是我的代码正在检查矩形的左上角,而我正在通过矩形的中心,这弄乱了整个代码。还是谢谢!

【讨论】:

    猜你喜欢
    • 2019-05-22
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多