Войти
ПрограммированиеФорумФизика

Box2D: Столкновения с платформами

#0
21:20, 9 ноя. 2013

Если координаты тела игрока(ноги) выше блока, тогда тело игрока может взаимодействовать с поверхностью, иначе проходит сквозь. Например я нахожусь под платформой, прыгаю и если крайняя нижняя точка тела игрока выше крайней верхней точки платформы, то столкновение происходит, иначе игрок проходит сквозь. Подобное было в контре на денди. Есть варианты как реализовать, постоянно изменяя маски битов, но вариант не самый лучший, может быть можно как-то по другому сделать, используя какие-нибудь стандартные свойства.


#1
21:40, 9 ноя. 2013

Вот почитай:)
http://www.learn-cocos2d.com/2013/08/physics-engine-platformer-terrible-idea/

#2
22:15, 9 ноя. 2013

Там, если я правильно понял предлагают постоянно удалять и создавать блоки? Но это не лучший вариант в моём случае. Меня больше интересует можно ли это сделать стандартным способом, например создать объект с таким свойством, чтобы с одной стороны его пересечь можно было, а с другой нет. А если такого нет, то костыль я всегда успею изобрести.

#3
3:21, 10 ноя. 2013

haper
> Вот почитай:)
> http://www.learn-cocos2d.com/2013/08/physics-engine-platformer-terrible-idea/
прочитал где-то половину статьи. удивительная некомпетенция удивительно пафосно выглядящего автора.

#4
14:19, 10 ноя. 2013

Suslik
ХЗ, чё он так против, вроде тоже какие-то там игры делал:)

#5
18:21, 10 ноя. 2013

Никто не подскажет? :)

#6
18:41, 10 ноя. 2013

в contact listener'е игнорируешь контакты игрока и энвайронмента, нормаль которых ориентирована вниз.

#7
19:18, 10 ноя. 2013

Suslik, как всегда дал дельный совет.

#8
21:10, 10 ноя. 2013

Suslik
> нормаль которых ориентирована вниз.
В какой-то момент игрока резко выбросит вверх из платформы, не?
Маскировать платформу нужно целиком, до полного выхода игрока из коллизии.

#9
21:12, 10 ноя. 2013

А если использовать фильтры столкновений?

#10
23:01, 10 ноя. 2013

RPGman
> В какой-то момент игрока резко выбросит вверх из платформы, не?
> Маскировать платформу нужно целиком, до полного выхода игрока из коллизии.
неа. игнорируешь контакты до тех пор, пока они не разойдутся.

#11
23:15, 10 ноя. 2013

Suslik
Куда будет ориентирован контакт, если условно центр объекта ближе к условному центру платформы?
Ресолвер коллизий помнит с каким вектором объект вошёл в платформу? (не придираюсь, не в курсе просто)

#12
0:32, 11 ноя. 2013

RPGman
смотри. предположим, что тело вошло в контакт с платформой. мы смотрим на нормаль контакта. если она направлена вверх, то считаем его как обычно. если она направлена вниз, то игнорируем все контакты платформы и тела до тех пор, пока они есть. мхм?

#13
1:03, 11 ноя. 2013

Suslik
> все контакты платформы и тела до тех пор, пока они есть. мхм?
Это и будет "маскировать платформу/игрока целиком".
Я тебя не так понял. Я понял как "игнорируешь _именно_ те контакты, которые ориентированы вниз".

#14
16:36, 11 ноя. 2013

Как-то так сделал:

class PlatformFilter : ContactFilter
    {
        public override bool ShouldCollide(Box2DX.Collision.Shape shape1, Box2DX.Collision.Shape shape2)
        {
            if (shape1.GetBody().GetLinearVelocity().Y < shape2.GetBody().GetLinearVelocity().Y)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
Ну и прописал это для мира, но вроде есть баг, когда игрок прыгает сбоку на платформу, и половина его тела пересекается с блоком, его отталкивает. Ещё не уверен, буду пробовать делать DebugDraw, на C# без костылей он не хочет работать (вообще не уверен, что это портировали).

ПрограммированиеФорумФизика

Тема в архиве.