我想让每个方面的平台对象都是实体,这样玩家就无法通过它。我认为最简单的想法是使用以前的位置"变量。特别是使用 Intersects()方法(我喜欢它)!
如果玩家相交,则移动到最后位置。但没有任何反应。我很可能无法弄清楚如何实施适当的"之前的位置"。
这是我在课堂上的所有内容:
public void Collision(Sprite obj)
{
Vector2 previousPosition = this.Position;
if (this.Bounds.Intersects(obj.Bounds))
{
this.Position = previousPosition;
}
}
Player和Platform继承具有此属性的Sprite类:
public Rectangle Bounds
{
get
{
return new Rectangle((int)Position.X, (int)Position.Y,
Texture.Width, Texture.Height);
}
}
我尝试的另一个想法是使用bool isSolid ,但我不知道如何使用逻辑。 我搜索并尝试了网上的事情(包括stackoverflow)可能需要4-5个小时。这应该是如此简单,但我无法理解!
答案 0 :(得分:0)
答案很简单。看一下previousPosition,你就会发现问题。我会解释这个问题。
X是我当前的X•上一个X是我之前的X• •我在X轴向前移动,因此X增加1 •x现在为1 •prev X现在是x(所以它基本上是1)
x命中对象,因此x变为= prev X
所以基本上x每当它检查它是否击中目标时就会变成它自己。
解决方案1。 在移动之前将 previousPosition 变量设置为 currentPosition ,因此 currentPosition 值会发生变化且 previousPosition 不同于每次 currentPosition 。
简而言之就是订单
编辑: 您提供的代码执行此操作:
PreviousPosition = this.Position;
this.Position = currentPosition;
第一行是正确的,但碰撞功能中的第二行需要更改为
this.Position = previousPosition;
如果这不起作用,还有另一种解决方案。此致,Tuukka。