Следующий код — моя попытка помешать ПК (персонажу игрока) пройти через NPC.
- Оператор if проверяет, пересекаются ли два прямоугольника (BoundingBox).
- CollisionBox определяет область перекрывающихся BoundingBox.
- moveDir определяет изменение вектора, которое ПК будет претерпевать после оператора if (например: если moveDir=(2,0) ПК переместится на два пикселя вправо)
- currentSpeed определяет значение, присваиваемое moveDir.X или moveDir.Y в зависимости от ввода с клавиатуры (вверх, вниз, влево, вправо)
Код:
if (PC.charSprite.BoundingBox.Intersects(npc.charSprite.BoundingBox))
{
Rectangle collisionBox = Rectangle.Intersect(PC.charSprite.BoundingBox, npc.charSprite.BoundingBox);
if (PC.moveDir.X > 0) //Moving Right
{
//Unknown Code Goes Here
}
else if (PC.moveDir.X < 0) //Moving Left
{
}
else if (PC.moveDir.Y > 0) //Moving Down
{
}
else if (PC.moveDir.Y < 0) //Moving Up
{
}
}
Как мне сделать так, чтобы, когда персонаж касается NPC, персонаж переставал двигаться в этом направлении, но мог двигаться в любом из трех других направлений?
Код, который я пробовал:
if (PC.moveDir.X > 0) //Moving Right
{
PC.moveDir = Vector2.Zero;
}
else if (PC.moveDir.X < 0) //Moving Left
{
PC.moveDir = Vector2.Zero;
}
else if (PC.moveDir.Y > 0) //Moving Down
{
PC.moveDir = Vector2.Zero;
}
else if (PC.moveDir.Y < 0) //Moving Up
{
PC.moveDir = Vector2.Zero;
}
^ Это блокирует компьютер на месте, предотвращая любое движение.
if (PC.moveDir.X > 0) //Moving Right
{
PC.moveDir.X = 0;
}
else if (PC.moveDir.X < 0) //Moving Left
{
PC.moveDir.X = 0;
}
else if (PC.moveDir.Y > 0) //Moving Down
{
PC.moveDir.Y = 0;
}
else if (PC.moveDir.Y < 0) //Moving Up
{
PC.moveDir.Y = 0;
}
^ Это также блокирует компьютер на месте.
if (PC.moveDir.X > 0) //Moving Right
{
PC.moveDir.X = -currentspeed;
}
else if (PC.moveDir.X < 0) //Moving Left
{
PC.moveDir.X = currentspeed;
}
else if (PC.moveDir.Y > 0) //Moving Down
{
PC.moveDir.Y = -currentspeed;
}
else if (PC.moveDir.Y < 0) //Moving Up
{
PC.moveDir.Y = currentspeed;
}
^ Это работает с ужасными перебоями. Я надеялся, что изменение moveDir в направлении, противоположном тому, на сколько он перекрывается (или больше), удержит ПК на краю NPC, но предотвратит перекрытие. К сожалению, в половине случаев ПК застревает на месте.
Сочетание двух
if (PC.moveDir.X > 0) //Moving Right
{
PC.moveDir.X = -currentspeed;
PC.moveDir.X = 0;
}
else if (PC.moveDir.X < 0) //Moving Left
{
PC.moveDir.X = currentspeed;
PC.moveDir.X = 0;
}
else if (PC.moveDir.Y > 0) //Moving Down
{
PC.moveDir.Y = -currentspeed;
PC.moveDir.Y = 0;
}
else if (PC.moveDir.Y < 0) //Moving Up
{
PC.moveDir.Y = currentspeed;
PC.moveDir.Y = 0;
}
Просто вызывает общую блокировку.
if (PC.moveDir.X > 0) //Moving Right
{
PC.moveDir.X = -collisionBox.Width;
}
else if (PC.moveDir.X < 0) //Moving Left
{
PC.moveDir.X = collisionBox.Width;
}
else if (PC.moveDir.Y > 0) //Moving Down
{
PC.moveDir.Y = -collisionBox.Height;
}
else if (PC.moveDir.Y < 0) //Moving Up
{
PC.moveDir.Y = collisionBox.Height;
}
^Это почти работает идеально, но когда персонаж оказывается напротив NPC и поворачивается перпендикулярно к NPC, которого касается, персонаж отскакивает в сторону. Опять же, примерно в половине случаев.
Попытка вдохновлена комментарием CSJ:
if (PC.charSprite.BoundingBox.Intersects(npc.charSprite.BoundingBox))
{
Rectangle collisionBox = Rectangle.Intersect(PC.charSprite.BoundingBox, npc.charSprite.BoundingBox);
if (PC.moveDir.X > 0) //Moving Right
{
PC.charSprite.Position = new Vector2(npc.charSprite.BoundingBox.Left - 34, PC.charSprite.Position.Y);
}
else if (PC.moveDir.X < 0) //Moving Left
{
PC.charSprite.Position = new Vector2(npc.charSprite.BoundingBox.Right + 2, PC.charSprite.Position.Y);
}
else if (PC.moveDir.Y > 0) //Moving Down
{
PC.charSprite.Position = new Vector2(PC.charSprite.Position.X, npc.charSprite.BoundingBox.Top - 34);
}
else if (PC.moveDir.Y < 0) //Moving Up
{
PC.charSprite.Position = new Vector2(PC.charSprite.Position.X, npc.charSprite.BoundingBox.Bottom + 2)
}
}
Я снова спрашиваю: как мне сделать так, чтобы, когда персонаж прикасается к NPC, персонаж переставал двигаться в этом направлении, но мог двигаться в любом из трех других направлений?
Или, говоря более общим языком, как сделать так, чтобы один прямоугольник, пересекающийся с другим прямоугольником, потерял способность двигаться к пересекаемому прямоугольнику, не препятствуя его движению в любом другом направлении?