Box2D - как предотвратить непрерывный прыжок рядом со стеной - PullRequest
0 голосов
/ 12 декабря 2011

Приветствую!

Я работаю над игрой для Android, которая использует Box2D для обнаружения столкновений и физики.Прямо сейчас я внедряю базовую платформерную систему.Прыжки на месте, но у них есть небольшой глюк.Следующая функция предназначена для определения, находится ли игрок на земле.Просто, правда?Ну, это работает хорошо, если только игрок не находится рядом со стеной, в этом случае он просто позволит ему постоянно подпрыгивать, так как функция все равно вернет true, даже если стена не находится непосредственно под игроком.

Я попытался добавить дополнительные x-проверки, чтобы убедиться, что я сталкиваюсь с чем-то, что находится прямо под мной, но безрезультатно.

private boolean isGrounded(float deltaTime) {               
    List<Contact> contactList = world.getContactList();

    for(int i = 0; i < contactList.size(); i++) {
        Contact contact = contactList.get(i);
        if(contact.isTouching() && (contact.getFixtureA() == sensorFixture ||
           contact.getFixtureB() == sensorFixture)) {               

            Vector2 pos = body.getPosition();
            WorldManifold manifold = contact.getWorldManifold();
            boolean below = true;
            Vector2 cpoint;
            for(int j = 0; j < manifold.getNumberOfContactPoints(); j++) {
                cpoint = manifold.getPoints()[j];
                below &= (
                            (cpoint.y < pos.y - 0.15f) 
                            && (cpoint.x > pos.x - w/2 + 3f)
                            && (cpoint.x < pos.x + w/2 - 3f)
                        );

                if(below) return true;
            }

            return false;
        }
    }
    return false;
}

Итак, есть ли у кого-нибудь указатели начто я могу сделать, чтобы проверка isGounded была более эффективной?

Заранее спасибо!:)

1 Ответ

1 голос
/ 13 декабря 2011

Я не знаком с Box2d, но моей первой мыслью было бы проверить ориентацию объекта, с которым вы контактируете.Быстрая проверка документации покажет вам, что в WorldManifold есть getNormal, который предоставляет локальную нормаль, которая указывает от fixtureA к fixtureB.Оттуда вы сравниваете ориентацию с осью X или Y, используя точечное произведение.Затем вы можете указать, насколько крутой поверхности вы хотите, чтобы игрок мог прыгать на.Вам может потребоваться преобразовать локальный нормальный в мировое пространство.

Источники:

Руководство Box2d Документы LibGDX
...