У меня возникла проблема, что всякий раз, когда я касаюсь земли, моя скорость устанавливается на 0. Это происходит потому, что моя функция, которая выталкивает меня, толкает меня точно к краю. Поэтому, когда я делю на высоту блока, он все еще думает, что я в этом блоке. Это также происходит, когда я прыгаю к самой правой стене.
пример:
там есть блок с координатами 0,720 и мой у = 723
723/5 = 144 (округлено в меньшую сторону)
тогда меня выталкивают на 720. но потом, когда я делю на высоту блока, он все еще думает, что касаюсь блока на 720, пока не скажем 725
720/5 = 144
Как я могу это исправить, я имею в виду, что я знаю, в чем проблема, но я не вижу способа ее исправить.
Также, когда я не прыгаю и точно на правом краю уровня, я могу пройти через стену, пройдя вправо, но как только я прыгаю, обнаруживается обнаружение столкновений.
Я понятия не имею, почему и как возникает эта последняя проблема, может кто-нибудь взглянуть и посмотреть, что происходит.
Код:
void DoCollisions()
{
onGround = false;
Position.Y += Velocity.Y;
Vector2 tileCollision = GetTileCollision();
if (tileCollision.X != -1 || tileCollision.Y != -1)
{
onGround = true;
Vector2 collisionDepth = CollisionRectangle.DepthIntersection(
new Rectangle(
tileCollision.X * World.tileEngine.TileWidth,
tileCollision.Y * World.tileEngine.TileHeight,
World.tileEngine.TileWidth,
World.tileEngine.TileHeight
)
);
Velocity.Y = 0;
Position.Y += collisionDepth.Y;
}
Position.X += Velocity.X;
tileCollision = GetTileCollision();
if (tileCollision.X != -1 || tileCollision.Y != -1)
{
Vector2 collisionDepth = CollisionRectangle.DepthIntersection(
new Rectangle(
tileCollision.X * World.tileEngine.TileWidth,
tileCollision.Y * World.tileEngine.TileHeight,
World.tileEngine.TileWidth,
World.tileEngine.TileHeight
)
);
Velocity.X = 0;
Position.X += collisionDepth.X;
}
}
Vector2 GetTileCollision()
{
int topLeftTileX = (int)(CollisionRectangle.TopLeft.X / World.tileEngine.TileWidth);
int topLeftTileY = (int)(CollisionRectangle.TopLeft.Y / World.tileEngine.TileHeight);
int BottomRightTileX = (int)(CollisionRectangle.DownRight.X / World.tileEngine.TileWidth);
int BottomRightTileY = (int)(CollisionRectangle.DownRight.Y / World.tileEngine.TileHeight);
for (int i = topLeftTileX; i <= BottomRightTileX; i++)
{
for (int j = topLeftTileY; j <= BottomRightTileY; j++)
{
if (World.tileEngine.TileIsSolid(i, j))
{
return new Vector2(i,j);
}
}
}
return new Vector2(-1,-1);
}