【问题标题】:Create walls in XNA在 XNA 中创建墙
【发布时间】:2013-01-04 06:17:30
【问题描述】:

所以我正在使用 C# 在 XNA 中创建一个游戏,并且我在随机位置创建了墙壁,并且我试图阻止它们穿过它们/当它们击中它们时被传送到屏幕上的点。 (注意,左右现在有效,只是上下)

if (collision(wallRect[k], wallColours, pacmanRect, pacmanColor, 0))
//Collision works, not an issue here
{
    if (pacmanRect.Bottom > wallRect[k].Top && pacmanRect.Top < wallRect[k].Bottom)
    {
        if (pacmanRect.Right >= wallRect[k].Left  
            && pacmanRect.Right < wallRect[k].Right)
        {
            pacmanPos.X = wallRect[k].X - frameSize.X; 
            //frameSize is the size of the pacman sprite
        }                                
        else if (pacmanRect.Left <= wallRect[k].Right 
                  && pacmanRect.Left > wallRect[k].Left)
        {
            pacmanPos.X = wallRect[k].X + frameSize.X / 8;
        }
    }
    else if (pacmanRect.Right > wallRect[k].Left && pacmanRect.Left < wallRect[k].Right)
    {
        if (pacmanRect.Bottom >= wallRect[k].Top)
        {
            pacmanPos.Y = wallRect[k].Y - frameSize.Y / 8;
        }                  
        else if (pacmanRect.Top <= wallRect[k].Bottom)
        {
             pacmanPos.Y = wallRect[k].Y + frameSize.Y / 8;
        }
   }
   playSound(collisionSoundInstance);
}

这是游戏循环中 pacmanPos 更新的最后一点。那么如何才能让墙壁成为真正的墙壁,而你不能穿过它们呢?

【问题讨论】:

  • 我不明白这是什么问题。你有问题吗?代码不起作用吗?如果它不起作用,您希望它做什么而不是做什么?您可以使用调试器遍历代码吗?
  • 希望能帮助解决这个问题。它只是没有按照我的期望或我想要的那样做。
  • 如果你想保留自己的代码,你应该解释它是如何工作的,什么是 frameSize?碰撞方法是什么?
  • 那么您期望或希望它做什么?请非常具体。想让它“阻止东西穿墙”还不够具体。
  • 好吧,我打算使用一种方法,如果在正方形的某个边缘检测到碰撞,则移动精灵使其与正方形对齐,即如果它在左边,它被移动到 wallrect[k].X - frameSize.X

标签: c# xna collision


【解决方案1】:
if (pacmanRect.Bottom > wallRect[k].Top && pacmanRect.Top < wallRect[k].Bottom)

这有意义吗?我认为 Pacman 不可能在墙的顶部上方,但同时在墙的底部下方(除非您的 y 坐标系在向下方向上为正,即使这样,逻辑仍然看起来很可疑)

我建议您在纸上画出其中一种状态,然后根据您在纸上看到的内容逐行在脑海中查看您的代码。例如,绘制 Pacman 的最底部边缘与墙的最顶部边缘重叠的状态。然后浏览您的代码,看看会发生什么。

【讨论】:

  • 标准XNA坐标系是Y向下增加,X向右增加。这是对的,因为它是说pacman的底部需要低于墙的顶部,而pacman的顶部需要高于墙的底部。如果 pacman 精灵位于墙壁精灵的左侧或右侧,它基本上是在提供信息。但是,它与 OR 配合使用效果更好,因为“滑倒”似乎更少,所以如果你靠近某个角落,pacman 不会跳得那么多。
【解决方案2】:

如果您的游戏仅限于二维,您应该使用Box2D,这会让您的生活更轻松。

如果您想保留自己的代码,请查看评论

【讨论】:

  • 评论:我知道答案没有回答问题,但我认为他可以通过这种方式解决这个问题。
  • 我个人不会推荐/使用 Box2D,除非我有一些我不想自己写的好的物理要求。使用 Box2D 之类的东西会提供一些应用程序和学习开销,这可能比你自己编写基本的碰撞检测要大,这当然取决于你的游戏要求。
  • 嗯,这是大学作业,我不允许使用外部引擎,所以它对我没有帮助,但其他人可能会觉得它有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多