Столкновение с твёрдым объектом

223
16 июля 2017, 09:38

Есть у меня два объекта, у которых имеется свой Rectangle
Как проверить что они столкнулись я знаю:

if(obj1.rect.Intersects(obj2.rect))
{
    ...
}

Теперь мне нужно сделать, чтобы при столкновении первый объект останавливался, как если бы упёрся в стенку
Допустим, у меня 2 прямоугольника, мне нужно просто проверять с какой стороны произошло столкновение? Пробовал делать так:

if(obj1.rect.Intersects(obj2.rect))
{
    if(obj1.Position.X >= obj2.rect.Width - obj2.Position.X)
        obj1.Position.X -= obj1.Speed;
}

Но при столкновении obj1 всё равно немного проходит сквозь obj2 Как сделать, чтобы obj1 сразу же упирался в obj2?

Answer 1

Как-то так. Не тестировал, но идея должна быть понятна:

if (obj1.rect.Intersects(obj2.rect))
{
    // Используем функцию Intersect из System.Drawing, которой нет в Monogame.
    var overlap = System.Drawing.Rectangle.Intersect(
        new System.Drawing.Rectangle(obj1.Position.X, obj1.Position.Y, obj1.rect.Width, obj1.rect.Height),
        new System.Drawing.Rectangle(obj2.Position.X, obj2.Position.Y, obj2.rect.Width, obj2.rect.Height)
        );
    if (overlap.Width < overlap.Height) 
    {
        // По оси X нужен меньший скачок, будем двигать по ней.
        if (obj1.Speed.X > 0) // obj1 движется вправо
            obj1.Position.X = obj2.Position.X - obj1.rect.Width;
        else                  // obj1 движется влево
            obj1.Position.X = obj2.Position.X + obj2.rect.Width;
    }
    else
    {
        // Будем двигать по оси Y.
        if (obj1.Speed.Y > 0) // obj1 движется вниз
            obj1.Position.Y = obj2.Position.Y - obj1.rect.Height;
        else                  // obj1 движется вверх
            obj1.Position.Y = obj2.Position.Y + obj2.rect.Height;
    }
}
READ ALSO
В чем суть генерации классов, которые являются копией по полям тех, что используются в сервисе WCF?

В чем суть генерации классов, которые являются копией по полям тех, что используются в сервисе WCF?

Когда я создаю ServiceReference генерируются partial классы, которые являются точной копией по полям классов, которые использует сервисЯ не нашел никакой...

220
Правильно оформить try / catch

Правильно оформить try / catch

Добрый день, недавно начал очень часто сталкиваться с конструкциями try / catch, обычно оформляю их так:

363
Ошибка при попытке удалить объект через Entiy

Ошибка при попытке удалить объект через Entiy

Не получается удалить объект с использованием EntityЕсть проект ASP

237
Как правильно забрать cookies проставленные в тесте используя jsdom?

Как правильно забрать cookies проставленные в тесте используя jsdom?

Я использую jsdom В тесте я проставил cookiesКак правильно забрать cookies? Если сделать так window

231