我正在制作平台游戏,我有32x32精灵和32x32拼贴。
我还使用了一个tile引擎,它通过数组生成地图。
我使用RectangleHelper.cs
来修复与瓷砖和播放器的碰撞,到目前为止,它可以与瓷砖的顶部以及瓷砖的左侧碰撞。
在图1中,我显示“ On Top Of ”碰撞工作正常。没有错误或任何东西。
在图2中,我正在显示“左侧碰撞”,这也很有效。
但是在图3中,你可以看到角色是浮动的。这是因为碰撞矩形以某种方式延伸了几个像素,这就是其中一个问题,我似乎找不到任何答案。
在图片4中,我试图从拉伸的碰撞矩形的右侧发生碰撞,最后我跳回到墙上的时间为1-2帧,所以我无法对其进行截屏,但是这也是其中一个问题。
继承我的RectangleHelper.cs
,它来自youtube上的“ oyyou9 ”教程中的瓷砖碰撞引擎,对他而言,一切正常。
另外,如果我碰到一个块的底部,我的角色就会消失。
public static class RectangleHelper
{
public static bool TouchTopOf(this Rectangle r1, Rectangle r2)
{
return (r1.Bottom >= r2.Top - 1 &&
r1.Bottom <= r2.Top + (r2.Height / 2) &&
r1.Right >= r2.Left + (r2.Width / 5) &&
r1.Left <= r2.Right - (r2.Width / 5));
}
public static bool TouchBottomOf(this Rectangle r1, Rectangle r2)
{
return (r1.Top <= r2.Bottom + (r2.Height / 5) &&
r1.Top >= r2.Bottom - 1 &&
r1.Right >= r2.Left + (r2.Width / 5) &&
r1.Left <= r2.Right - (r2.Width / 5));
}
public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
{
return (r1.Right <= r2.Right &&
r1.Right >= r2.Left - 5&&
r1.Top <= r2.Bottom - (r2.Width / 4) &&
r1.Bottom >= r2.Top + (r2.Width / 4));
}
public static bool TouchRightOf(this Rectangle r1, Rectangle r2)
{
return (r1.Left >= r2.Left &&
r1.Left <= r2.Right &&
r1.Top <= r2.Bottom - (r2.Width / 4) &&
r1.Bottom >= r2.Top + (r2.Width / 4));
}
}
正如你在这里看到的那样,有很多随机值,在视频中,他并没有真正说出他们的好处,只是我可能需要调整它以适应我的游戏。
我的播放器类中的碰撞方法:
public void Collision(Rectangle newRectangle, int xOffset, int yOffset)
{
if (rectangle.TouchTopOf(newRectangle))
{
rectangle.Y = newRectangle.Y - rectangle.Height;
velocity.Y = 0f;
hasJumped = false;
}
if (rectangle.TouchLeftOf(newRectangle))
{
position.X = newRectangle.X - rectangle.Width * 2;
}
if (rectangle.TouchRightOf(newRectangle))
{
position.X = newRectangle.X + newRectangle.Width +1;
}
if (rectangle.TouchBottomOf(newRectangle))
{
velocity.Y = 1f;
}
}
使用RectangleHelper.cs
来修复碰撞。
答案 0 :(得分:0)
我不确定碰撞检查代码中所有这些随机值是做什么的,所以我认为这可能会解决您的问题:
public static bool TouchTopOf(this Rectangle r1, Rectangle r2)
{
return (r1.Bottom >= r2.Top - 1 &&
r1.Bottom <= r2.Top + (r2.Height / 2) &&
r1.Right >= r2.Left &&
r1.Left <= r2.Right);
}
public static bool TouchBottomOf(this Rectangle r1, Rectangle r2)
{
return (r1.Top <= r2.Bottom + (r2.Height / 2) &&
r1.Top >= r2.Bottom - 1 &&
r1.Right >= r2.Left &&
r1.Left <= r2.Right );
}
public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
{
return (r1.Right <= r2.Right &&
r1.Right >= r2.Left &&
r1.Top <= r2.Bottom &&
r1.Bottom >= r2.Top);
}
public static bool TouchRightOf(this Rectangle r1, Rectangle r2)
{
return (r1.Left >= r2.Left &&
r1.Left <= r2.Right &&
r1.Top <= r2.Bottom &&
r1.Bottom >= r2.Top);
}
并改变这一点:
if (rectangle.TouchLeftOf(newRectangle))
{
position.X = newRectangle.X - rectangle.Width * 2;
}
对此:
if (rectangle.TouchLeftOf(newRectangle))
{
position.X = newRectangle.X - 1;
}
HTH。它在很大程度上对我有用。希望这将摆脱你的一些主要错误,但我只是想指出,你将学习的最好方法是自己调试。你可以开始的一种方法是按照你在图3中的方式设置所有内容,然后在rectangle.TouchTopOf()
条件中设置一个断点,看看是否返回true
,如果是,那么为什么它会返回{ {1}}显然它不应该是。
答案 1 :(得分:0)
public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
{
return (r1.Left <= r2.Right &&
r1.Right >= r2.Right - 5 &&
r1.Top <= r2.Bottom - (r2.Width / 4) &&
r1.Bottom >= r2.Top + (r2.Width / 4));
}
答案 2 :(得分:0)
public static bool TouchRightOf(this Rectangle r1, Rectangle r2)
{
return (r1.Right >= r2.Left &&
r1.Left <= r2.Left - 5 &&
r1.Top <= r2.Bottom - (r2.Width / 4) &&
r1.Bottom >= r2.Top + (r2.Width / 4));
}