我目前无法使用边界框使精灵显得稳固。碰撞与下面的代码完全一致。
位置是地图上的主要角色位置。 character2是主角将与之碰撞的18 x 28精灵的名称。
当主角与character2精灵碰撞时,我已经尝试相应地调整位置(EX:Position.X - = 1;)但这只是将我的主精灵向后滑动直到它不相交。
我觉得这很简单,但对于我的生活,我无法弄明白。
总结我的问题:如何让character2精灵在碰撞时显得坚固?
此外,即使我的主精灵在碰撞时停止(通过将速度降低到0)它也会卡在那里,if语句进入无限循环。
float x1 = Position.X;
float y1 = Position.Y;
float x2 = x1 + character2.Width;
float y2 = y1 + character2.Height;
BoundingBox b1 = new BoundingBox(new Vector3(x1, y1, 0),
new Vector3(x2, y2, 0));
BoundingBox b2 = new BoundingBox(new Vector3(Position2.X, Position2.Y, 0),
new Vector3(x2, y2, 0));
if (Collision(b1, b2))
{
// ????
}
答案 0 :(得分:1)
这取决于你想要发生什么,但有一个建议是这样的......
if (HorizontalCollision(b1, b2))
{
xv = -xv;
}
else if (VerticalCollision(b1, b2))
{
yv = -yv;
}
Position2.X += xv;
Position2.Y += yv;
在这种情况下, xv
和yv
将是速度变量,并且当分别存在水平或垂直碰撞时,您只是简单地反转它们的方向。这将导致对象或角色逐字地反弹。
然后,您可以添加xv *= .99
和yv *= .99
,以便在每个渲染循环后减慢速度,模拟动量和摩擦力。当您使用这样的速度变量时,会打开很多不同的可能性。顺便说一句,这被称为Euler integration,并且对于动画来说非常有效。
答案 1 :(得分:0)
While(Collision(b1, b2))
{
Position.X -=1;
}
这就是你想要的吗? :P